diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b00a2ef6..46a27349d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ Please see [CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CO ### Added +* Experimental support for [Markdown](https://github.com/cucumber/common/blob/main/gherkin/MARKDOWN_WITH_GHERKIN.md) + ([#1645](https://github.com/cucumber/cucumber-js/pull/1645)) + ### Changed * Clarify that the JSON formatter will not be removed any time soon diff --git a/compatibility/cck_spec.ts b/compatibility/cck_spec.ts index 54c1e6abf..235f503d9 100644 --- a/compatibility/cck_spec.ts +++ b/compatibility/cck_spec.ts @@ -3,14 +3,17 @@ import { config, expect, use } from 'chai' import chaiExclude from 'chai-exclude' import glob from 'glob' import fs from 'fs' -import ndjsonParse from 'ndjson-parse' import path from 'path' -import { PassThrough } from 'stream' -import { Cli } from '../lib' +import { PassThrough, pipeline, Writable } from 'stream' +import { Cli } from '../src' import toString from 'stream-to-string' import { doesHaveValue, doesNotHaveValue } from '../src/value_checker' import { normalizeMessageOutput } from '../features/support/formatter_output_helpers' +import * as messages from '@cucumber/messages' +import * as messageStreams from '@cucumber/message-streams' +import util from 'util' +const asyncPipeline = util.promisify(pipeline) const PROJECT_PATH = path.join(__dirname, '..') const CCK_FEATURES_PATH = 'node_modules/@cucumber/compatibility-kit/features' const CCK_IMPLEMENTATIONS_PATH = 'compatibility/features' @@ -20,13 +23,15 @@ use(chaiExclude) describe('Cucumber Compatibility Kit', () => { glob.sync(`${CCK_FEATURES_PATH}/**/*.ndjson`).forEach((fixturePath) => { - const suiteName = /^.+\/(.+)\.ndjson$/.exec(fixturePath)[1] + const match = /^.+\/(.+)(\.feature(?:\.md)?)\.ndjson$/.exec(fixturePath) + const suiteName = match[1] + const extension = match[2] it(`passes the cck suite for '${suiteName}'`, async () => { const args = [ 'node', path.join(PROJECT_PATH, 'bin', 'cucumber-js'), ].concat([ - `${CCK_FEATURES_PATH}/${suiteName}/${suiteName}.feature`, + `${CCK_FEATURES_PATH}/${suiteName}/${suiteName}${extension}`, '--require', `${CCK_IMPLEMENTATIONS_PATH}/${suiteName}/${suiteName}.ts`, '--profile', @@ -45,10 +50,26 @@ describe('Cucumber Compatibility Kit', () => { stdout.end() const rawOutput = await toString(stdout) - const actualMessages = normalize(ndjsonParse(rawOutput)) - const expectedMessages = ndjsonParse( - fs.readFileSync(fixturePath, { encoding: 'utf-8' }) + const actualMessages = normalize( + rawOutput + .split('\n') + .filter((line) => line.trim() !== '') + .map((line) => JSON.parse(line)) ) + + const expectedMessages: messages.Envelope[] = [] + await asyncPipeline( + fs.createReadStream(fixturePath, { encoding: 'utf-8' }), + new messageStreams.NdjsonToMessageStream(), + new Writable({ + objectMode: true, + write(envelope: messages.Envelope, _: BufferEncoding, callback) { + expectedMessages.push(envelope) + callback() + }, + }) + ) + expect(actualMessages) .excludingEvery([ 'meta', diff --git a/compatibility/features/attachments/attachments.ts b/compatibility/features/attachments/attachments.ts index 1b9555017..e84bb71a8 100644 --- a/compatibility/features/attachments/attachments.ts +++ b/compatibility/features/attachments/attachments.ts @@ -1,4 +1,4 @@ -import { Before, When, World } from '../../..' +import { Before, When, World } from '../../../src' import { ReadableStreamBuffer } from 'stream-buffers' import fs from 'fs' import path from 'path' diff --git a/compatibility/features/data-tables/data-tables.ts b/compatibility/features/data-tables/data-tables.ts index 16781e2f4..e901273fa 100644 --- a/compatibility/features/data-tables/data-tables.ts +++ b/compatibility/features/data-tables/data-tables.ts @@ -1,4 +1,4 @@ -import { When, Then, DataTable } from '../../..' +import { When, Then, DataTable } from '../../../src' import { expect } from 'chai' When( diff --git a/compatibility/features/examples-tables/examples-tables.ts b/compatibility/features/examples-tables/examples-tables.ts index da89a7eec..e259bd958 100644 --- a/compatibility/features/examples-tables/examples-tables.ts +++ b/compatibility/features/examples-tables/examples-tables.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { Given, When, Then } from '../../..' +import { Given, When, Then } from '../../../src' Given('there are {int} cucumbers', function (this: any, initialCount: number) { this.count = initialCount diff --git a/compatibility/features/hooks/hooks.ts b/compatibility/features/hooks/hooks.ts index 8660be563..1ce001c6f 100644 --- a/compatibility/features/hooks/hooks.ts +++ b/compatibility/features/hooks/hooks.ts @@ -1,4 +1,6 @@ -import { When, Before, After } from '../../..' +import { When, Before, After, World } from '../../../src' +import fs from 'fs' +import path from 'path' Before(function () { // no-op @@ -19,3 +21,20 @@ After(function () { After('@some-tag or @some-other-tag', function () { throw new Error('Exception in conditional hook') }) + +After('@with-attachment', async function (this: World) { + await this.attach( + fs.createReadStream( + path.join( + process.cwd(), + 'node_modules', + '@cucumber', + 'compatibility-kit', + 'features', + 'hooks', + 'cucumber.svg' + ) + ), + 'image/svg+xml' + ) +}) diff --git a/compatibility/features/markdown/markdown.ts b/compatibility/features/markdown/markdown.ts new file mode 100644 index 000000000..f3a3063da --- /dev/null +++ b/compatibility/features/markdown/markdown.ts @@ -0,0 +1,25 @@ +import assert from 'assert' +import { Given, DataTable, Then, When, World } from '../../../src' + +Given('some TypeScript code:', function (dataTable: DataTable) { + assert(dataTable) +}) + +Given('some classic Gherkin:', function (gherkin: string) { + assert(gherkin) +}) + +When( + 'we use a data table and attach something and then {word}', + async function (this: World, word: string, dataTable: DataTable) { + await this.log('We are logging some plain text') + assert(dataTable) + if (word === 'fail') { + throw new Error('You asked me to fail') + } + } +) + +Then('this might or might not run', function () { + // no-op +}) diff --git a/compatibility/features/minimal/minimal.ts b/compatibility/features/minimal/minimal.ts index 2be7b5a78..bccc4f289 100644 --- a/compatibility/features/minimal/minimal.ts +++ b/compatibility/features/minimal/minimal.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { Given } from '../../..' +import { Given } from '../../../src' Given('I have {int} cukes in my belly', function (cukeCount: number) { assert(cukeCount) diff --git a/compatibility/features/parameter-types/parameter-types.ts b/compatibility/features/parameter-types/parameter-types.ts index 37a6a6cc9..8a5a57ed1 100644 --- a/compatibility/features/parameter-types/parameter-types.ts +++ b/compatibility/features/parameter-types/parameter-types.ts @@ -1,4 +1,4 @@ -import { Given, defineParameterType } from '../../..' +import { Given, defineParameterType } from '../../../src' import { expect } from 'chai' class Flight { diff --git a/compatibility/features/rules/rules.ts b/compatibility/features/rules/rules.ts index 05b7adb0b..629a15b34 100644 --- a/compatibility/features/rules/rules.ts +++ b/compatibility/features/rules/rules.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { Given, When, Then } from '../../..' +import { Given, When, Then } from '../../../src' Given( 'there are {int} {float} coins inside', diff --git a/compatibility/features/stack-traces/stack-traces.ts b/compatibility/features/stack-traces/stack-traces.ts index 6fb0b3e31..80d544c91 100644 --- a/compatibility/features/stack-traces/stack-traces.ts +++ b/compatibility/features/stack-traces/stack-traces.ts @@ -1,4 +1,4 @@ -import { When } from '../../..' +import { When } from '../../../src' When('a step throws an exception', function () { throw new Error('BOOM') diff --git a/compatibility/features/unknown-parameter-type/unknown-parameter-type.ts b/compatibility/features/unknown-parameter-type/unknown-parameter-type.ts index a7c1be050..e6611990c 100644 --- a/compatibility/features/unknown-parameter-type/unknown-parameter-type.ts +++ b/compatibility/features/unknown-parameter-type/unknown-parameter-type.ts @@ -1,4 +1,4 @@ -import { Given } from '../../..' +import { Given } from '../../../src' // eslint-disable-next-line @typescript-eslint/no-unused-vars Given('{airport} is closed because of a strike', function (airport: any) { diff --git a/features/cli.feature b/features/cli.feature deleted file mode 100644 index 59beda6d5..000000000 --- a/features/cli.feature +++ /dev/null @@ -1,44 +0,0 @@ -Feature: Command line interface - In order to run cucumber in different contexts - As a person who wants to run features - I want to run Cucumber on the command line - - Scenario: run feature with non-default step definitions file location specified (-r option) - Given a file named "features/a.feature" with: - """ - Feature: some feature - Scenario: - When a step is passing - """ - And a file named "step_definitions/cucumber_steps.js" with: - """ - const {When} = require('@cucumber/cucumber') - - When(/^a step is passing$/, function() {}) - """ - When I run cucumber-js with `-r step_definitions/cucumber_steps.js` - - Scenario: run feature with step definitions in required directory (-r option) - Given a file named "features/a.feature" with: - """ - Feature: some feature - Scenario: - When a step is passing - """ - And a file named "step_definitions/cucumber_steps.js" with: - """ - const {When} = require('@cucumber/cucumber') - - When(/^a step is passing$/, function() {}); - """ - When I run cucumber-js with `-r step_definitions` - - @spawn - Scenario: display Cucumber version - When I run cucumber-js with `--version` - Then I see the version of Cucumber - - @spawn - Scenario: display help - When I run cucumber-js with `--help` - Then I see the help text for Cucumber diff --git a/features/cli.feature.md b/features/cli.feature.md new file mode 100644 index 000000000..5c8e86a54 --- /dev/null +++ b/features/cli.feature.md @@ -0,0 +1,66 @@ +# Command line interface +In order to run cucumber in different contexts +As a person who wants to run features +I want to run Cucumber on the command line + +## Scenario: run feature with non-default step definitions file location specified (-r option) + +* Given a file named "features/a.feature" with: + ```gherkin + Feature: some feature + Scenario: + When a step is passing + ``` +* And a file named "step_definitions/cucumber_steps.js" with: + ```javascript + const {When} = require('@cucumber/cucumber') + + When(/^a step is passing$/, function() {}) + ``` +* When I run cucumber-js with `-r step_definitions/cucumber_steps.js` +* Then it passes + +## Scenario: run Markdown feature with non-default step definitions file location specified (-r option) + +* Given a file named "features/a.feature.md" with: + ```markdown + # Feature: some feature + ## Scenario: + * When a step is passing + ``` +* And a file named "step_definitions/cucumber_steps.js" with: + ```javascript + const {When} = require('@cucumber/cucumber') + + When(/^a step is passing$/, function() {}) + ``` +* When I run cucumber-js with `-r step_definitions/cucumber_steps.js` +* Then it passes + +## Scenario: run feature with step definitions in required directory (-r option) + +* Given a file named "features/a.feature" with: + ```gherkin + Feature: some feature + Scenario: + When a step is passing + ``` +* And a file named "step_definitions/cucumber_steps.js" with: + ```javascript + const {When} = require('@cucumber/cucumber') + + When(/^a step is passing$/, function() {}); + ``` +* When I run cucumber-js with `-r step_definitions` +* Then it passes + +`@spawn` +# Scenario: display Cucumber version + +* When I run cucumber-js with `--version` +* Then I see the version of Cucumber + +`@spawn` +# Scenario: display help +* When I run cucumber-js with `--help` +* Then I see the help text for Cucumber diff --git a/features/fixtures/formatters/failed.message.json.ts b/features/fixtures/formatters/failed.message.json.ts index c20a4fa85..fb9f17eec 100644 --- a/features/fixtures/formatters/failed.message.json.ts +++ b/features/fixtures/formatters/failed.message.json.ts @@ -8,15 +8,17 @@ module.exports = [ }, { gherkinDocument: { - uri: 'features/a.feature', + comments: [], feature: { location: { line: 1, column: 1, }, + tags: [], language: 'en', keyword: 'Feature', name: 'a feature', + description: '', children: [ { scenario: { @@ -24,8 +26,10 @@ module.exports = [ line: 2, column: 3, }, + tags: [], keyword: 'Scenario', name: 'a scenario', + description: '', steps: [ { location: { @@ -37,11 +41,13 @@ module.exports = [ id: '1', }, ], + examples: [], id: '2', }, }, ], }, + uri: 'features/a.feature', }, }, { @@ -52,11 +58,12 @@ module.exports = [ language: 'en', steps: [ { - text: 'a step', - id: '3', astNodeIds: ['1'], + id: '3', + text: 'a step', }, ], + tags: [], astNodeIds: ['2'], }, }, @@ -78,7 +85,7 @@ module.exports = [ { testRunStarted: { timestamp: { - seconds: '0', + seconds: 0, nanos: 0, }, }, @@ -92,64 +99,70 @@ module.exports = [ id: '6', pickleStepId: '3', stepDefinitionIds: ['0'], - stepMatchArgumentsLists: [{}], + stepMatchArgumentsLists: [ + { + stepMatchArguments: [], + }, + ], }, ], }, }, { testCaseStarted: { + attempt: 0, + id: '7', + testCaseId: '5', timestamp: { - seconds: '0', + seconds: 0, nanos: 1000000, }, - attempt: 0, - testCaseId: '5', - id: '7', }, }, { testStepStarted: { + testCaseStartedId: '7', + testStepId: '6', timestamp: { - seconds: '0', + seconds: 0, nanos: 2000000, }, - testStepId: '6', - testCaseStartedId: '7', }, }, { testStepFinished: { + testCaseStartedId: '7', + testStepId: '6', testStepResult: { - status: 'FAILED', - message: - 'Error: my error\n at World. (features/step_definitions/steps.js:3:49)', duration: { - seconds: '0', + seconds: 0, nanos: 0, }, + status: 'FAILED', + willBeRetried: false, + message: + 'Error: my error\n at World. (features/step_definitions/steps.js:3:49)', }, timestamp: { - seconds: '0', + seconds: 0, nanos: 3000000, }, - testStepId: '6', - testCaseStartedId: '7', }, }, { testCaseFinished: { + testCaseStartedId: '7', timestamp: { - seconds: '0', + seconds: 0, nanos: 4000000, }, - testCaseStartedId: '7', }, }, { testRunFinished: { + success: false, timestamp: { - seconds: '0', + seconds: 0, nanos: 5000000, }, }, diff --git a/features/fixtures/formatters/passed-rule.message.json.ts b/features/fixtures/formatters/passed-rule.message.json.ts index e2c51c81c..55c2162d4 100644 --- a/features/fixtures/formatters/passed-rule.message.json.ts +++ b/features/fixtures/formatters/passed-rule.message.json.ts @@ -9,15 +9,17 @@ module.exports = [ }, { gherkinDocument: { - uri: 'features/a.feature', + comments: [], feature: { location: { line: 1, column: 1, }, + tags: [], language: 'en', keyword: 'Feature', name: 'a feature', + description: '', children: [ { rule: { @@ -25,8 +27,10 @@ module.exports = [ line: 2, column: 3, }, + tags: [], keyword: 'Rule', name: 'a rule', + description: '', children: [ { scenario: { @@ -34,8 +38,10 @@ module.exports = [ line: 3, column: 5, }, + tags: [], keyword: 'Example', name: 'an example', + description: '', steps: [ { location: { @@ -47,6 +53,7 @@ module.exports = [ id: '1', }, ], + examples: [], id: '2', }, }, @@ -56,6 +63,7 @@ module.exports = [ }, ], }, + uri: 'features/a.feature', }, }, { @@ -66,11 +74,12 @@ module.exports = [ language: 'en', steps: [ { - text: 'a step', - id: '4', astNodeIds: ['1'], + id: '4', + text: 'a step', }, ], + tags: [], astNodeIds: ['2'], }, }, @@ -92,7 +101,7 @@ module.exports = [ { testRunStarted: { timestamp: { - seconds: '0', + seconds: 0, nanos: 0, }, }, @@ -106,62 +115,68 @@ module.exports = [ id: '7', pickleStepId: '4', stepDefinitionIds: ['0'], - stepMatchArgumentsLists: [{}], + stepMatchArgumentsLists: [ + { + stepMatchArguments: [], + }, + ], }, ], }, }, { testCaseStarted: { + attempt: 0, + id: '8', + testCaseId: '6', timestamp: { - seconds: '0', + seconds: 0, nanos: 1000000, }, - attempt: 0, - testCaseId: '6', - id: '8', }, }, { testStepStarted: { + testCaseStartedId: '8', + testStepId: '7', timestamp: { - seconds: '0', + seconds: 0, nanos: 2000000, }, - testStepId: '7', - testCaseStartedId: '8', }, }, { testStepFinished: { + testCaseStartedId: '8', + testStepId: '7', testStepResult: { - status: 'PASSED', duration: { - seconds: '0', + seconds: 0, nanos: 0, }, + status: 'PASSED', + willBeRetried: false, }, timestamp: { - seconds: '0', + seconds: 0, nanos: 3000000, }, - testStepId: '7', - testCaseStartedId: '8', }, }, { testCaseFinished: { + testCaseStartedId: '8', timestamp: { - seconds: '0', + seconds: 0, nanos: 4000000, }, - testCaseStartedId: '8', }, }, { testRunFinished: { + success: true, timestamp: { - seconds: '0', + seconds: 0, nanos: 5000000, }, }, diff --git a/features/fixtures/formatters/passed-scenario.message.json.ts b/features/fixtures/formatters/passed-scenario.message.json.ts index 943d14637..99a403fd7 100644 --- a/features/fixtures/formatters/passed-scenario.message.json.ts +++ b/features/fixtures/formatters/passed-scenario.message.json.ts @@ -8,15 +8,17 @@ module.exports = [ }, { gherkinDocument: { - uri: 'features/a.feature', + comments: [], feature: { location: { line: 1, column: 1, }, + tags: [], language: 'en', keyword: 'Feature', name: 'a feature', + description: '', children: [ { scenario: { @@ -24,8 +26,10 @@ module.exports = [ line: 2, column: 3, }, + tags: [], keyword: 'Scenario', name: 'a scenario', + description: '', steps: [ { location: { @@ -37,11 +41,13 @@ module.exports = [ id: '1', }, ], + examples: [], id: '2', }, }, ], }, + uri: 'features/a.feature', }, }, { @@ -52,11 +58,12 @@ module.exports = [ language: 'en', steps: [ { - text: 'a step', - id: '3', astNodeIds: ['1'], + id: '3', + text: 'a step', }, ], + tags: [], astNodeIds: ['2'], }, }, @@ -78,7 +85,7 @@ module.exports = [ { testRunStarted: { timestamp: { - seconds: '0', + seconds: 0, nanos: 0, }, }, @@ -92,62 +99,68 @@ module.exports = [ id: '6', pickleStepId: '3', stepDefinitionIds: ['0'], - stepMatchArgumentsLists: [{}], + stepMatchArgumentsLists: [ + { + stepMatchArguments: [], + }, + ], }, ], }, }, { testCaseStarted: { + attempt: 0, + id: '7', + testCaseId: '5', timestamp: { - seconds: '0', + seconds: 0, nanos: 1000000, }, - attempt: 0, - testCaseId: '5', - id: '7', }, }, { testStepStarted: { + testCaseStartedId: '7', + testStepId: '6', timestamp: { - seconds: '0', + seconds: 0, nanos: 2000000, }, - testStepId: '6', - testCaseStartedId: '7', }, }, { testStepFinished: { + testCaseStartedId: '7', + testStepId: '6', testStepResult: { - status: 'PASSED', duration: { - seconds: '0', + seconds: 0, nanos: 0, }, + status: 'PASSED', + willBeRetried: false, }, timestamp: { - seconds: '0', + seconds: 0, nanos: 3000000, }, - testStepId: '6', - testCaseStartedId: '7', }, }, { testCaseFinished: { + testCaseStartedId: '7', timestamp: { - seconds: '0', + seconds: 0, nanos: 4000000, }, - testCaseStartedId: '7', }, }, { testRunFinished: { + success: true, timestamp: { - seconds: '0', + seconds: 0, nanos: 5000000, }, }, diff --git a/features/fixtures/formatters/rejected-pickle.message.json.ts b/features/fixtures/formatters/rejected-pickle.message.json.ts index 6740e5f1c..6a827beaa 100644 --- a/features/fixtures/formatters/rejected-pickle.message.json.ts +++ b/features/fixtures/formatters/rejected-pickle.message.json.ts @@ -8,15 +8,17 @@ module.exports = [ }, { gherkinDocument: { - uri: 'features/a.feature', + comments: [], feature: { location: { line: 1, column: 1, }, + tags: [], language: 'en', keyword: 'Feature', name: 'a feature', + description: '', children: [ { scenario: { @@ -24,8 +26,10 @@ module.exports = [ line: 2, column: 3, }, + tags: [], keyword: 'Scenario', name: 'a scenario', + description: '', steps: [ { location: { @@ -37,11 +41,13 @@ module.exports = [ id: '0', }, ], + examples: [], id: '1', }, }, ], }, + uri: 'features/a.feature', }, }, { @@ -52,26 +58,28 @@ module.exports = [ language: 'en', steps: [ { - text: 'a step', - id: '2', astNodeIds: ['0'], + id: '2', + text: 'a step', }, ], + tags: [], astNodeIds: ['1'], }, }, { testRunStarted: { timestamp: { - seconds: '0', + seconds: 0, nanos: 0, }, }, }, { testRunFinished: { + success: true, timestamp: { - seconds: '0', + seconds: 0, nanos: 1000000, }, }, diff --git a/features/fixtures/formatters/retried.message.json.ts b/features/fixtures/formatters/retried.message.json.ts index 9a1d0ae39..64adb41ac 100644 --- a/features/fixtures/formatters/retried.message.json.ts +++ b/features/fixtures/formatters/retried.message.json.ts @@ -8,15 +8,17 @@ module.exports = [ }, { gherkinDocument: { - uri: 'features/a.feature', + comments: [], feature: { location: { line: 1, column: 1, }, + tags: [], language: 'en', keyword: 'Feature', name: 'a feature', + description: '', children: [ { scenario: { @@ -24,8 +26,10 @@ module.exports = [ line: 2, column: 3, }, + tags: [], keyword: 'Scenario', name: 'a scenario', + description: '', steps: [ { location: { @@ -37,11 +41,13 @@ module.exports = [ id: '1', }, ], + examples: [], id: '2', }, }, ], }, + uri: 'features/a.feature', }, }, { @@ -52,11 +58,12 @@ module.exports = [ language: 'en', steps: [ { - text: 'a step', - id: '3', astNodeIds: ['1'], + id: '3', + text: 'a step', }, ], + tags: [], astNodeIds: ['2'], }, }, @@ -78,7 +85,7 @@ module.exports = [ { testRunStarted: { timestamp: { - seconds: '0', + seconds: 0, nanos: 0, }, }, @@ -92,112 +99,118 @@ module.exports = [ id: '6', pickleStepId: '3', stepDefinitionIds: ['0'], - stepMatchArgumentsLists: [{}], + stepMatchArgumentsLists: [ + { + stepMatchArguments: [], + }, + ], }, ], }, }, { testCaseStarted: { + attempt: 0, + id: '7', + testCaseId: '5', timestamp: { - seconds: '0', + seconds: 0, nanos: 1000000, }, - attempt: 0, - testCaseId: '5', - id: '7', }, }, { testStepStarted: { + testCaseStartedId: '7', + testStepId: '6', timestamp: { - seconds: '0', + seconds: 0, nanos: 2000000, }, - testStepId: '6', - testCaseStartedId: '7', }, }, { testStepFinished: { + testCaseStartedId: '7', + testStepId: '6', testStepResult: { - status: 'FAILED', - message: - 'Error: my error\n at World. (features/step_definitions/steps.js:11:12)', duration: { - seconds: '0', + seconds: 0, nanos: 0, }, + status: 'FAILED', willBeRetried: true, + message: + 'Error: my error\n at World. (features/step_definitions/steps.js:11:12)', }, timestamp: { - seconds: '0', + seconds: 0, nanos: 3000000, }, - testStepId: '6', - testCaseStartedId: '7', }, }, { testCaseFinished: { + testCaseStartedId: '7', timestamp: { - seconds: '0', + seconds: 0, nanos: 4000000, }, - testCaseStartedId: '7', }, }, { testCaseStarted: { + attempt: 1, + id: '8', + testCaseId: '5', timestamp: { - seconds: '0', + seconds: 0, nanos: 5000000, }, - attempt: 1, - testCaseId: '5', - id: '8', }, }, { testStepStarted: { + testCaseStartedId: '8', + testStepId: '6', timestamp: { - seconds: '0', + seconds: 0, nanos: 6000000, }, - testStepId: '6', - testCaseStartedId: '8', }, }, { testStepFinished: { + testCaseStartedId: '8', + testStepId: '6', testStepResult: { - status: 'PASSED', duration: { - seconds: '0', + seconds: 0, nanos: 0, }, + status: 'PASSED', + willBeRetried: false, }, timestamp: { - seconds: '0', + seconds: 0, nanos: 7000000, }, - testStepId: '6', - testCaseStartedId: '8', }, }, { testCaseFinished: { + testCaseStartedId: '8', timestamp: { - seconds: '0', + seconds: 0, nanos: 8000000, }, - testCaseStartedId: '8', }, }, { testRunFinished: { + success: true, timestamp: { - seconds: '0', + seconds: 0, nanos: 9000000, }, }, diff --git a/features/formatters.feature b/features/formatters.feature index 84dfa0a35..3d75e3d5d 100644 --- a/features/formatters.feature +++ b/features/formatters.feature @@ -8,8 +8,8 @@ Feature: Formatters Given a step """ When I run cucumber-js with all formatters and `--tags @a` - Then the "message" formatter output matches the fixture "formatters/rejected-pickle.message.json" - Then the "json" formatter output matches the fixture "formatters/rejected-pickle.json" + Then the message formatter output matches the fixture "formatters/rejected-pickle.message.json" + Then the json formatter output matches the fixture "formatters/rejected-pickle.json" Then the html formatter output is complete Scenario: passed from Scenario @@ -26,8 +26,8 @@ Feature: Formatters Given(/^a step$/, function() {}) """ When I run cucumber-js with all formatters - Then the "message" formatter output matches the fixture "formatters/passed-scenario.message.json" - Then the "json" formatter output matches the fixture "formatters/passed-scenario.json" + Then the message formatter output matches the fixture "formatters/passed-scenario.message.json" + Then the json formatter output matches the fixture "formatters/passed-scenario.json" Then the html formatter output is complete Scenario: passed from Rule @@ -45,8 +45,8 @@ Feature: Formatters Given(/^a step$/, function() {}) """ When I run cucumber-js with all formatters - Then the "message" formatter output matches the fixture "formatters/passed-rule.message.json" - Then the "json" formatter output matches the fixture "formatters/passed-rule.json" + Then the message formatter output matches the fixture "formatters/passed-rule.message.json" + Then the json formatter output matches the fixture "formatters/passed-rule.json" Then the html formatter output is complete Scenario: failed @@ -63,8 +63,8 @@ Feature: Formatters Given(/^a step$/, function(callback) { callback(new Error('my error')) }) """ When I run cucumber-js with all formatters - Then the "message" formatter output matches the fixture "formatters/failed.message.json" - Then the "json" formatter output matches the fixture "formatters/failed.json" + Then the message formatter output matches the fixture "formatters/failed.message.json" + Then the json formatter output matches the fixture "formatters/failed.json" Then the html formatter output is complete And it fails @@ -91,6 +91,6 @@ Feature: Formatters }) """ When I run cucumber-js with all formatters and `--retry 1` - Then the "message" formatter output matches the fixture "formatters/retried.message.json" - Then the "json" formatter output matches the fixture "formatters/retried.json" + Then the message formatter output matches the fixture "formatters/retried.message.json" + Then the json formatter output matches the fixture "formatters/retried.json" Then the html formatter output is complete diff --git a/features/step_definitions/formatter_steps.ts b/features/step_definitions/formatter_steps.ts index 3d36fdc3d..6fd625c3d 100644 --- a/features/step_definitions/formatter_steps.ts +++ b/features/step_definitions/formatter_steps.ts @@ -7,28 +7,53 @@ import { } from '../support/formatter_output_helpers' import fs from 'mz/fs' import path from 'path' -import { messages } from '@cucumber/messages' import { World } from '../support/world' -import Envelope = messages.Envelope Then( - 'the {string} formatter output matches the fixture {string}', - async function (this: World, formatter: string, filePath: string) { - let actual: any - if (formatter === 'message') { - actual = this.lastRun.envelopes.map((e: Envelope) => e.toJSON()) - actual = normalizeMessageOutput(actual, this.tmpDir) - actual = stripMetaMessages(actual) - } else { - const actualPath = path.join(this.tmpDir, `${formatter}.out`) - actual = await fs.readFile(actualPath, 'utf8') - if (formatter === 'json') { - actual = normalizeJsonOutput(actual, this.tmpDir) + 'the message formatter output matches the fixture {string}', + async function (this: World, filePath: string) { + let actual = this.lastRun.envelopes // .map((e: Envelope) => JSON.stringify(e)) + actual = normalizeMessageOutput(actual, this.tmpDir) + actual = stripMetaMessages(actual) + const fixturePath = path.join(__dirname, '..', 'fixtures', filePath) + const expected = require(fixturePath) // eslint-disable-line @typescript-eslint/no-var-requires + try { + expect(actual).to.eql(expected) + } catch (e) { + if (process.env.GOLDEN) { + await fs.writeFile( + fixturePath + '.ts', + 'module.exports = ' + JSON.stringify(actual, null, 2), + 'utf-8' + ) + } else { + throw e } } + } +) + +Then( + 'the json formatter output matches the fixture {string}', + async function (this: World, filePath: string) { + const actualPath = path.join(this.tmpDir, `json.out`) + const actualJson = await fs.readFile(actualPath, 'utf8') + const actual = normalizeJsonOutput(actualJson, this.tmpDir) const fixturePath = path.join(__dirname, '..', 'fixtures', filePath) const expected = require(fixturePath) // eslint-disable-line @typescript-eslint/no-var-requires - expect(actual).to.eql(expected) + try { + expect(actual).to.eql(expected) + } catch (e) { + if (process.env.GOLDEN) { + await fs.writeFile( + fixturePath + '.ts', + 'module.exports = ' + JSON.stringify(actual, null, 2), + 'utf-8' + ) + } else { + throw e + } + } } ) diff --git a/features/step_definitions/message_steps.ts b/features/step_definitions/message_steps.ts index 1b021441e..fd30062da 100644 --- a/features/step_definitions/message_steps.ts +++ b/features/step_definitions/message_steps.ts @@ -10,24 +10,13 @@ import { getTestStepAttachmentsForStep, getTestStepResults, } from '../support/message_helpers' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { World } from '../support/world' import semver from 'semver' -type StringifiedStatus = - | 'UNKNOWN' - | 'PASSED' - | 'SKIPPED' - | 'PENDING' - | 'UNDEFINED' - | 'AMBIGUOUS' - | 'FAILED' - -const { Status } = messages.TestStepFinished.TestStepResult - -const ENCODING_MAP: { [key: string]: messages.Attachment.ContentEncoding } = { - IDENTITY: messages.Attachment.ContentEncoding.IDENTITY, - BASE64: messages.Attachment.ContentEncoding.BASE64, +const ENCODING_MAP: { [key: string]: messages.AttachmentContentEncoding } = { + IDENTITY: messages.AttachmentContentEncoding.IDENTITY, + BASE64: messages.AttachmentContentEncoding.BASE64, } Then('it runs {int} scenarios', function (this: World, expectedCount: number) { @@ -62,7 +51,7 @@ Then( function (this: World, name: string, status: string) { const result = getTestCaseResult(this.lastRun.envelopes, name) expect(result.status).to.eql( - Status[status.toUpperCase() as StringifiedStatus] + status.toUpperCase() as messages.TestStepResultStatus ) } ) @@ -87,7 +76,7 @@ Then( ) const testStepResult = find(testStepResults, ['text', stepText]) expect(testStepResult.result.status).to.eql( - Status[status.toUpperCase() as StringifiedStatus] + status.toUpperCase() as messages.TestStepResultStatus ) } ) @@ -108,7 +97,7 @@ Then( ) const testStepResult = find(testStepResults, ['text', stepText]) expect(testStepResult.result.status).to.eql( - Status[status.toUpperCase() as StringifiedStatus] + status.toUpperCase() as messages.TestStepResultStatus ) } ) @@ -127,7 +116,7 @@ Then( ) const testStepResult = find(testStepResults, ['text', hookKeyword]) expect(testStepResult.result.status).to.eql( - Status[status.toUpperCase() as StringifiedStatus] + status.toUpperCase() as messages.TestStepResultStatus ) } ) @@ -151,7 +140,9 @@ Then( ' { member: [Circular *1] }' ) } - expect(testStepResult.result.status).to.eql(Status.FAILED) + expect(testStepResult.result.status).to.eql( + messages.TestStepResultStatus.FAILED + ) expect(testStepResult.result.message).to.include(errorMessage) } ) @@ -171,7 +162,9 @@ Then( attempt ) const testStepResult = find(testStepResults, ['text', stepText]) - expect(testStepResult.result.status).to.eql(Status.FAILED) + expect(testStepResult.result.status).to.eql( + messages.TestStepResultStatus.FAILED + ) expect(testStepResult.result.message).to.include(errorMessage) } ) @@ -249,7 +242,7 @@ Then( hookKeyword: string, table: DataTable ) { - const expectedAttachments: messages.IAttachment[] = table + const expectedAttachments: messages.Attachment[] = table .hashes() .map((x) => { return { diff --git a/features/support/formatter_output_helpers.ts b/features/support/formatter_output_helpers.ts index 2e977103b..b2da4a780 100644 --- a/features/support/formatter_output_helpers.ts +++ b/features/support/formatter_output_helpers.ts @@ -9,6 +9,7 @@ import { IJsonScenario, IJsonStep, } from '../../src/formatter/json_formatter' +import * as messages from '@cucumber/messages' // Converting windows stack trace to posix and removing cwd // C:\\project\\path\\features\\support/code.js @@ -21,7 +22,7 @@ function normalizeExceptionAndUri(exception: string, cwd: string): string { .replace('/features', 'features') } -function normalizeProtobufObject(obj: any, cwd: string): void { +function normalizeMessage(obj: any, cwd: string): void { if (doesHaveValue(obj.uri)) { obj.uri = normalizeExceptionAndUri(obj.uri, cwd) } @@ -45,18 +46,20 @@ function normalizeProtobufObject(obj: any, cwd: string): void { } export function normalizeMessageOutput( - envelopeObjects: any[], + envelopeObjects: messages.Envelope[], cwd: string -): any[] { +): messages.Envelope[] { envelopeObjects.forEach((e: any) => { for (const key in e) { - normalizeProtobufObject(e[key], cwd) + normalizeMessage(e[key], cwd) } }) return envelopeObjects } -export function stripMetaMessages(envelopeObjects: any[]): any[] { +export function stripMetaMessages( + envelopeObjects: messages.Envelope[] +): messages.Envelope[] { return envelopeObjects.filter((e: any) => { // filter off meta objects, almost none of it predictable/useful for testing return doesNotHaveValue(e.meta) diff --git a/features/support/message_helpers.ts b/features/support/message_helpers.ts index 63e9ad4a6..9a0e1e071 100644 --- a/features/support/message_helpers.ts +++ b/features/support/message_helpers.ts @@ -5,17 +5,18 @@ import { getStepKeyword, } from '../../src/formatter/helpers/pickle_parser' import util from 'util' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { Query } from '@cucumber/query' import { doesHaveValue, doesNotHaveValue } from '../../src/value_checker' +import { getWorstTestStepResult } from '@cucumber/messages' export interface IStepTextAndResult { text: string - result: messages.TestStepFinished.ITestStepResult + result: messages.TestStepResult } export function getPickleNamesInOrderOfExecution( - envelopes: messages.IEnvelope[] + envelopes: messages.Envelope[] ): string[] { const pickleNameMap: Dictionary = _.chain(envelopes) .filter((e) => doesHaveValue(e.pickle)) @@ -34,29 +35,27 @@ export function getPickleNamesInOrderOfExecution( } export function getPickleStep( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], pickleName: string, stepText: string -): messages.Pickle.IPickleStep { +): messages.PickleStep { const pickle = getAcceptedPickle(envelopes, pickleName) const gherkinDocument = getGherkinDocument(envelopes, pickle.uri) return getPickleStepByStepText(pickle, gherkinDocument, stepText) } export function getTestCaseResult( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], pickleName: string -): messages.TestStepFinished.ITestStepResult { +): messages.TestStepResult { const query = new Query() envelopes.forEach((envelope) => query.update(envelope)) const pickle = getAcceptedPickle(envelopes, pickleName) - return query.getWorstTestStepResult( - query.getPickleTestStepResults([pickle.id]) - ) + return getWorstTestStepResult(query.getPickleTestStepResults([pickle.id])) } export function getTestStepResults( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], pickleName: string, attempt = 0 ): IStepTextAndResult[] { @@ -81,7 +80,7 @@ export function getTestStepResults( let isBeforeHook = true return testCase.testSteps.map((testStep) => { let text = '' - if (testStep.pickleStepId === '') { + if (!doesHaveValue(testStep.pickleStepId)) { text = isBeforeHook ? 'Before' : 'After' } else { isBeforeHook = false @@ -94,10 +93,10 @@ export function getTestStepResults( } export function getTestStepAttachmentsForStep( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], pickleName: string, stepText: string -): messages.IAttachment[] { +): messages.Attachment[] { const pickle = getAcceptedPickle(envelopes, pickleName) const gherkinDocument = getGherkinDocument(envelopes, pickle.uri) const testCase = getTestCase(envelopes, pickle.id) @@ -111,10 +110,10 @@ export function getTestStepAttachmentsForStep( } export function getTestStepAttachmentsForHook( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], pickleName: string, isBeforeHook: boolean -): messages.IAttachment[] { +): messages.Attachment[] { const pickle = getAcceptedPickle(envelopes, pickleName) const testCase = getTestCase(envelopes, pickle.id) const testStepIndex = isBeforeHook ? 0 : testCase.testSteps.length - 1 @@ -124,9 +123,9 @@ export function getTestStepAttachmentsForHook( } function getAcceptedPickle( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], pickleName: string -): messages.IPickle { +): messages.Pickle { const pickleEnvelope = _.find( envelopes, (e) => doesHaveValue(e.pickle) && e.pickle.name === pickleName @@ -142,9 +141,9 @@ function getAcceptedPickle( } function getGherkinDocument( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], uri: string -): messages.IGherkinDocument { +): messages.GherkinDocument { const gherkinDocumentEnvelope = _.find( envelopes, (e) => doesHaveValue(e.gherkinDocument) && e.gherkinDocument.uri === uri @@ -160,9 +159,9 @@ function getGherkinDocument( } function getTestCase( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], pickleId: string -): messages.ITestCase { +): messages.TestCase { const testCaseEnvelope = _.find( envelopes, (e) => doesHaveValue(e.testCase) && e.testCase.pickleId === pickleId @@ -178,10 +177,10 @@ function getTestCase( } function getTestCaseStarted( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], testCaseId: string, attempt = 0 -): messages.ITestCaseStarted { +): messages.TestCaseStarted { const testCaseStartedEnvelope = _.find( envelopes, (e) => @@ -200,10 +199,10 @@ function getTestCaseStarted( } function getPickleStepByStepText( - pickle: messages.IPickle, - gherkinDocument: messages.IGherkinDocument, + pickle: messages.Pickle, + gherkinDocument: messages.GherkinDocument, stepText: string -): messages.Pickle.IPickleStep { +): messages.PickleStep { const gherkinStepMap = getGherkinStepMap(gherkinDocument) return _.find(pickle.steps, (s) => { const keyword = getStepKeyword({ pickleStep: s, gherkinStepMap }) @@ -212,10 +211,10 @@ function getPickleStepByStepText( } function getTestStepAttachments( - envelopes: messages.IEnvelope[], + envelopes: messages.Envelope[], testCaseStartedId: string, testStepId: string -): messages.IAttachment[] { +): messages.Attachment[] { return _.chain(envelopes) .filter( (e) => diff --git a/features/support/world.ts b/features/support/world.ts index 0c3e54dc1..c784aec7c 100644 --- a/features/support/world.ts +++ b/features/support/world.ts @@ -2,21 +2,24 @@ import { Cli, setWorldConstructor } from '../../' import { execFile } from 'child_process' import { expect } from 'chai' import toString from 'stream-to-string' -import { PassThrough } from 'stream' +import { PassThrough, pipeline, Writable } from 'stream' import colors from 'colors/safe' import fs from 'fs' import path from 'path' import VError from 'verror' import _ from 'lodash' -import ndjsonParse from 'ndjson-parse' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' +import * as messageStreams from '@cucumber/message-streams' import FakeReportServer from '../../test/fake_report_server' import { doesHaveValue } from '../../src/value_checker' +import util from 'util' + +const asyncPipeline = util.promisify(pipeline) interface ILastRun { error: any errorOutput: string - envelopes: messages.IEnvelope[] + envelopes: messages.Envelope[] output: string } @@ -98,11 +101,20 @@ export class World { stdout.end() result = { error, stdout: await toString(stdout), stderr } } - let envelopes: messages.Envelope[] = [] + const envelopes: messages.Envelope[] = [] const messageOutputPath = path.join(cwd, messageFilename) if (fs.existsSync(messageOutputPath)) { - const data = fs.readFileSync(messageOutputPath, { encoding: 'utf-8' }) - envelopes = ndjsonParse(data).map(messages.Envelope.fromObject) + await asyncPipeline( + fs.createReadStream(messageOutputPath, { encoding: 'utf-8' }), + new messageStreams.NdjsonToMessageStream(), + new Writable({ + objectMode: true, + write(envelope: messages.Envelope, _: BufferEncoding, callback) { + envelopes.push(envelope) + callback() + }, + }) + ) } if (this.debug) { console.log(result.stdout + result.stderr) // eslint-disable-line no-console diff --git a/package.json b/package.json index 54cd7263d..eb7a879ad 100644 --- a/package.json +++ b/package.json @@ -168,15 +168,14 @@ "node": ">=10" }, "dependencies": { - "@cucumber/create-meta": "4.0.0", - "@cucumber/cucumber-expressions": "12.0.1", - "@cucumber/gherkin": "18.0.0", - "@cucumber/gherkin-streams": "1.0.0", - "@cucumber/html-formatter": "13.0.0", - "@cucumber/messages": "15.0.0", - "@cucumber/query": "9.0.2", - "@cucumber/tag-expressions": "3.0.1", - "assertion-error-formatter": "3.0.0", + "@cucumber/create-meta": "^5.0.0", + "@cucumber/cucumber-expressions": "^12.1.1", + "@cucumber/gherkin": "^19.0.3", + "@cucumber/gherkin-streams": "^2.0.2", + "@cucumber/html-formatter": "^14.0.0", + "@cucumber/messages": "^16.0.1", + "@cucumber/tag-expressions": "^3.0.1", + "assertion-error-formatter": "^3.0.0", "bluebird": "^3.7.2", "capital-case": "^1.0.4", "cli-table3": "^0.6.0", @@ -204,7 +203,9 @@ "verror": "^1.10.0" }, "devDependencies": { - "@cucumber/compatibility-kit": "4.0.1", + "@cucumber/compatibility-kit": "6.0.0", + "@cucumber/message-streams": "2.0.0", + "@cucumber/query": "10.0.0", "@sinonjs/fake-timers": "7.0.5", "@types/bluebird": "3.5.33", "@types/chai": "4.2.17", @@ -244,7 +245,6 @@ "fs-extra": "9.1.0", "mocha": "8.3.2", "mustache": "4.2.0", - "ndjson-parse": "1.0.4", "nyc": "15.1.0", "prettier": "2.2.1", "semver": "7.3.5", diff --git a/src/cli/configuration_builder.ts b/src/cli/configuration_builder.ts index e830b11c5..b4cca00d1 100644 --- a/src/cli/configuration_builder.ts +++ b/src/cli/configuration_builder.ts @@ -219,6 +219,6 @@ export default class ConfigurationBuilder { return featurePaths } } - return ['features/**/*.feature'] + return ['features/**/*.{feature,feature.md}'] } } diff --git a/src/cli/configuration_builder_spec.ts b/src/cli/configuration_builder_spec.ts index 46138c50e..d91d2807a 100644 --- a/src/cli/configuration_builder_spec.ts +++ b/src/cli/configuration_builder_spec.ts @@ -40,7 +40,7 @@ describe('Configuration', () => { parallel: 0, pickleFilterOptions: { cwd, - featurePaths: ['features/**/*.feature'], + featurePaths: ['features/**/*.{feature,feature.md}'], names: [], tagExpression: '', }, @@ -65,7 +65,7 @@ describe('Configuration', () => { }) describe('path to a feature', () => { - it('returns the appropriate feature and support code paths', async function () { + it('returns the appropriate .feature and support code paths', async function () { // Arrange const cwd = await buildTestWorkingDirectory() const relativeFeaturePath = path.join('features', 'a.feature') @@ -87,10 +87,33 @@ describe('Configuration', () => { expect(pickleFilterOptions.featurePaths).to.eql([relativeFeaturePath]) expect(supportCodePaths).to.eql([supportCodePath]) }) + + it('returns the appropriate .md and support code paths', async function () { + // Arrange + const cwd = await buildTestWorkingDirectory() + const relativeFeaturePath = path.join('features', 'a.feature.md') + const featurePath = path.join(cwd, relativeFeaturePath) + await fsExtra.outputFile(featurePath, '') + const supportCodePath = path.join(cwd, 'features', 'a.js') + await fsExtra.outputFile(supportCodePath, '') + const argv = baseArgv.concat([relativeFeaturePath]) + + // Act + const { + featurePaths, + pickleFilterOptions, + supportCodePaths, + } = await ConfigurationBuilder.build({ argv, cwd }) + + // Assert + expect(featurePaths).to.eql([featurePath]) + expect(pickleFilterOptions.featurePaths).to.eql([relativeFeaturePath]) + expect(supportCodePaths).to.eql([supportCodePath]) + }) }) describe('path to a nested feature', () => { - it('returns the appropriate feature and support code paths', async function () { + it('returns the appropriate .feature and support code paths', async function () { // Arrange const cwd = await buildTestWorkingDirectory() const relativeFeaturePath = path.join('features', 'nested', 'a.feature') @@ -112,6 +135,33 @@ describe('Configuration', () => { expect(pickleFilterOptions.featurePaths).to.eql([relativeFeaturePath]) expect(supportCodePaths).to.eql([supportCodePath]) }) + + it('returns the appropriate .md and support code paths', async function () { + // Arrange + const cwd = await buildTestWorkingDirectory() + const relativeFeaturePath = path.join( + 'features', + 'nested', + 'a.feature.md' + ) + const featurePath = path.join(cwd, relativeFeaturePath) + await fsExtra.outputFile(featurePath, '') + const supportCodePath = path.join(cwd, 'features', 'a.js') + await fsExtra.outputFile(supportCodePath, '') + const argv = baseArgv.concat([relativeFeaturePath]) + + // Act + const { + featurePaths, + pickleFilterOptions, + supportCodePaths, + } = await ConfigurationBuilder.build({ argv, cwd }) + + // Assert + expect(featurePaths).to.eql([featurePath]) + expect(pickleFilterOptions.featurePaths).to.eql([relativeFeaturePath]) + expect(supportCodePaths).to.eql([supportCodePath]) + }) }) describe('formatters', () => { diff --git a/src/cli/helpers.ts b/src/cli/helpers.ts index c56414f22..bbed9af13 100644 --- a/src/cli/helpers.ts +++ b/src/cli/helpers.ts @@ -9,16 +9,14 @@ import { EventDataCollector } from '../formatter/helpers' import { doesHaveValue } from '../value_checker' import OptionSplitter from './option_splitter' import { Readable } from 'stream' -import { IdGenerator, messages } from '@cucumber/messages' +import { IdGenerator } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import createMeta from '@cucumber/create-meta' import { ISupportCodeLibrary } from '../support_code_library_builder/types' import TestCaseHookDefinition from '../models/test_case_hook_definition' import TestRunHookDefinition from '../models/test_run_hook_definition' import { builtinParameterTypes } from '../support_code_library_builder' -const StepDefinitionPatternType = - messages.StepDefinition.StepDefinitionPattern.StepDefinitionPatternType - export interface IGetExpandedArgvRequest { argv: string[] cwd: string @@ -56,7 +54,7 @@ export async function parseGherkinMessageStream({ }: IParseGherkinMessageStreamRequest): Promise { return await new Promise((resolve, reject) => { const result: string[] = [] - gherkinMessageStream.on('data', (envelope: messages.IEnvelope) => { + gherkinMessageStream.on('data', (envelope: messages.Envelope) => { eventBroadcaster.emit('envelope', envelope) if (doesHaveValue(envelope.pickle)) { const pickle = envelope.pickle @@ -112,12 +110,9 @@ export async function emitMetaMessage( ): Promise { // eslint-disable-next-line @typescript-eslint/no-var-requires const { version } = require('../../package.json') - eventBroadcaster.emit( - 'envelope', - new messages.Envelope({ - meta: createMeta('cucumber-js', version, process.env), - }) - ) + eventBroadcaster.emit('envelope', { + meta: createMeta('cucumber-js', version, process.env), + }) } function emitParameterTypes( @@ -130,18 +125,16 @@ function emitParameterTypes( if (builtinParameterTypes.includes(parameterType.name)) { continue } - eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - parameterType: { - id: newId(), - name: parameterType.name, - preferForRegularExpressionMatch: parameterType.preferForRegexpMatch, - regularExpressions: parameterType.regexpStrings, - useForSnippets: parameterType.useForSnippets, - }, - }) - ) + const envelope: messages.Envelope = { + parameterType: { + id: newId(), + name: parameterType.name, + preferForRegularExpressionMatch: parameterType.preferForRegexpMatch, + regularExpressions: parameterType.regexpStrings, + useForSnippets: parameterType.useForSnippets, + }, + } + eventBroadcaster.emit('envelope', envelope) } } @@ -150,12 +143,10 @@ function emitUndefinedParameterTypes( eventBroadcaster: EventEmitter ): void { for (const undefinedParameterType of supportCodeLibrary.undefinedParameterTypes) { - eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - undefinedParameterType, - }) - ) + const envelope: messages.Envelope = { + undefinedParameterType, + } + eventBroadcaster.emit('envelope', envelope) } } @@ -164,27 +155,25 @@ function emitStepDefinitions( eventBroadcaster: EventEmitter ): void { supportCodeLibrary.stepDefinitions.forEach((stepDefinition) => { - eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - stepDefinition: { - id: stepDefinition.id, - pattern: { - source: stepDefinition.pattern.toString(), - type: - typeof stepDefinition.pattern === 'string' - ? StepDefinitionPatternType.CUCUMBER_EXPRESSION - : StepDefinitionPatternType.REGULAR_EXPRESSION, - }, - sourceReference: { - uri: stepDefinition.uri, - location: { - line: stepDefinition.line, - }, + const envelope: messages.Envelope = { + stepDefinition: { + id: stepDefinition.id, + pattern: { + source: stepDefinition.pattern.toString(), + type: + typeof stepDefinition.pattern === 'string' + ? messages.StepDefinitionPatternType.CUCUMBER_EXPRESSION + : messages.StepDefinitionPatternType.REGULAR_EXPRESSION, + }, + sourceReference: { + uri: stepDefinition.uri, + location: { + line: stepDefinition.line, }, }, - }) - ) + }, + } + eventBroadcaster.emit('envelope', envelope) }) } @@ -198,21 +187,19 @@ function emitTestCaseHooks( supportCodeLibrary.afterTestCaseHookDefinitions ) .forEach((testCaseHookDefinition: TestCaseHookDefinition) => { - eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - hook: { - id: testCaseHookDefinition.id, - tagExpression: testCaseHookDefinition.tagExpression, - sourceReference: { - uri: testCaseHookDefinition.uri, - location: { - line: testCaseHookDefinition.line, - }, + const envelope: messages.Envelope = { + hook: { + id: testCaseHookDefinition.id, + tagExpression: testCaseHookDefinition.tagExpression, + sourceReference: { + uri: testCaseHookDefinition.uri, + location: { + line: testCaseHookDefinition.line, }, }, - }) - ) + }, + } + eventBroadcaster.emit('envelope', envelope) }) } @@ -226,20 +213,18 @@ function emitTestRunHooks( supportCodeLibrary.afterTestRunHookDefinitions ) .forEach((testRunHookDefinition: TestRunHookDefinition) => { - eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - hook: { - id: testRunHookDefinition.id, - sourceReference: { - uri: testRunHookDefinition.uri, - location: { - line: testRunHookDefinition.line, - }, + const envelope: messages.Envelope = { + hook: { + id: testRunHookDefinition.id, + sourceReference: { + uri: testRunHookDefinition.uri, + location: { + line: testRunHookDefinition.line, }, }, - }) - ) + }, + } + eventBroadcaster.emit('envelope', envelope) }) } diff --git a/src/cli/helpers_spec.ts b/src/cli/helpers_spec.ts index cc21b00bb..4f4e0e640 100644 --- a/src/cli/helpers_spec.ts +++ b/src/cli/helpers_spec.ts @@ -7,7 +7,8 @@ import { } from './helpers' import { EventEmitter } from 'events' import PickleFilter from '../pickle_filter' -import { messages, IdGenerator } from '@cucumber/messages' +import * as messages from '@cucumber/messages' +import { IdGenerator, SourceMediaType } from '@cucumber/messages' import { EventDataCollector } from '../formatter/helpers' import { GherkinStreams } from '@cucumber/gherkin-streams' import { Readable } from 'stream' @@ -34,14 +35,14 @@ interface ITestParseGherkinMessageStreamRequest { } interface ITestParseGherkinMessageStreamResponse { - envelopes: messages.IEnvelope[] + envelopes: messages.Envelope[] result: string[] } async function testParseGherkinMessageStream( options: ITestParseGherkinMessageStreamRequest ): Promise { - const envelopes: messages.IEnvelope[] = [] + const envelopes: messages.Envelope[] = [] const eventBroadcaster = new EventEmitter() eventBroadcaster.on('envelope', (e) => envelopes.push(e)) const eventDataCollector = new EventDataCollector(eventBroadcaster) @@ -58,8 +59,8 @@ async function testParseGherkinMessageStream( function testEmitSupportCodeMessages( supportCode: Partial -): messages.IEnvelope[] { - const envelopes: messages.IEnvelope[] = [] +): messages.Envelope[] { + const envelopes: messages.Envelope[] = [] const eventBroadcaster = new EventEmitter() eventBroadcaster.on('envelope', (e) => envelopes.push(e)) emitSupportCodeMessages({ @@ -88,7 +89,7 @@ function testEmitSupportCodeMessages( describe('helpers', () => { describe('emitMetaMessage', () => { it('emits a meta message', async () => { - const envelopes: messages.IEnvelope[] = [] + const envelopes: messages.Envelope[] = [] const eventBroadcaster = new EventEmitter() eventBroadcaster.on('envelope', (e) => envelopes.push(e)) await emitMetaMessage(eventBroadcaster) @@ -115,8 +116,8 @@ describe('helpers', () => { parameterTypeRegistry, }) - expect(envelopes).to.deep.eq([ - messages.Envelope.fromObject({ + const expectedEnvelopes: messages.Envelope[] = [ + { parameterType: { id: '0', name: 'flight', @@ -124,9 +125,11 @@ describe('helpers', () => { regularExpressions: ['([A-Z]{3})-([A-Z]{3})'], useForSnippets: true, }, - }), - ]) + }, + ] + expect(envelopes).to.deep.eq(expectedEnvelopes) }) + it('emits messages for step definitions using cucumber expressions', () => { const envelopes = testEmitSupportCodeMessages({ stepDefinitions: [ @@ -146,15 +149,13 @@ describe('helpers', () => { ], }) - expect(envelopes).to.deep.eq([ - messages.Envelope.fromObject({ + const expectedEnvelopes: messages.Envelope[] = [ + { stepDefinition: { id: '0', pattern: { source: 'I have {int} cukes in my belly', - type: - messages.StepDefinition.StepDefinitionPattern - .StepDefinitionPatternType.CUCUMBER_EXPRESSION, + type: messages.StepDefinitionPatternType.CUCUMBER_EXPRESSION, }, sourceReference: { uri: 'features/support/cukes.js', @@ -163,8 +164,9 @@ describe('helpers', () => { }, }, }, - }), - ]) + }, + ] + expect(envelopes).to.deep.eq(expectedEnvelopes) }) it('emits messages for step definitions using regular expressions', () => { const envelopes = testEmitSupportCodeMessages({ @@ -185,15 +187,13 @@ describe('helpers', () => { ], }) - expect(envelopes).to.deep.eq([ - messages.Envelope.fromObject({ + const expectedEnvelopes: messages.Envelope[] = [ + { stepDefinition: { id: '0', pattern: { source: '/I have (\\d+) cukes in my belly/', - type: - messages.StepDefinition.StepDefinitionPattern - .StepDefinitionPatternType.REGULAR_EXPRESSION, + type: messages.StepDefinitionPatternType.REGULAR_EXPRESSION, }, sourceReference: { uri: 'features/support/cukes.js', @@ -202,8 +202,9 @@ describe('helpers', () => { }, }, }, - }), - ]) + }, + ] + expect(envelopes).to.deep.eq(expectedEnvelopes) }) it('emits messages for test case level hooks', () => { const envelopes = testEmitSupportCodeMessages({ @@ -239,8 +240,8 @@ describe('helpers', () => { ], }) - expect(envelopes).to.deep.eq([ - messages.Envelope.fromObject({ + const expectedEnvelopes: messages.Envelope[] = [ + { hook: { id: '0', tagExpression: '@hooks-tho', @@ -251,10 +252,11 @@ describe('helpers', () => { }, }, }, - }), - messages.Envelope.fromObject({ + }, + { hook: { id: '1', + tagExpression: undefined, sourceReference: { uri: 'features/support/hooks.js', location: { @@ -262,10 +264,11 @@ describe('helpers', () => { }, }, }, - }), - messages.Envelope.fromObject({ + }, + { hook: { id: '2', + tagExpression: undefined, sourceReference: { uri: 'features/support/hooks.js', location: { @@ -273,8 +276,9 @@ describe('helpers', () => { }, }, }, - }), - ]) + }, + ] + expect(envelopes).to.deep.eq(expectedEnvelopes) }) it('emits messages for test run level hooks', () => { const envelopes = testEmitSupportCodeMessages({ @@ -308,8 +312,8 @@ describe('helpers', () => { ], }) - expect(envelopes).to.deep.eq([ - messages.Envelope.fromObject({ + const expectedEnvelopes: messages.Envelope[] = [ + { hook: { id: '0', sourceReference: { @@ -319,8 +323,8 @@ describe('helpers', () => { }, }, }, - }), - messages.Envelope.fromObject({ + }, + { hook: { id: '1', sourceReference: { @@ -330,8 +334,8 @@ describe('helpers', () => { }, }, }, - }), - messages.Envelope.fromObject({ + }, + { hook: { id: '2', sourceReference: { @@ -341,8 +345,9 @@ describe('helpers', () => { }, }, }, - }), - ]) + }, + ] + expect(envelopes).to.deep.eq(expectedEnvelopes) }) }) describe('parseGherkinMessageStream', () => { @@ -350,13 +355,13 @@ describe('helpers', () => { it('emits source and gherkinDocument events and returns an empty array', async function () { // Arrange const cwd = '/project' - const sourceEnvelope = messages.Envelope.create({ - source: messages.Source.fromObject({ + const sourceEnvelope: messages.Envelope = { + source: { data: '', - mediaType: 'text/x.cucumber.gherkin+plain', + mediaType: SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN, uri: '/project/features/a.feature', - }), - }) + }, + } const gherkinMessageStream = GherkinStreams.fromSources( [sourceEnvelope], {} @@ -377,7 +382,11 @@ describe('helpers', () => { expect(envelopes).to.have.lengthOf(2) expect(envelopes[0]).to.eql(sourceEnvelope) expect(envelopes[1].gherkinDocument).to.exist() - expect(envelopes[1].gherkinDocument).to.have.keys(['comments', 'uri']) + expect(envelopes[1].gherkinDocument).to.have.keys([ + 'comments', + 'feature', + 'uri', + ]) }) }) @@ -385,13 +394,13 @@ describe('helpers', () => { it('emits pickle event and returns an empty array', async function () { // Arrange const cwd = '/project' - const sourceEnvelope = messages.Envelope.create({ - source: messages.Source.fromObject({ + const sourceEnvelope: messages.Envelope = { + source: { data: '@tagA\nFeature: a\nScenario: b\nGiven a step', - mediaType: 'text/x.cucumber.gherkin+plain', + mediaType: SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN, uri: '/project/features/a.feature', - }), - }) + }, + } const gherkinMessageStream = GherkinStreams.fromSources( [sourceEnvelope], {} @@ -432,13 +441,13 @@ describe('helpers', () => { it('emits pickle and returns the pickleId', async function () { // Arrange const cwd = '/project' - const sourceEnvelope = messages.Envelope.create({ - source: messages.Source.fromObject({ + const sourceEnvelope: messages.Envelope = { + source: { data: 'Feature: a\nScenario: b\nGiven a step', - mediaType: 'text/x.cucumber.gherkin+plain', + mediaType: SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN, uri: '/project/features/a.feature', - }), - }) + }, + } const gherkinMessageStream = GherkinStreams.fromSources( [sourceEnvelope], {} diff --git a/src/cli/index.ts b/src/cli/index.ts index 25020be63..9db169ad4 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -159,7 +159,14 @@ export default class Cli { }: IGetSupportCodeLibraryRequest): ISupportCodeLibrary { supportCodeRequiredModules.map((module) => require(module)) supportCodeLibraryBuilder.reset(this.cwd, newId) - supportCodePaths.forEach((codePath) => require(codePath)) + supportCodePaths.forEach((codePath) => { + try { + require(codePath) + } catch (e) { + console.error(e.stack) + console.error('codepath: ' + codePath) + } + }) return supportCodeLibraryBuilder.finalize() } diff --git a/src/formatter/get_color_fns.ts b/src/formatter/get_color_fns.ts index d7f783c51..bdcd228ec 100644 --- a/src/formatter/get_color_fns.ts +++ b/src/formatter/get_color_fns.ts @@ -1,16 +1,13 @@ import _ from 'lodash' import colors from 'colors/safe' -import Status from '../status' -import { messages } from '@cucumber/messages' +import { TestStepResultStatus } from '@cucumber/messages' colors.enable() export type IColorFn = (text: string) => string export interface IColorFns { - forStatus: ( - status: messages.TestStepFinished.TestStepResult.Status - ) => IColorFn + forStatus: (status: TestStepResultStatus) => IColorFn location: IColorFn tag: IColorFn } @@ -18,15 +15,15 @@ export interface IColorFns { export default function getColorFns(enabled: boolean): IColorFns { if (enabled) { return { - forStatus(status: messages.TestStepFinished.TestStepResult.Status) { + forStatus(status: TestStepResultStatus) { return { - [Status.AMBIGUOUS]: colors.red.bind(colors), - [Status.FAILED]: colors.red.bind(colors), - [Status.PASSED]: colors.green.bind(colors), - [Status.PENDING]: colors.yellow.bind(colors), - [Status.SKIPPED]: colors.cyan.bind(colors), - [Status.UNDEFINED]: colors.yellow.bind(colors), - [Status.UNKNOWN]: colors.yellow.bind(colors), + AMBIGUOUS: colors.red.bind(colors), + FAILED: colors.red.bind(colors), + PASSED: colors.green.bind(colors), + PENDING: colors.yellow.bind(colors), + SKIPPED: colors.cyan.bind(colors), + UNDEFINED: colors.yellow.bind(colors), + UNKNOWN: colors.yellow.bind(colors), }[status] }, location: colors.gray.bind(colors), @@ -34,7 +31,7 @@ export default function getColorFns(enabled: boolean): IColorFns { } } else { return { - forStatus(status: messages.TestStepFinished.TestStepResult.Status) { + forStatus(status: TestStepResultStatus) { return _.identity }, location: _.identity, diff --git a/src/formatter/helpers/event_data_collector.ts b/src/formatter/helpers/event_data_collector.ts index c9af1aa3d..db1e0365c 100644 --- a/src/formatter/helpers/event_data_collector.ts +++ b/src/formatter/helpers/event_data_collector.ts @@ -1,44 +1,42 @@ import _, { values } from 'lodash' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { doesHaveValue, doesNotHaveValue } from '../../value_checker' import { EventEmitter } from 'events' -import { Query } from '@cucumber/query' interface ITestCaseAttemptData { attempt: number testCaseId: string - stepAttachments: Record - stepResults: Record - worstTestStepResult: messages.TestStepFinished.ITestStepResult + stepAttachments: Record + stepResults: Record + worstTestStepResult: messages.TestStepResult } export interface ITestCaseAttempt { attempt: number - gherkinDocument: messages.IGherkinDocument - pickle: messages.IPickle - stepAttachments: Record - stepResults: Record - testCase: messages.ITestCase - worstTestStepResult: messages.TestStepFinished.ITestStepResult + gherkinDocument: messages.GherkinDocument + pickle: messages.Pickle + stepAttachments: Record + stepResults: Record + testCase: messages.TestCase + worstTestStepResult: messages.TestStepResult } export default class EventDataCollector { - private gherkinDocumentMap: Record = {} - private pickleMap: Record = {} - private testCaseMap: Record = {} + private gherkinDocumentMap: Record = {} + private pickleMap: Record = {} + private testCaseMap: Record = {} private testCaseAttemptDataMap: Record = {} - readonly undefinedParameterTypes: messages.IUndefinedParameterType[] = [] - readonly query = new Query() + readonly undefinedParameterTypes: messages.UndefinedParameterType[] = [] constructor(eventBroadcaster: EventEmitter) { eventBroadcaster.on('envelope', this.parseEnvelope.bind(this)) } - getGherkinDocument(uri: string): messages.IGherkinDocument { + getGherkinDocument(uri: string): messages.GherkinDocument { return this.gherkinDocumentMap[uri] } - getPickle(pickleId: string): messages.IPickle { + getPickle(pickleId: string): messages.Pickle { return this.pickleMap[pickleId] } @@ -64,7 +62,6 @@ export default class EventDataCollector { } parseEnvelope(envelope: messages.Envelope): void { - this.query.update(envelope) if (doesHaveValue(envelope.gherkinDocument)) { this.gherkinDocumentMap[envelope.gherkinDocument.uri] = envelope.gherkinDocument @@ -85,28 +82,29 @@ export default class EventDataCollector { } } - initTestCaseAttempt(testCaseStarted: messages.ITestCaseStarted): void { + private initTestCaseAttempt(testCaseStarted: messages.TestCaseStarted): void { this.testCaseAttemptDataMap[testCaseStarted.id] = { attempt: testCaseStarted.attempt, testCaseId: testCaseStarted.testCaseId, stepAttachments: {}, stepResults: {}, - worstTestStepResult: {}, + worstTestStepResult: { + willBeRetried: false, + duration: { seconds: 0, nanos: 0 }, + status: messages.TestStepResultStatus.UNKNOWN, + }, } } - storeAttachment({ - testCaseStartedId, - testStepId, - body, - mediaType, - }: messages.IAttachment): void { + storeAttachment(attachment: messages.Attachment): void { + const { testCaseStartedId, testStepId } = attachment + // TODO: we shouldn't have to check if these properties have values - they are non-nullable if (doesHaveValue(testCaseStartedId) && doesHaveValue(testStepId)) { const { stepAttachments } = this.testCaseAttemptDataMap[testCaseStartedId] if (doesNotHaveValue(stepAttachments[testStepId])) { stepAttachments[testStepId] = [] } - stepAttachments[testStepId].push({ body, mediaType }) + stepAttachments[testStepId].push(attachment) } } @@ -114,18 +112,18 @@ export default class EventDataCollector { testCaseStartedId, testStepId, testStepResult, - }: messages.ITestStepFinished): void { + }: messages.TestStepFinished): void { this.testCaseAttemptDataMap[testCaseStartedId].stepResults[ testStepId ] = testStepResult } - storeTestCaseResult({ testCaseStartedId }: messages.ITestCaseFinished): void { + storeTestCaseResult({ testCaseStartedId }: messages.TestCaseFinished): void { const stepResults = values( this.testCaseAttemptDataMap[testCaseStartedId].stepResults ) this.testCaseAttemptDataMap[ testCaseStartedId - ].worstTestStepResult = this.query.getWorstTestStepResult(stepResults) + ].worstTestStepResult = messages.getWorstTestStepResult(stepResults) } } diff --git a/src/formatter/helpers/gherkin_document_parser.ts b/src/formatter/helpers/gherkin_document_parser.ts index 72624edf9..ead172647 100644 --- a/src/formatter/helpers/gherkin_document_parser.ts +++ b/src/formatter/helpers/gherkin_document_parser.ts @@ -1,26 +1,23 @@ import _ from 'lodash' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { doesHaveValue } from '../../value_checker' export function getGherkinStepMap( - gherkinDocument: messages.IGherkinDocument -): Record { + gherkinDocument: messages.GherkinDocument +): Record { return _.chain(gherkinDocument.feature.children) .map(extractStepContainers) .flatten() .map('steps') .flatten() - .map((step: messages.GherkinDocument.Feature.IStep) => [step.id, step]) + .map((step: messages.Step) => [step.id, step]) .fromPairs() .value() } function extractStepContainers( - child: messages.GherkinDocument.Feature.IFeatureChild -): Array< - | messages.GherkinDocument.Feature.IScenario - | messages.GherkinDocument.Feature.IBackground -> { + child: messages.FeatureChild +): Array { if (doesHaveValue(child.background)) { return [child.background] } else if (doesHaveValue(child.rule)) { @@ -34,10 +31,10 @@ function extractStepContainers( } export function getGherkinScenarioMap( - gherkinDocument: messages.IGherkinDocument -): Record { + gherkinDocument: messages.GherkinDocument +): Record { return _.chain(gherkinDocument.feature.children) - .map((child: messages.GherkinDocument.Feature.IFeatureChild) => { + .map((child: messages.FeatureChild) => { if (doesHaveValue(child.rule)) { return child.rule.children } @@ -46,17 +43,14 @@ export function getGherkinScenarioMap( .flatten() .filter('scenario') .map('scenario') - .map((scenario: messages.GherkinDocument.Feature.IScenario) => [ - scenario.id, - scenario, - ]) + .map((scenario: messages.Scenario) => [scenario.id, scenario]) .fromPairs() .value() } export function getGherkinExampleRuleMap( - gherkinDocument: messages.IGherkinDocument -): Record { + gherkinDocument: messages.GherkinDocument +): Record { return _.chain(gherkinDocument.feature.children) .filter('rule') .map('rule') @@ -71,26 +65,23 @@ export function getGherkinExampleRuleMap( } export function getGherkinScenarioLocationMap( - gherkinDocument: messages.IGherkinDocument -): Record { - const locationMap: Record = {} - const scenarioMap: Record< - string, - messages.GherkinDocument.Feature.IScenario - > = getGherkinScenarioMap(gherkinDocument) - _.entries(scenarioMap).forEach( - ([id, scenario]) => { - locationMap[id] = scenario.location - if (doesHaveValue(scenario.examples)) { - _.chain(scenario.examples) - .map('tableBody') - .flatten() - .forEach((tableRow) => { - locationMap[tableRow.id] = tableRow.location - }) - .value() - } - } + gherkinDocument: messages.GherkinDocument +): Record { + const locationMap: Record = {} + const scenarioMap: Record = getGherkinScenarioMap( + gherkinDocument ) + _.entries(scenarioMap).forEach(([id, scenario]) => { + locationMap[id] = scenario.location + if (doesHaveValue(scenario.examples)) { + _.chain(scenario.examples) + .map('tableBody') + .flatten() + .forEach((tableRow) => { + locationMap[tableRow.id] = tableRow.location + }) + .value() + } + }) return locationMap } diff --git a/src/formatter/helpers/gherkin_document_parser_spec.ts b/src/formatter/helpers/gherkin_document_parser_spec.ts index 584743c22..fd243bcf4 100644 --- a/src/formatter/helpers/gherkin_document_parser_spec.ts +++ b/src/formatter/helpers/gherkin_document_parser_spec.ts @@ -10,8 +10,8 @@ import { IParsedSourceWithEnvelopes, parse, } from '../../../test/gherkin_helpers' -import { messages } from '@cucumber/messages' -import IGherkinDocument = messages.IGherkinDocument +import * as messages from '@cucumber/messages' +import IGherkinDocument = messages.GherkinDocument describe('GherkinDocumentParser', () => { describe('getGherkinStepMap', () => { diff --git a/src/formatter/helpers/issue_helpers.ts b/src/formatter/helpers/issue_helpers.ts index b2610c741..a2ae756fd 100644 --- a/src/formatter/helpers/issue_helpers.ts +++ b/src/formatter/helpers/issue_helpers.ts @@ -1,34 +1,27 @@ import indentString from 'indent-string' -import Status from '../../status' import { formatTestCaseAttempt } from './test_case_attempt_formatter' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { IColorFns } from '../get_color_fns' import StepDefinitionSnippetBuilder from '../step_definition_snippet_builder' import { ISupportCodeLibrary } from '../../support_code_library_builder/types' import { ITestCaseAttempt } from './event_data_collector' -export function isFailure( - result: messages.TestStepFinished.ITestStepResult -): boolean { +export function isFailure(result: messages.TestStepResult): boolean { return ( - result.status === Status.AMBIGUOUS || - result.status === Status.UNDEFINED || - (result.status === Status.FAILED && !result.willBeRetried) + result.status === 'AMBIGUOUS' || + result.status === 'UNDEFINED' || + (result.status === 'FAILED' && !result.willBeRetried) ) } -export function isWarning( - result: messages.TestStepFinished.ITestStepResult -): boolean { +export function isWarning(result: messages.TestStepResult): boolean { return ( - result.status === Status.PENDING || - (result.status === Status.FAILED && result.willBeRetried) + result.status === 'PENDING' || + (result.status === 'FAILED' && result.willBeRetried) ) } -export function isIssue( - result: messages.TestStepFinished.ITestStepResult -): boolean { +export function isIssue(result: messages.TestStepResult): boolean { return isFailure(result) || isWarning(result) } @@ -68,10 +61,10 @@ export function formatIssue({ } export function formatUndefinedParameterTypes( - undefinedParameterTypes: messages.IUndefinedParameterType[] + undefinedParameterTypes: messages.UndefinedParameterType[] ): string { const output = [`Undefined parameter types:\n\n`] - const withLatest: Record = {} + const withLatest: Record = {} undefinedParameterTypes.forEach((parameterType) => { withLatest[parameterType.name] = parameterType }) @@ -87,7 +80,7 @@ export function formatUndefinedParameterTypes( } export function formatUndefinedParameterType( - parameterType: messages.IUndefinedParameterType + parameterType: messages.UndefinedParameterType ): string { return `"${parameterType.name}" e.g. \`${parameterType.expression}\`` } diff --git a/src/formatter/helpers/pickle_parser.ts b/src/formatter/helpers/pickle_parser.ts index cd4b75c32..1ce57e16f 100644 --- a/src/formatter/helpers/pickle_parser.ts +++ b/src/formatter/helpers/pickle_parser.ts @@ -1,20 +1,20 @@ import _ from 'lodash' import { getGherkinScenarioLocationMap } from './gherkin_document_parser' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' export interface IGetPickleLocationRequest { - gherkinDocument: messages.IGherkinDocument - pickle: messages.IPickle + gherkinDocument: messages.GherkinDocument + pickle: messages.Pickle } export interface IGetStepKeywordRequest { - pickleStep: messages.Pickle.IPickleStep - gherkinStepMap: Record + pickleStep: messages.PickleStep + gherkinStepMap: Record } export interface IGetScenarioDescriptionRequest { - pickle: messages.IPickle - gherkinScenarioMap: Record + pickle: messages.Pickle + gherkinScenarioMap: Record } export function getScenarioDescription({ @@ -40,8 +40,8 @@ export function getStepKeyword({ } export function getPickleStepMap( - pickle: messages.IPickle -): Record { + pickle: messages.Pickle +): Record { return _.chain(pickle.steps) .map((pickleStep) => [pickleStep.id, pickleStep]) .fromPairs() @@ -51,7 +51,7 @@ export function getPickleStepMap( export function getPickleLocation({ gherkinDocument, pickle, -}: IGetPickleLocationRequest): messages.ILocation { +}: IGetPickleLocationRequest): messages.Location { const gherkinScenarioLocationMap = getGherkinScenarioLocationMap( gherkinDocument ) diff --git a/src/formatter/helpers/step_argument_formatter.ts b/src/formatter/helpers/step_argument_formatter.ts index 1146e8cbf..7381056cc 100644 --- a/src/formatter/helpers/step_argument_formatter.ts +++ b/src/formatter/helpers/step_argument_formatter.ts @@ -1,10 +1,8 @@ import Table from 'cli-table3' import { parseStepArgument } from '../../step_arguments' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' -function formatDataTable( - dataTable: messages.PickleStepArgument.IPickleTable -): string { +function formatDataTable(dataTable: messages.PickleTable): string { const table = new Table({ chars: { bottom: '', @@ -38,13 +36,11 @@ function formatDataTable( return table.toString() } -function formatDocString( - docString: messages.PickleStepArgument.IPickleDocString -): string { +function formatDocString(docString: messages.PickleDocString): string { return `"""\n${docString.content}\n"""` } -export function formatStepArgument(arg: messages.IPickleStepArgument): string { +export function formatStepArgument(arg: messages.PickleStepArgument): string { return parseStepArgument(arg, { dataTable: formatDataTable, docString: formatDocString, diff --git a/src/formatter/helpers/summary_helpers.ts b/src/formatter/helpers/summary_helpers.ts index c0dc0c3b3..1867a3fc6 100644 --- a/src/formatter/helpers/summary_helpers.ts +++ b/src/formatter/helpers/summary_helpers.ts @@ -1,24 +1,23 @@ import _ from 'lodash' import Duration from 'duration' -import Status from '../../status' -import { addDurations, getZeroDuration } from '../../time' import { IColorFns } from '../get_color_fns' import { ITestCaseAttempt } from './event_data_collector' -import { messages, TimeConversion } from '@cucumber/messages' +import * as messages from '@cucumber/messages' +import { doesHaveValue } from '../../value_checker' const STATUS_REPORT_ORDER = [ - Status.FAILED, - Status.AMBIGUOUS, - Status.UNDEFINED, - Status.PENDING, - Status.SKIPPED, - Status.PASSED, + messages.TestStepResultStatus.FAILED, + messages.TestStepResultStatus.AMBIGUOUS, + messages.TestStepResultStatus.UNDEFINED, + messages.TestStepResultStatus.PENDING, + messages.TestStepResultStatus.SKIPPED, + messages.TestStepResultStatus.PASSED, ] export interface IFormatSummaryRequest { colorFns: IColorFns testCaseAttempts: ITestCaseAttempt[] - testRunDuration: messages.IDuration + testRunDuration: messages.Duration } export function formatSummary({ @@ -26,17 +25,20 @@ export function formatSummary({ testCaseAttempts, testRunDuration, }: IFormatSummaryRequest): string { - const testCaseResults: messages.TestStepFinished.ITestStepResult[] = [] - const testStepResults: messages.TestStepFinished.ITestStepResult[] = [] - let totalStepDuration = getZeroDuration() + const testCaseResults: messages.TestStepResult[] = [] + const testStepResults: messages.TestStepResult[] = [] + let totalStepDuration = messages.TimeConversion.millisecondsToDuration(0) testCaseAttempts.forEach(({ testCase, worstTestStepResult, stepResults }) => { Object.values(stepResults).forEach((stepResult) => { - totalStepDuration = addDurations(totalStepDuration, stepResult.duration) + totalStepDuration = messages.TimeConversion.addDurations( + totalStepDuration, + stepResult.duration + ) }) if (!worstTestStepResult.willBeRetried) { testCaseResults.push(worstTestStepResult) _.each(testCase.testSteps, (testStep) => { - if (testStep.pickleStepId !== '') { + if (doesHaveValue(testStep.pickleStepId)) { testStepResults.push(stepResults[testStep.id]) } }) @@ -60,7 +62,7 @@ export function formatSummary({ interface IGetCountSummaryRequest { colorFns: IColorFns - objects: messages.TestStepFinished.ITestStepResult[] + objects: messages.TestStepResult[] type: string } @@ -78,7 +80,7 @@ function getCountSummary({ if (counts[status] > 0) { details.push( colorFns.forStatus(status)( - `${counts[status].toString()} ${Status[status].toLowerCase()}` + `${counts[status].toString()} ${status.toLowerCase()}` ) ) } @@ -88,9 +90,11 @@ function getCountSummary({ return text } -function getDurationSummary(durationMsg: messages.IDuration): string { +function getDurationSummary(durationMsg: messages.Duration): string { const start = new Date(0) - const end = new Date(TimeConversion.durationToMilliseconds(durationMsg)) + const end = new Date( + messages.TimeConversion.durationToMilliseconds(durationMsg) + ) const duration = new Duration(start, end) // Use spaces in toString method for readability and to avoid %Ls which is a format return duration.toString('%Ms m %S . %L s').replace(/ /g, '') diff --git a/src/formatter/helpers/summary_helpers_spec.ts b/src/formatter/helpers/summary_helpers_spec.ts index 79c6957b3..bc3dba4be 100644 --- a/src/formatter/helpers/summary_helpers_spec.ts +++ b/src/formatter/helpers/summary_helpers_spec.ts @@ -10,14 +10,14 @@ import { buildSupportCodeLibrary } from '../../../test/runtime_helpers' import { IRuntimeOptions } from '../../runtime' import { ISupportCodeLibrary } from '../../support_code_library_builder/types' import { doesNotHaveValue } from '../../value_checker' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' interface ITestFormatSummaryOptions { runtimeOptions?: Partial sourceData: string supportCodeLibrary?: ISupportCodeLibrary - testRunStarted?: messages.ITestRunStarted - testRunFinished?: messages.ITestRunFinished + testRunStarted?: messages.TestRunStarted + testRunFinished?: messages.TestRunFinished } async function testFormatSummary({ @@ -37,20 +37,15 @@ async function testFormatSummary({ supportCodeLibrary = getBaseSupportCodeLibrary() } if (doesNotHaveValue(testRunStarted)) { - testRunStarted = messages.TestRunStarted.fromObject({ - timestamp: { - nanos: 0, - seconds: 0, - }, - }) + testRunStarted = { + timestamp: messages.TimeConversion.millisecondsSinceEpochToTimestamp(0), + } } if (doesNotHaveValue(testRunFinished)) { - testRunFinished = messages.TestRunFinished.fromObject({ - timestamp: { - nanos: 0, - seconds: 0, - }, - }) + testRunFinished = { + timestamp: messages.TimeConversion.millisecondsSinceEpochToTimestamp(0), + success: true, + } } const testCaseAttempts = await getTestCaseAttempts({ runtimeOptions, @@ -255,18 +250,19 @@ describe('SummaryHelpers', () => { const output = await testFormatSummary({ sourceData, supportCodeLibrary, - testRunStarted: messages.TestRunStarted.fromObject({ + testRunStarted: { timestamp: { nanos: 0, seconds: 3, }, - }), - testRunFinished: messages.TestRunFinished.fromObject({ + }, + testRunFinished: { timestamp: { nanos: 124000000, seconds: 3, }, - }), + success: true, + }, }) // Assert @@ -298,12 +294,13 @@ describe('SummaryHelpers', () => { const output = await testFormatSummary({ sourceData, supportCodeLibrary, - testRunFinished: messages.TestRunFinished.fromObject({ + testRunFinished: { timestamp: { nanos: 400000000, seconds: 12, }, - }), + success: true, + }, }) // Assert @@ -335,12 +332,13 @@ describe('SummaryHelpers', () => { const output = await testFormatSummary({ sourceData, supportCodeLibrary, - testRunFinished: messages.TestRunFinished.fromObject({ + testRunFinished: { timestamp: { nanos: 0, seconds: 124, }, - }), + success: true, + }, }) // Assert @@ -378,12 +376,13 @@ describe('SummaryHelpers', () => { const output = await testFormatSummary({ sourceData, supportCodeLibrary, - testRunFinished: messages.TestRunFinished.fromObject({ + testRunFinished: { timestamp: { nanos: 0, seconds: 24, }, - }), + success: true, + }, }) // Assert diff --git a/src/formatter/helpers/test_case_attempt_formatter.ts b/src/formatter/helpers/test_case_attempt_formatter.ts index bbacf5095..bc1319644 100644 --- a/src/formatter/helpers/test_case_attempt_formatter.ts +++ b/src/formatter/helpers/test_case_attempt_formatter.ts @@ -1,5 +1,5 @@ import indentString from 'indent-string' -import Status from '../../status' +import * as messages from '@cucumber/messages' import figures from 'figures' import { formatLocation } from './location_helpers' import { @@ -13,25 +13,25 @@ import { ITestCaseAttempt } from './event_data_collector' import StepDefinitionSnippetBuilder from '../step_definition_snippet_builder' import { ISupportCodeLibrary } from '../../support_code_library_builder/types' -const CHARACTERS: { [status: number]: string } = { - [Status.AMBIGUOUS]: figures.cross, - [Status.FAILED]: figures.cross, - [Status.PASSED]: figures.tick, - [Status.PENDING]: '?', - [Status.SKIPPED]: '-', - [Status.UNDEFINED]: '?', -} +const CHARACTERS: Map = new Map([ + [messages.TestStepResultStatus.AMBIGUOUS, figures.cross], + [messages.TestStepResultStatus.FAILED, figures.cross], + [messages.TestStepResultStatus.PASSED, figures.tick], + [messages.TestStepResultStatus.PENDING, '?'], + [messages.TestStepResultStatus.SKIPPED, '-'], + [messages.TestStepResultStatus.UNDEFINED, '?'], +]) function getStepMessage(testStep: IParsedTestStep): string { switch (testStep.result.status) { - case Status.AMBIGUOUS: - case Status.FAILED: + case messages.TestStepResultStatus.AMBIGUOUS: + case messages.TestStepResultStatus.FAILED: return testStep.result.message - case Status.UNDEFINED: + case messages.TestStepResultStatus.UNDEFINED: return `${ 'Undefined. Implement with the following snippet:' + '\n\n' }${indentString(testStep.snippet, 2)}\n` - case Status.PENDING: + case messages.TestStepResultStatus.PENDING: return 'Pending' } return '' @@ -50,7 +50,7 @@ function formatStep({ colorFns, testStep }: IFormatStepRequest): string { } = testStep const colorFn = colorFns.forStatus(status) const identifier = testStep.keyword + valueOrDefault(testStep.text, '') - let text = colorFn(`${CHARACTERS[status]} ${identifier}`) + let text = colorFn(`${CHARACTERS.get(status)} ${identifier}`) if (doesHaveValue(actionLocation)) { text += ` # ${colorFns.location(formatLocation(actionLocation))}` } diff --git a/src/formatter/helpers/test_case_attempt_parser.ts b/src/formatter/helpers/test_case_attempt_parser.ts index 4b5548dc9..4181a7034 100644 --- a/src/formatter/helpers/test_case_attempt_parser.ts +++ b/src/formatter/helpers/test_case_attempt_parser.ts @@ -1,5 +1,4 @@ import _ from 'lodash' -import Status from '../../status' import { getStepKeywordType, KeywordType } from './keyword_type' import { getGherkinScenarioLocationMap, @@ -7,7 +6,7 @@ import { } from './gherkin_document_parser' import { getPickleStepMap, getStepKeyword } from './pickle_parser' import path from 'path' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { ITestCaseAttempt } from './event_data_collector' import StepDefinitionSnippetBuilder from '../step_definition_snippet_builder' import { ISupportCodeLibrary } from '../../support_code_library_builder/types' @@ -17,10 +16,10 @@ import { ILineAndUri } from '../../types' export interface IParsedTestStep { actionLocation?: ILineAndUri - argument?: messages.IPickleStepArgument - attachments: messages.IAttachment[] + argument?: messages.PickleStepArgument + attachments: messages.Attachment[] keyword: string - result: messages.TestStepFinished.ITestStepResult + result: messages.TestStepResult snippet?: string sourceLocation?: ILineAndUri text?: string @@ -30,7 +29,7 @@ export interface IParsedTestCase { attempt: number name: string sourceLocation?: ILineAndUri - worstTestStepResult: messages.TestStepFinished.ITestStepResult + worstTestStepResult: messages.TestStepResult } export interface IParsedTestCaseAttempt { @@ -40,16 +39,16 @@ export interface IParsedTestCaseAttempt { interface IParseStepRequest { isBeforeHook: boolean - gherkinStepMap: Record + gherkinStepMap: Record keyword: string keywordType: KeywordType - pickleStep: messages.Pickle.IPickleStep + pickleStep: messages.PickleStep pickleUri: string snippetBuilder: StepDefinitionSnippetBuilder supportCodeLibrary: ISupportCodeLibrary - testStep: messages.TestCase.ITestStep - testStepResult: messages.TestStepFinished.ITestStepResult - testStepAttachments: messages.IAttachment[] + testStep: messages.TestStep + testStepResult: messages.TestStepResult + testStepAttachments: messages.Attachment[] } function parseStep({ @@ -67,15 +66,14 @@ function parseStep({ }: IParseStepRequest): IParsedTestStep { const out: IParsedTestStep = { attachments: testStepAttachments, - keyword: - testStep.pickleStepId !== '' - ? keyword - : isBeforeHook - ? 'Before' - : 'After', + keyword: doesHaveValue(testStep.pickleStepId) + ? keyword + : isBeforeHook + ? 'Before' + : 'After', result: testStepResult, } - if (testStep.hookId !== '') { + if (doesHaveValue(testStep.hookId)) { let hookDefinition: TestCaseHookDefinition if (isBeforeHook) { hookDefinition = supportCodeLibrary.beforeTestCaseHookDefinitions.find( @@ -103,7 +101,7 @@ function parseStep({ line: stepDefinition.line, } } - if (testStep.pickleStepId !== '') { + if (doesHaveValue(testStep.pickleStepId)) { out.sourceLocation = { uri: pickleUri, line: gherkinStepMap[pickleStep.astNodeIds[0]].location.line, @@ -113,7 +111,7 @@ function parseStep({ out.argument = pickleStep.argument } } - if (testStepResult.status === Status.UNDEFINED) { + if (testStepResult.status === messages.TestStepResultStatus.UNDEFINED) { out.snippet = snippetBuilder.build({ keywordType, pickleStep }) } return out @@ -155,9 +153,9 @@ export function parseTestCaseAttempt({ let previousKeywordType = KeywordType.Precondition _.each(testCase.testSteps, (testStep) => { const testStepResult = testCaseAttempt.stepResults[testStep.id] - isBeforeHook = isBeforeHook && testStep.hookId !== '' + isBeforeHook = isBeforeHook && doesHaveValue(testStep.hookId) let keyword, keywordType, pickleStep - if (testStep.pickleStepId !== '') { + if (doesHaveValue(testStep.pickleStepId)) { pickleStep = pickleStepMap[testStep.pickleStepId] keyword = getStepKeyword({ pickleStep, gherkinStepMap }) keywordType = getStepKeywordType({ diff --git a/src/formatter/helpers/usage_helpers/index.ts b/src/formatter/helpers/usage_helpers/index.ts index 80f9f277d..a5fa528e6 100644 --- a/src/formatter/helpers/usage_helpers/index.ts +++ b/src/formatter/helpers/usage_helpers/index.ts @@ -2,14 +2,13 @@ import _ from 'lodash' import { getPickleStepMap } from '../pickle_parser' import path from 'path' import { getGherkinStepMap } from '../gherkin_document_parser' -import { durationToMilliseconds, millisecondsToDuration } from '../../../time' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import StepDefinition from '../../../models/step_definition' import { doesHaveValue } from '../../../value_checker' import EventDataCollector from '../event_data_collector' export interface IUsageMatch { - duration?: messages.IDuration + duration?: messages.Duration line: number text: string uri: string @@ -19,7 +18,7 @@ export interface IUsage { code: string line: number matches: IUsageMatch[] - meanDuration?: messages.IDuration + meanDuration?: messages.Duration pattern: string patternType: string uri: string @@ -48,6 +47,12 @@ function buildEmptyMapping( return mapping } +const unexecutedStatuses: readonly messages.TestStepResultStatus[] = [ + messages.TestStepResultStatus.AMBIGUOUS, + messages.TestStepResultStatus.SKIPPED, + messages.TestStepResultStatus.UNDEFINED, +] + function buildMapping({ cwd, stepDefinitions, @@ -59,7 +64,7 @@ function buildMapping({ const gherkinStepMap = getGherkinStepMap(testCaseAttempt.gherkinDocument) testCaseAttempt.testCase.testSteps.forEach((testStep) => { if ( - testStep.pickleStepId !== '' && + doesHaveValue(testStep.pickleStepId) && testStep.stepDefinitionIds.length === 1 ) { const stepDefinitionId = testStep.stepDefinitionIds[0] @@ -71,14 +76,7 @@ function buildMapping({ uri: path.relative(cwd, testCaseAttempt.pickle.uri), } const { duration, status } = testCaseAttempt.stepResults[testStep.id] - if ( - ![ - messages.TestStepFinished.TestStepResult.Status.AMBIGUOUS, - messages.TestStepFinished.TestStepResult.Status.SKIPPED, - messages.TestStepFinished.TestStepResult.Status.UNDEFINED, - ].includes(status) && - doesHaveValue(duration) - ) { + if (!unexecutedStatuses.includes(status) && doesHaveValue(duration)) { match.duration = duration } if (doesHaveValue(mapping[stepDefinitionId])) { @@ -90,9 +88,9 @@ function buildMapping({ return mapping } -function invertDuration(duration: messages.IDuration): number { +function invertDuration(duration: messages.Duration): number { if (doesHaveValue(duration)) { - return -1 * durationToMilliseconds(duration) + return -1 * messages.TimeConversion.durationToMilliseconds(duration) } return 1 } @@ -105,14 +103,14 @@ function buildResult(mapping: Record): IUsage[] { 'text', ]) const result = { matches: sortedMatches, ...rest } - const durations: messages.IDuration[] = _.chain(matches) + const durations: messages.Duration[] = _.chain(matches) .map((m: IUsageMatch) => m.duration) .compact() .value() if (durations.length > 0) { - result.meanDuration = millisecondsToDuration( - _.meanBy(durations, (d: messages.IDuration) => - durationToMilliseconds(d) + result.meanDuration = messages.TimeConversion.millisecondsToDuration( + _.meanBy(durations, (d: messages.Duration) => + messages.TimeConversion.durationToMilliseconds(d) ) ) } diff --git a/src/formatter/html_formatter.ts b/src/formatter/html_formatter.ts index af2e2ab62..5bc15289a 100644 --- a/src/formatter/html_formatter.ts +++ b/src/formatter/html_formatter.ts @@ -1,5 +1,5 @@ import Formatter, { IFormatterOptions } from '.' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import resolvePkg from 'resolve-pkg' import CucumberHtmlStream from '@cucumber/html-formatter' import { doesHaveValue } from '../value_checker' diff --git a/src/formatter/json_formatter.ts b/src/formatter/json_formatter.ts index f5e752176..628cdcf78 100644 --- a/src/formatter/json_formatter.ts +++ b/src/formatter/json_formatter.ts @@ -1,10 +1,8 @@ import _ from 'lodash' import Formatter, { IFormatterOptions } from './' -import Status from '../status' import { formatLocation, GherkinDocumentParser, PickleParser } from './helpers' -import { durationToNanoseconds } from '../time' import path from 'path' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { getGherkinExampleRuleMap, getGherkinScenarioLocationMap, @@ -12,13 +10,6 @@ import { import { ITestCaseAttempt } from './helpers/event_data_collector' import { doesHaveValue, doesNotHaveValue } from '../value_checker' import { parseStepArgument } from '../step_arguments' -import ITag = messages.GherkinDocument.Feature.ITag -import IFeature = messages.GherkinDocument.IFeature -import IPickle = messages.IPickle -import IScenario = messages.GherkinDocument.Feature.IScenario -import IPickleTag = messages.Pickle.IPickleTag -import IEnvelope = messages.IEnvelope -import IRule = messages.GherkinDocument.Feature.FeatureChild.IRule const { getGherkinStepMap, getGherkinScenarioMap } = GherkinDocumentParser @@ -67,27 +58,27 @@ export interface IJsonTag { } interface IBuildJsonFeatureOptions { - feature: messages.GherkinDocument.IFeature + feature: messages.Feature elements: IJsonScenario[] uri: string } interface IBuildJsonScenarioOptions { - feature: messages.GherkinDocument.IFeature - gherkinScenarioMap: Record - gherkinExampleRuleMap: Record - gherkinScenarioLocationMap: Record - pickle: messages.IPickle + feature: messages.Feature + gherkinScenarioMap: Record + gherkinExampleRuleMap: Record + gherkinScenarioLocationMap: Record + pickle: messages.Pickle steps: IJsonStep[] } interface IBuildJsonStepOptions { isBeforeHook: boolean - gherkinStepMap: Record - pickleStepMap: Record - testStep: messages.TestCase.ITestStep - testStepAttachments: messages.IAttachment[] - testStepResult: messages.TestStepFinished.ITestStepResult + gherkinStepMap: Record + pickleStepMap: Record + testStep: messages.TestStep + testStepAttachments: messages.Attachment[] + testStepResult: messages.TestStepResult } interface UriToTestCaseAttemptsMap { @@ -97,26 +88,26 @@ interface UriToTestCaseAttemptsMap { export default class JsonFormatter extends Formatter { constructor(options: IFormatterOptions) { super(options) - options.eventBroadcaster.on('envelope', (envelope: IEnvelope) => { + options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => { if (doesHaveValue(envelope.testRunFinished)) { this.onTestRunFinished() } }) } - convertNameToId(obj: IFeature | IPickle): string { + convertNameToId(obj: messages.Feature | messages.Pickle): string { return obj.name.replace(/ /g, '-').toLowerCase() } - formatDataTable(dataTable: messages.PickleStepArgument.IPickleTable): any { + formatDataTable(dataTable: messages.PickleTable): any { return { rows: dataTable.rows.map((row) => ({ cells: _.map(row.cells, 'value') })), } } formatDocString( - docString: messages.PickleStepArgument.IPickleDocString, - gherkinStep: messages.GherkinDocument.Feature.IStep + docString: messages.PickleDocString, + gherkinStep: messages.Step ): any { return { content: docString.content, @@ -125,8 +116,8 @@ export default class JsonFormatter extends Formatter { } formatStepArgument( - stepArgument: messages.IPickleStepArgument, - gherkinStep: messages.GherkinDocument.Feature.IStep + stepArgument: messages.PickleStepArgument, + gherkinStep: messages.Step ): any { if (doesNotHaveValue(stepArgument)) { return [] @@ -166,7 +157,7 @@ export default class JsonFormatter extends Formatter { const pickleStepMap = getPickleStepMap(pickle) let isBeforeHook = true const steps = testCaseAttempt.testCase.testSteps.map((testStep) => { - isBeforeHook = isBeforeHook && testStep.pickleStepId === '' + isBeforeHook = isBeforeHook && !doesHaveValue(testStep.pickleStepId) return this.getStepData({ isBeforeHook, gherkinStepMap, @@ -240,9 +231,9 @@ export default class JsonFormatter extends Formatter { pickle, gherkinExampleRuleMap, }: { - feature: IFeature - pickle: IPickle - gherkinExampleRuleMap: Record + feature: messages.Feature + pickle: messages.Pickle + gherkinExampleRuleMap: Record }): string { let parts: any[] const rule = gherkinExampleRuleMap[pickle.astNodeIds[0]] @@ -263,7 +254,7 @@ export default class JsonFormatter extends Formatter { testStepResult, }: IBuildJsonStepOptions): IJsonStep { const data: IJsonStep = {} - if (testStep.pickleStepId !== '') { + if (doesHaveValue(testStep.pickleStepId)) { const pickleStep = pickleStepMap[testStep.pickleStepId] data.arguments = this.formatStepArgument( pickleStep.argument, @@ -276,18 +267,29 @@ export default class JsonFormatter extends Formatter { data.keyword = isBeforeHook ? 'Before' : 'After' data.hidden = true } - if (testStep.stepDefinitionIds.length === 1) { + if ( + doesHaveValue(testStep.stepDefinitionIds) && + testStep.stepDefinitionIds.length === 1 + ) { const stepDefinition = this.supportCodeLibrary.stepDefinitions.find( (s) => s.id === testStep.stepDefinitionIds[0] ) data.match = { location: formatLocation(stepDefinition) } } const { message, status } = testStepResult - data.result = { status: Status[status].toLowerCase() } + data.result = { + status: messages.TestStepResultStatus[status].toLowerCase(), + } if (doesHaveValue(testStepResult.duration)) { - data.result.duration = durationToNanoseconds(testStepResult.duration) + data.result.duration = + messages.TimeConversion.durationToMilliseconds( + testStepResult.duration + ) * 1000000 } - if (status === Status.FAILED && doesHaveValue(message)) { + if ( + status === messages.TestStepResultStatus.FAILED && + doesHaveValue(message) + ) { data.result.error_message = message } if (_.size(testStepAttachments) > 0) { @@ -299,7 +301,7 @@ export default class JsonFormatter extends Formatter { return data } - getFeatureTags(feature: IFeature): IJsonTag[] { + getFeatureTags(feature: messages.Feature): IJsonTag[] { return _.map(feature.tags, (tagData) => ({ name: tagData.name, line: tagData.location.line, @@ -311,25 +313,29 @@ export default class JsonFormatter extends Formatter { pickle, gherkinScenarioMap, }: { - feature: IFeature - pickle: IPickle - gherkinScenarioMap: Record + feature: messages.Feature + pickle: messages.Pickle + gherkinScenarioMap: Record }): IJsonTag[] { const scenario = gherkinScenarioMap[pickle.astNodeIds[0]] return pickle.tags.map( - (tagData: IPickleTag): IJsonTag => + (tagData: messages.PickleTag): IJsonTag => this.getScenarioTag(tagData, feature, scenario) ) } private getScenarioTag( - tagData: IPickleTag, - feature: IFeature, - scenario: IScenario + tagData: messages.PickleTag, + feature: messages.Feature, + scenario: messages.Scenario ): IJsonTag { - const byAstNodeId = (tag: ITag): Boolean => tag.id === tagData.astNodeId - const flatten = (acc: ITag[], val: ITag[]): ITag[] => acc.concat(val) + const byAstNodeId = (tag: messages.Tag): Boolean => + tag.id === tagData.astNodeId + const flatten = ( + acc: messages.Tag[], + val: messages.Tag[] + ): messages.Tag[] => acc.concat(val) const tag = feature.tags.find(byAstNodeId) || diff --git a/src/formatter/json_formatter_spec.ts b/src/formatter/json_formatter_spec.ts index b2ea144ed..9e03b4084 100644 --- a/src/formatter/json_formatter_spec.ts +++ b/src/formatter/json_formatter_spec.ts @@ -228,22 +228,36 @@ describe('JsonFormatter', () => { // Assert const steps = JSON.parse(output)[0].elements[0].steps - expect(steps[0]).to.eql({ + const expectedBefore = { hidden: true, keyword: 'Before', result: { duration: 0, status: 'passed', }, - }) - expect(steps[2]).to.eql({ + } + const expectedAfter = { hidden: true, keyword: 'After', result: { duration: 0, status: 'passed', }, - }) + } + const expectedStep = { + arguments: [] as any[], + keyword: 'Given ', + line: 3, + match: { + location: 'json_formatter_steps.ts:39', + }, + name: 'a passing step', + result: { + duration: 0, + status: 'passed', + }, + } + expect(steps).to.eql([expectedBefore, expectedStep, expectedAfter]) }) }) diff --git a/src/formatter/message_formatter.ts b/src/formatter/message_formatter.ts index c76453d9c..d464d1704 100644 --- a/src/formatter/message_formatter.ts +++ b/src/formatter/message_formatter.ts @@ -1,11 +1,11 @@ import Formatter, { IFormatterOptions } from '.' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' export default class MessageFormatter extends Formatter { constructor(options: IFormatterOptions) { super(options) options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => - this.log(JSON.stringify(envelope.toJSON()) + '\n') + this.log(JSON.stringify(envelope) + '\n') ) } } diff --git a/src/formatter/progress_bar_formatter.ts b/src/formatter/progress_bar_formatter.ts index 9bbffa0c1..3e7f4b35e 100644 --- a/src/formatter/progress_bar_formatter.ts +++ b/src/formatter/progress_bar_formatter.ts @@ -2,7 +2,7 @@ import { formatIssue, formatSummary, isIssue } from './helpers' import Formatter, { IFormatterOptions } from './' import ProgressBar from 'progress' import { WriteStream as TtyWriteStream } from 'tty' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { doesHaveValue, valueOrDefault } from '../value_checker' import { formatUndefinedParameterType } from './helpers/issue_helpers' import { durationBetweenTimestamps } from '../time' @@ -10,7 +10,7 @@ import { durationBetweenTimestamps } from '../time' // Inspired by https://github.com/thekompanee/fuubar and https://github.com/martinciu/fuubar-cucumber export default class ProgressBarFormatter extends Formatter { private numberOfSteps: number - private testRunStarted: messages.ITestRunStarted + private testRunStarted: messages.TestRunStarted private issueCount: number public progressBar: ProgressBar @@ -42,18 +42,18 @@ export default class ProgressBarFormatter extends Formatter { logProgress({ testStepId, testCaseStartedId, - }: messages.ITestStepFinished): void { + }: messages.TestStepFinished): void { const { testCase } = this.eventDataCollector.getTestCaseAttempt( testCaseStartedId ) const testStep = testCase.testSteps.find((s) => s.id === testStepId) - if (testStep.pickleStepId !== '') { + if (doesHaveValue(testStep.pickleStepId)) { this.progressBar.tick() } } logUndefinedParametertype( - parameterType: messages.IUndefinedParameterType + parameterType: messages.UndefinedParameterType ): void { this.log( `Undefined parameter type: ${formatUndefinedParameterType( @@ -62,7 +62,7 @@ export default class ProgressBarFormatter extends Formatter { ) } - logErrorIfNeeded(testCaseFinished: messages.ITestCaseFinished): void { + logErrorIfNeeded(testCaseFinished: messages.TestCaseFinished): void { const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt( testCaseFinished.testCaseStartedId ) @@ -88,7 +88,7 @@ export default class ProgressBarFormatter extends Formatter { } } - logSummary(testRunFinished: messages.ITestRunFinished): void { + logSummary(testRunFinished: messages.TestRunFinished): void { const testRunDuration = durationBetweenTimestamps( this.testRunStarted.timestamp, testRunFinished.timestamp @@ -102,7 +102,7 @@ export default class ProgressBarFormatter extends Formatter { ) } - parseEnvelope(envelope: messages.IEnvelope): void { + parseEnvelope(envelope: messages.Envelope): void { if (doesHaveValue(envelope.undefinedParameterType)) { this.logUndefinedParametertype(envelope.undefinedParameterType) } else if (doesHaveValue(envelope.pickle)) { diff --git a/src/formatter/progress_bar_formatter_spec.ts b/src/formatter/progress_bar_formatter_spec.ts index 9ff6712f4..78b76dd53 100644 --- a/src/formatter/progress_bar_formatter_spec.ts +++ b/src/formatter/progress_bar_formatter_spec.ts @@ -14,7 +14,7 @@ import { getBaseSupportCodeLibrary } from '../../test/fixtures/steps' import FakeTimers, { InstalledClock } from '@sinonjs/fake-timers' import timeMethods from '../time' import { IRuntimeOptions } from '../runtime' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { ISupportCodeLibrary } from '../support_code_library_builder/types' import ProgressBarFormatter from './progress_bar_formatter' import { doesHaveValue, doesNotHaveValue } from '../value_checker' @@ -24,7 +24,7 @@ import bluebird from 'bluebird' interface ITestProgressBarFormatterOptions { runtimeOptions?: Partial - shouldStopFn: (envelope: messages.IEnvelope) => boolean + shouldStopFn: (envelope: messages.Envelope) => boolean sources?: ITestSource[] supportCodeLibrary?: ISupportCodeLibrary } diff --git a/src/formatter/progress_formatter.ts b/src/formatter/progress_formatter.ts index 37f380a41..4e47fb21e 100644 --- a/src/formatter/progress_formatter.ts +++ b/src/formatter/progress_formatter.ts @@ -1,19 +1,21 @@ import SummaryFormatter from './summary_formatter' -import Status from '../status' import { doesHaveValue } from '../value_checker' import { IFormatterOptions } from './index' -import { messages } from '@cucumber/messages' -import IEnvelope = messages.IEnvelope -import ITestStepFinished = messages.ITestStepFinished +import * as messages from '@cucumber/messages' +import IEnvelope = messages.Envelope +import ITestStepFinished = messages.TestStepFinished -const STATUS_CHARACTER_MAPPING: { [key: number]: string } = { - [Status.AMBIGUOUS]: 'A', - [Status.FAILED]: 'F', - [Status.PASSED]: '.', - [Status.PENDING]: 'P', - [Status.SKIPPED]: '-', - [Status.UNDEFINED]: 'U', -} +const STATUS_CHARACTER_MAPPING: Map< + messages.TestStepResultStatus, + string +> = new Map([ + [messages.TestStepResultStatus.AMBIGUOUS, 'A'], + [messages.TestStepResultStatus.FAILED, 'F'], + [messages.TestStepResultStatus.PASSED, '.'], + [messages.TestStepResultStatus.PENDING, 'P'], + [messages.TestStepResultStatus.SKIPPED, '-'], + [messages.TestStepResultStatus.UNDEFINED, 'U'], +]) export default class ProgressFormatter extends SummaryFormatter { constructor(options: IFormatterOptions) { @@ -29,7 +31,7 @@ export default class ProgressFormatter extends SummaryFormatter { logProgress({ testStepResult: { status } }: ITestStepFinished): void { const character = this.colorFns.forStatus(status)( - STATUS_CHARACTER_MAPPING[status] + STATUS_CHARACTER_MAPPING.get(status) ) this.log(character) } diff --git a/src/formatter/rerun_formatter.ts b/src/formatter/rerun_formatter.ts index 5da4d2784..49c65b8ed 100644 --- a/src/formatter/rerun_formatter.ts +++ b/src/formatter/rerun_formatter.ts @@ -1,6 +1,5 @@ import _ from 'lodash' import Formatter, { IFormatterOptions } from './' -import Status from '../status' import path from 'path' import { getGherkinScenarioLocationMap } from './helpers/gherkin_document_parser' import { @@ -8,7 +7,7 @@ import { doesNotHaveValue, valueOrDefault, } from '../value_checker' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' const DEFAULT_SEPARATOR = '\n' @@ -21,7 +20,7 @@ export default class RerunFormatter extends Formatter { constructor(options: IFormatterOptions) { super(options) - options.eventBroadcaster.on('envelope', (envelope: messages.IEnvelope) => { + options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => { if (doesHaveValue(envelope.testRunFinished)) { this.logFailedTestCases() } @@ -35,7 +34,9 @@ export default class RerunFormatter extends Formatter { _.each( this.eventDataCollector.getTestCaseAttempts(), ({ gherkinDocument, pickle, worstTestStepResult }) => { - if (worstTestStepResult.status !== Status.PASSED) { + if ( + worstTestStepResult.status !== messages.TestStepResultStatus.PASSED + ) { const relativeUri = path.relative(this.cwd, pickle.uri) const line = getGherkinScenarioLocationMap(gherkinDocument)[ _.last(pickle.astNodeIds) diff --git a/src/formatter/snippets_formatter.ts b/src/formatter/snippets_formatter.ts index ee2a3b10f..1dd2720d4 100644 --- a/src/formatter/snippets_formatter.ts +++ b/src/formatter/snippets_formatter.ts @@ -1,9 +1,8 @@ import Formatter, { IFormatterOptions } from './' -import Status from '../status' import { parseTestCaseAttempt } from './helpers' import { doesHaveValue } from '../value_checker' -import { messages } from '@cucumber/messages' -import IEnvelope = messages.IEnvelope +import * as messages from '@cucumber/messages' +import IEnvelope = messages.Envelope export default class SnippetsFormatter extends Formatter { constructor(options: IFormatterOptions) { @@ -25,7 +24,9 @@ export default class SnippetsFormatter extends Formatter { testCaseAttempt, }) parsed.testSteps.forEach((testStep) => { - if (testStep.result.status === Status.UNDEFINED) { + if ( + testStep.result.status === messages.TestStepResultStatus.UNDEFINED + ) { snippets.push(testStep.snippet) } }) diff --git a/src/formatter/step_definition_snippet_builder/index.ts b/src/formatter/step_definition_snippet_builder/index.ts index a123b8ab1..768f5b039 100644 --- a/src/formatter/step_definition_snippet_builder/index.ts +++ b/src/formatter/step_definition_snippet_builder/index.ts @@ -5,7 +5,7 @@ import { CucumberExpressionGenerator, ParameterTypeRegistry, } from '@cucumber/cucumber-expressions' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { doesHaveValue } from '../../value_checker' export interface INewStepDefinitionSnippetBuilderOptions { @@ -15,7 +15,7 @@ export interface INewStepDefinitionSnippetBuilderOptions { export interface IBuildRequest { keywordType: KeywordType - pickleStep: messages.Pickle.IPickleStep + pickleStep: messages.PickleStep } export default class StepDefinitionSnippetBuilder { @@ -59,7 +59,7 @@ export default class StepDefinitionSnippetBuilder { } } - getStepParameterNames(step: messages.Pickle.IPickleStep): string[] { + getStepParameterNames(step: messages.PickleStep): string[] { if (doesHaveValue(step.argument)) { const argumentName = parseStepArgument(step.argument, { dataTable: () => 'dataTable', diff --git a/src/formatter/summary_formatter.ts b/src/formatter/summary_formatter.ts index c4932cb94..97d15b783 100644 --- a/src/formatter/summary_formatter.ts +++ b/src/formatter/summary_formatter.ts @@ -2,7 +2,7 @@ import _ from 'lodash' import { formatIssue, formatSummary, isFailure, isWarning } from './helpers' import Formatter, { IFormatterOptions } from './' import { doesHaveValue } from '../value_checker' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { ITestCaseAttempt } from './helpers/event_data_collector' import { formatUndefinedParameterTypes } from './helpers/issue_helpers' import { durationBetweenTimestamps } from '../time' @@ -15,8 +15,8 @@ interface ILogIssuesRequest { export default class SummaryFormatter extends Formatter { constructor(options: IFormatterOptions) { super(options) - let testRunStartedTimestamp: messages.ITimestamp - options.eventBroadcaster.on('envelope', (envelope: messages.IEnvelope) => { + let testRunStartedTimestamp: messages.Timestamp + options.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => { if (doesHaveValue(envelope.testRunStarted)) { testRunStartedTimestamp = envelope.testRunStarted.timestamp } @@ -32,7 +32,7 @@ export default class SummaryFormatter extends Formatter { }) } - logSummary(testRunDuration: messages.IDuration): void { + logSummary(testRunDuration: messages.Duration): void { const failures: ITestCaseAttempt[] = [] const warnings: ITestCaseAttempt[] = [] const testCaseAttempts = this.eventDataCollector.getTestCaseAttempts() diff --git a/src/formatter/usage_formatter.ts b/src/formatter/usage_formatter.ts index f99d4807c..ffe186437 100644 --- a/src/formatter/usage_formatter.ts +++ b/src/formatter/usage_formatter.ts @@ -2,10 +2,9 @@ import _ from 'lodash' import { formatLocation, getUsage } from './helpers' import Formatter, { IFormatterOptions } from './' import Table from 'cli-table3' -import { durationToMilliseconds } from '../time' import { doesHaveValue } from '../value_checker' -import { messages } from '@cucumber/messages' -import IEnvelope = messages.IEnvelope +import * as messages from '@cucumber/messages' +import IEnvelope = messages.Envelope export default class UsageFormatter extends Formatter { constructor(options: IFormatterOptions) { @@ -44,7 +43,11 @@ export default class UsageFormatter extends Formatter { const col2 = [] if (matches.length > 0) { if (doesHaveValue(meanDuration)) { - col2.push(`${durationToMilliseconds(meanDuration).toFixed(2)}ms`) + col2.push( + `${messages.TimeConversion.durationToMilliseconds( + meanDuration + ).toFixed(2)}ms` + ) } else { col2.push('-') } @@ -55,7 +58,11 @@ export default class UsageFormatter extends Formatter { _.take(matches, 5).forEach((match) => { col1.push(` ${match.text}`) if (doesHaveValue(match.duration)) { - col2.push(`${durationToMilliseconds(match.duration).toString()}ms`) + col2.push( + `${messages.TimeConversion.durationToMilliseconds( + match.duration + ).toString()}ms` + ) } else { col2.push('-') } diff --git a/src/formatter/usage_json_formatter.ts b/src/formatter/usage_json_formatter.ts index 60f32c118..863b8768c 100644 --- a/src/formatter/usage_json_formatter.ts +++ b/src/formatter/usage_json_formatter.ts @@ -1,8 +1,8 @@ import { getUsage } from './helpers' import Formatter, { IFormatterOptions } from './' import { doesHaveValue } from '../value_checker' -import { messages } from '@cucumber/messages' -import IEnvelope = messages.IEnvelope +import * as messages from '@cucumber/messages' +import IEnvelope = messages.Envelope export default class UsageJsonFormatter extends Formatter { constructor(options: IFormatterOptions) { diff --git a/src/index.ts b/src/index.ts index 98feb92ca..de2d072c7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ import * as formatterHelpers from './formatter/helpers' import supportCodeLibraryBuilder from './support_code_library_builder' +import * as messages from '@cucumber/messages' // Top level export { default as Cli } from './cli' @@ -7,7 +8,6 @@ export { parseGherkinMessageStream } from './cli/helpers' export { default as PickleFilter } from './pickle_filter' export { default as Runtime } from './runtime' export { default as supportCodeLibraryBuilder } from './support_code_library_builder' -export { default as Status } from './status' export { default as DataTable } from './models/data_table' // Formatters @@ -42,3 +42,4 @@ export { default as World, IWorldOptions, } from './support_code_library_builder/world' +export const Status = messages.TestStepResultStatus diff --git a/src/models/data_table.ts b/src/models/data_table.ts index c274759a7..66f865962 100644 --- a/src/models/data_table.ts +++ b/src/models/data_table.ts @@ -1,12 +1,10 @@ import _ from 'lodash' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' export default class DataTable { private readonly rawTable: string[][] - constructor( - sourceTable: messages.PickleStepArgument.IPickleTable | string[][] - ) { + constructor(sourceTable: messages.PickleTable | string[][]) { if (sourceTable instanceof Array) { this.rawTable = sourceTable } else { diff --git a/src/models/data_table_spec.ts b/src/models/data_table_spec.ts index abf633290..8be0c3ee7 100644 --- a/src/models/data_table_spec.ts +++ b/src/models/data_table_spec.ts @@ -1,25 +1,42 @@ import { describe, it } from 'mocha' import { expect } from 'chai' import DataTable from './data_table' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' + +const id = 'id' +const location: messages.Location = { line: 0 } describe('DataTable', () => { describe('table with headers', () => { - const dataTable = messages.GherkinDocument.Feature.Step.DataTable.fromObject( - { - rows: [ - { - cells: [{ value: 'header 1' }, { value: 'header 2' }], - }, - { - cells: [{ value: 'row 1 col 1' }, { value: 'row 1 col 2' }], - }, - { - cells: [{ value: 'row 2 col 1' }, { value: 'row 2 col 2' }], - }, - ], - } - ) + const dataTable: messages.DataTable = { + location, + rows: [ + { + id, + location, + cells: [ + { value: 'header 1', location }, + { value: 'header 2', location }, + ], + }, + { + id, + location, + cells: [ + { value: 'row 1 col 1', location }, + { value: 'row 1 col 2', location }, + ], + }, + { + id, + location, + cells: [ + { value: 'row 2 col 1', location }, + { value: 'row 2 col 2', location }, + ], + }, + ], + } describe('rows', () => { it('returns a 2-D array without the header', () => { @@ -50,18 +67,27 @@ describe('DataTable', () => { }) describe('table without headers', () => { - const dataTable = messages.GherkinDocument.Feature.Step.DataTable.fromObject( - { - rows: [ - { - cells: [{ value: 'row 1 col 1' }, { value: 'row 1 col 2' }], - }, - { - cells: [{ value: 'row 2 col 1' }, { value: 'row 2 col 2' }], - }, - ], - } - ) + const dataTable: messages.DataTable = { + location, + rows: [ + { + id, + location, + cells: [ + { value: 'row 1 col 1', location }, + { value: 'row 1 col 2', location }, + ], + }, + { + id, + location, + cells: [ + { value: 'row 2 col 1', location }, + { value: 'row 2 col 2', location }, + ], + }, + ], + } describe('raw', () => { it('returns a 2-D array', () => { @@ -83,21 +109,24 @@ describe('DataTable', () => { }) describe('table with something other than 2 columns', () => { - const dataTable = messages.GherkinDocument.Feature.Step.DataTable.fromObject( - { - rows: [ - { - cells: [{ value: 'row 1 col 1' }], - }, - { - cells: [{ value: 'row 2 col 1' }], - }, - ], - } - ) - describe('rowsHash', () => { it('throws an error if not all rows have two columns', function () { + const dataTable: messages.DataTable = { + location, + rows: [ + { + id, + location, + cells: [{ value: 'row 1 col 1', location }], + }, + { + id, + location, + cells: [{ value: 'row 2 col 1', location }], + }, + ], + } + expect(() => new DataTable(dataTable).rowsHash()).to.throw( 'rowsHash can only be called on a data table where all rows have exactly two columns' ) diff --git a/src/models/definition.ts b/src/models/definition.ts index 3fd3d2fb5..171e89648 100644 --- a/src/models/definition.ts +++ b/src/models/definition.ts @@ -1,10 +1,10 @@ -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { ITestCaseHookParameter } from '../support_code_library_builder/types' import { Expression } from '@cucumber/cucumber-expressions' export interface IGetInvocationDataRequest { hookParameter: ITestCaseHookParameter - step: messages.Pickle.IPickleStep + step: messages.PickleStep world: any } diff --git a/src/models/test_case_hook_definition.ts b/src/models/test_case_hook_definition.ts index c0d2db479..b6afeda43 100644 --- a/src/models/test_case_hook_definition.ts +++ b/src/models/test_case_hook_definition.ts @@ -6,7 +6,7 @@ import Definition, { IGetInvocationDataResponse, IHookDefinitionOptions, } from './definition' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' export default class TestCaseHookDefinition extends Definition @@ -20,7 +20,7 @@ export default class TestCaseHookDefinition this.pickleTagFilter = new PickleTagFilter(data.options.tags) } - appliesToTestCase(pickle: messages.IPickle): boolean { + appliesToTestCase(pickle: messages.Pickle): boolean { return this.pickleTagFilter.matchesAllTagExpressions(pickle) } diff --git a/src/models/test_step_hook_definition.ts b/src/models/test_step_hook_definition.ts index ff31da134..a36967bc0 100644 --- a/src/models/test_step_hook_definition.ts +++ b/src/models/test_step_hook_definition.ts @@ -6,7 +6,7 @@ import Definition, { IDefinitionParameters, IHookDefinitionOptions, } from './definition' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' export default class TestStepHookDefinition extends Definition @@ -20,7 +20,7 @@ export default class TestStepHookDefinition this.pickleTagFilter = new PickleTagFilter(data.options.tags) } - appliesToTestCase(pickle: messages.IPickle): boolean { + appliesToTestCase(pickle: messages.Pickle): boolean { return this.pickleTagFilter.matchesAllTagExpressions(pickle) } diff --git a/src/pickle_filter.ts b/src/pickle_filter.ts index 5364edfe6..fcf774ebe 100644 --- a/src/pickle_filter.ts +++ b/src/pickle_filter.ts @@ -3,9 +3,9 @@ import path from 'path' import parse from '@cucumber/tag-expressions' import { getGherkinScenarioLocationMap } from './formatter/helpers/gherkin_document_parser' import { doesHaveValue, doesNotHaveValue } from './value_checker' -import { messages } from '@cucumber/messages' -import IGherkinDocument = messages.IGherkinDocument -import IPickle = messages.IPickle +import * as messages from '@cucumber/messages' +import IGherkinDocument = messages.GherkinDocument +import IPickle = messages.Pickle const FEATURE_LINENUM_REGEXP = /^(.*?)((?::[\d]+)+)?$/ @@ -17,8 +17,8 @@ export interface IPickleFilterOptions { } export interface IMatchesAnyLineRequest { - gherkinDocument: messages.IGherkinDocument - pickle: messages.IPickle + gherkinDocument: messages.GherkinDocument + pickle: messages.Pickle } export default class PickleFilter { @@ -113,7 +113,7 @@ export class PickleNameFilter { this.names = names } - matchesAnyName(pickle: messages.IPickle): boolean { + matchesAnyName(pickle: messages.Pickle): boolean { if (this.names.length === 0) { return true } @@ -130,7 +130,7 @@ export class PickleTagFilter { } } - matchesAllTagExpressions(pickle: messages.IPickle): boolean { + matchesAllTagExpressions(pickle: messages.Pickle): boolean { if (doesNotHaveValue(this.tagExpressionNode)) { return true } diff --git a/src/runtime/attachment_manager/index.ts b/src/runtime/attachment_manager/index.ts index 8c4a4967c..d3ea34255 100644 --- a/src/runtime/attachment_manager/index.ts +++ b/src/runtime/attachment_manager/index.ts @@ -1,10 +1,10 @@ import isStream from 'is-stream' import { Readable } from 'stream' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { doesHaveValue, doesNotHaveValue } from '../../value_checker' export interface IAttachmentMedia { - encoding: messages.Attachment.ContentEncoding + encoding: messages.AttachmentContentEncoding contentType: string } @@ -53,12 +53,12 @@ export default class AttachmentManager { } if (mediaType.startsWith('base64:')) { this.createStringAttachment(data, { - encoding: messages.Attachment.ContentEncoding.BASE64, + encoding: messages.AttachmentContentEncoding.BASE64, contentType: mediaType.replace('base64:', ''), }) } else { this.createStringAttachment(data, { - encoding: messages.Attachment.ContentEncoding.IDENTITY, + encoding: messages.AttachmentContentEncoding.IDENTITY, contentType: mediaType, }) } @@ -71,7 +71,7 @@ export default class AttachmentManager { createBufferAttachment(data: Buffer, mediaType: string): void { this.createStringAttachment(data.toString('base64'), { - encoding: messages.Attachment.ContentEncoding.BASE64, + encoding: messages.AttachmentContentEncoding.BASE64, contentType: mediaType, }) } diff --git a/src/runtime/attachment_manager/index_spec.ts b/src/runtime/attachment_manager/index_spec.ts index 482cd8f84..ecf2c45f3 100644 --- a/src/runtime/attachment_manager/index_spec.ts +++ b/src/runtime/attachment_manager/index_spec.ts @@ -2,7 +2,6 @@ import { describe, it } from 'mocha' import { expect } from 'chai' import AttachmentManager, { IAttachment } from './' import stream, { Readable } from 'stream' -import { messages } from '@cucumber/messages' describe('AttachmentManager', () => { describe('create()', () => { @@ -28,7 +27,7 @@ describe('AttachmentManager', () => { data: 'bXkgc3RyaW5n', media: { contentType: 'text/special', - encoding: messages.Attachment.ContentEncoding.BASE64, + encoding: 'BASE64', }, }, ]) @@ -99,7 +98,7 @@ describe('AttachmentManager', () => { data: 'bXkgc3RyaW5n', media: { contentType: 'text/special', - encoding: messages.Attachment.ContentEncoding.BASE64, + encoding: 'BASE64', }, }, ]) @@ -137,7 +136,7 @@ describe('AttachmentManager', () => { data: 'bXkgc3RyaW5n', media: { contentType: 'text/special', - encoding: messages.Attachment.ContentEncoding.BASE64, + encoding: 'BASE64', }, }, ]) @@ -197,7 +196,7 @@ describe('AttachmentManager', () => { data: 'my string', media: { contentType: 'text/special', - encoding: messages.Attachment.ContentEncoding.IDENTITY, + encoding: 'IDENTITY', }, }, ]) @@ -225,7 +224,7 @@ describe('AttachmentManager', () => { data: 'bXkgc3RyaW5n', media: { contentType: 'text/special', - encoding: messages.Attachment.ContentEncoding.BASE64, + encoding: 'BASE64', }, }, ]) @@ -250,7 +249,7 @@ describe('AttachmentManager', () => { data: 'my string', media: { contentType: 'text/plain', - encoding: messages.Attachment.ContentEncoding.IDENTITY, + encoding: 'IDENTITY', }, }, ]) @@ -276,7 +275,7 @@ describe('AttachmentManager', () => { data: 'stuff happened', media: { contentType: 'text/x.cucumber.log+plain', - encoding: messages.Attachment.ContentEncoding.IDENTITY, + encoding: 'IDENTITY', }, }, ]) diff --git a/src/runtime/helpers.ts b/src/runtime/helpers.ts index 5d9ac90d7..3f1558105 100644 --- a/src/runtime/helpers.ts +++ b/src/runtime/helpers.ts @@ -3,7 +3,7 @@ import Table from 'cli-table3' import indentString from 'indent-string' import { PickleTagFilter } from '../pickle_filter' import StepDefinition from '../models/step_definition' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { IRuntimeOptions } from '.' export function getAmbiguousStepException( @@ -46,7 +46,7 @@ export function getAmbiguousStepException( } export function retriesForPickle( - pickle: messages.IPickle, + pickle: messages.Pickle, options: IRuntimeOptions ): number { const retries = options.retry diff --git a/src/runtime/index.ts b/src/runtime/index.ts index 3f0ed5e21..b598e26bc 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -2,11 +2,11 @@ import _, { clone } from 'lodash' import { EventDataCollector, formatLocation } from '../formatter/helpers' import bluebird from 'bluebird' import StackTraceFilter from '../stack_trace_filter' -import Status from '../status' import UserCodeRunner from '../user_code_runner' import VError from 'verror' import { retriesForPickle } from './helpers' -import { IdGenerator, messages } from '@cucumber/messages' +import { IdGenerator } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import PickleRunner from './pickle_runner' import { EventEmitter } from 'events' import { ISupportCodeLibrary } from '../support_code_library_builder/types' @@ -125,14 +125,12 @@ export default class Runtime { if (this.options.filterStacktraces) { this.stackTraceFilter.filter() } - this.eventBroadcaster.emit( - 'envelope', - new messages.Envelope({ - testRunStarted: { - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const testRunStarted: messages.Envelope = { + testRunStarted: { + timestamp: this.stopwatch.timestamp(), + }, + } + this.eventBroadcaster.emit('envelope', testRunStarted) this.stopwatch.start() await this.runTestRunHooks( this.supportCodeLibrary.beforeTestRunHookDefinitions, @@ -144,26 +142,27 @@ export default class Runtime { 'an AfterAll' ) this.stopwatch.stop() - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - testRunFinished: { - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const testRunFinished: messages.Envelope = { + testRunFinished: { + timestamp: this.stopwatch.timestamp(), + success: this.success, + }, + } + this.eventBroadcaster.emit('envelope', testRunFinished) if (this.options.filterStacktraces) { this.stackTraceFilter.unfilter() } return this.success } - shouldCauseFailure( - status: messages.TestStepFinished.TestStepResult.Status - ): boolean { - return ( - _.includes([Status.AMBIGUOUS, Status.FAILED, Status.UNDEFINED], status) || - (status === Status.PENDING && this.options.strict) - ) + shouldCauseFailure(status: messages.TestStepResultStatus): boolean { + const failureStatuses: messages.TestStepResultStatus[] = [ + messages.TestStepResultStatus.AMBIGUOUS, + messages.TestStepResultStatus.FAILED, + messages.TestStepResultStatus.UNDEFINED, + ] + if (this.options.strict) + failureStatuses.push(messages.TestStepResultStatus.PENDING) + return _.includes(failureStatuses, status) } } diff --git a/src/runtime/parallel/command_types.ts b/src/runtime/parallel/command_types.ts index b8759b247..11de25c23 100644 --- a/src/runtime/parallel/command_types.ts +++ b/src/runtime/parallel/command_types.ts @@ -1,4 +1,4 @@ -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { IRuntimeOptions } from '../index' // Messages from Coordinator to Worker @@ -20,8 +20,8 @@ export interface IWorkerCommandRun { retries: number skip: boolean elapsed: number - pickle: messages.IPickle - gherkinDocument: messages.IGherkinDocument + pickle: messages.Pickle + gherkinDocument: messages.GherkinDocument } // Messages from Worker to Coordinator diff --git a/src/runtime/parallel/coordinator.ts b/src/runtime/parallel/coordinator.ts index ad15005e4..dcb276f11 100644 --- a/src/runtime/parallel/coordinator.ts +++ b/src/runtime/parallel/coordinator.ts @@ -1,9 +1,8 @@ import _ from 'lodash' import { ChildProcess, fork } from 'child_process' import path from 'path' -import Status from '../../status' import { retriesForPickle } from '../helpers' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { EventEmitter } from 'events' import { EventDataCollector } from '../../formatter/helpers' import { IRuntimeOptions } from '..' @@ -87,9 +86,7 @@ export default class Coordinator { } else if (message.ready) { this.giveWork(worker) } else if (doesHaveValue(message.jsonEnvelope)) { - const envelope = messages.Envelope.fromObject( - JSON.parse(message.jsonEnvelope) - ) + const envelope = messages.parseEnvelope(message.jsonEnvelope) this.eventBroadcaster.emit('envelope', envelope) if (doesHaveValue(envelope.testCase)) { this.remapDefinitionIds(envelope.testCase) @@ -128,9 +125,9 @@ export default class Coordinator { ) } - remapDefinitionIds(testCase: messages.ITestCase): void { + remapDefinitionIds(testCase: messages.TestCase): void { for (const testStep of testCase.testSteps) { - if (testStep.hookId !== '') { + if (doesHaveValue(testStep.hookId)) { testStep.hookId = this.supportCodeIdMap[testStep.hookId] } if (doesHaveValue(testStep.stepDefinitionIds)) { @@ -172,23 +169,23 @@ export default class Coordinator { } onWorkerProcessClose(exitCode: number): void { - if (exitCode !== 0) { + const success = exitCode === 0 + if (!success) { this.success = false } if (_.every(this.workers, 'closed')) { - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - testRunFinished: { - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const envelope: messages.Envelope = { + testRunFinished: { + timestamp: this.stopwatch.timestamp(), + success, + }, + } + this.eventBroadcaster.emit('envelope', envelope) this.onFinish(this.success) } } - parseTestCaseResult(testCaseFinished: messages.ITestCaseFinished): void { + parseTestCaseResult(testCaseFinished: messages.TestCaseFinished): void { const { worstTestStepResult } = this.eventDataCollector.getTestCaseAttempt( testCaseFinished.testCaseStartedId ) @@ -201,14 +198,12 @@ export default class Coordinator { } run(numberOfWorkers: number, done: (success: boolean) => void): void { - this.eventBroadcaster.emit( - 'envelope', - new messages.Envelope({ - testRunStarted: { - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const envelope: messages.Envelope = { + testRunStarted: { + timestamp: this.stopwatch.timestamp(), + }, + } + this.eventBroadcaster.emit('envelope', envelope) this.stopwatch.start() _.times(numberOfWorkers, (id) => this.startWorker(id.toString(), numberOfWorkers) @@ -242,12 +237,10 @@ export default class Coordinator { worker.process.send(runCommand) } - shouldCauseFailure( - status: messages.TestStepFinished.TestStepResult.Status - ): boolean { + shouldCauseFailure(status: messages.TestStepResultStatus): boolean { return ( - _.includes([Status.AMBIGUOUS, Status.FAILED, Status.UNDEFINED], status) || - (status === Status.PENDING && this.options.strict) + _.includes(['AMBIGUOUS', 'FAILED', 'UNDEFINED'], status) || + (status === 'PENDING' && this.options.strict) ) } } diff --git a/src/runtime/parallel/worker.ts b/src/runtime/parallel/worker.ts index 481484ab7..e743af9dc 100644 --- a/src/runtime/parallel/worker.ts +++ b/src/runtime/parallel/worker.ts @@ -11,7 +11,8 @@ import StackTraceFilter from '../../stack_trace_filter' import supportCodeLibraryBuilder from '../../support_code_library_builder' import PickleRunner from '../pickle_runner' import UserCodeRunner from '../../user_code_runner' -import { IdGenerator, messages } from '@cucumber/messages' +import { IdGenerator } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import TestRunHookDefinition from '../../models/test_run_hook_definition' import { ISupportCodeLibrary } from '../../support_code_library_builder/types' import { doesHaveValue, valueOrDefault } from '../../value_checker' @@ -58,7 +59,7 @@ export default class Worker { this.stackTraceFilter = new StackTraceFilter() this.eventBroadcaster.on('envelope', (envelope: messages.Envelope) => { this.sendMessage({ - jsonEnvelope: JSON.stringify(envelope.toJSON()), + jsonEnvelope: JSON.stringify(envelope), }) }) } diff --git a/src/runtime/pickle_runner.ts b/src/runtime/pickle_runner.ts index b27ac2e10..ab42315c0 100644 --- a/src/runtime/pickle_runner.ts +++ b/src/runtime/pickle_runner.ts @@ -2,8 +2,8 @@ import { clone } from 'lodash' import { getAmbiguousStepException } from './helpers' import AttachmentManager from './attachment_manager' import StepRunner from './step_runner' -import { IdGenerator, messages } from '@cucumber/messages' -import { addDurations, getZeroDuration } from '../time' +import { IdGenerator, getWorstTestStepResult } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { EventEmitter } from 'events' import { ISupportCodeLibrary, @@ -17,9 +17,6 @@ import { IDefinition } from '../models/definition' import { doesHaveValue, doesNotHaveValue } from '../value_checker' import { ITestRunStopwatch } from './stopwatch' import { Group } from '@cucumber/cucumber-expressions' -import { Query } from '@cucumber/query' - -const { Status } = messages.TestStepFinished.TestStepResult interface ITestStep { id: string @@ -27,16 +24,16 @@ interface ITestStep { isHook: boolean hookDefinition?: TestCaseHookDefinition stepHookDefinition?: TestStepHookDefinition - pickleStep?: messages.Pickle.IPickleStep + pickleStep?: messages.PickleStep stepDefinitions?: StepDefinition[] } export interface INewPickleRunnerOptions { eventBroadcaster: EventEmitter stopwatch: ITestRunStopwatch - gherkinDocument: messages.IGherkinDocument + gherkinDocument: messages.GherkinDocument newId: IdGenerator.NewId - pickle: messages.IPickle + pickle: messages.Pickle retries: number skip: boolean supportCodeLibrary: ISupportCodeLibrary @@ -49,15 +46,15 @@ export default class PickleRunner { private currentTestStepId: string private readonly eventBroadcaster: EventEmitter private readonly stopwatch: ITestRunStopwatch - private readonly gherkinDocument: messages.IGherkinDocument + private readonly gherkinDocument: messages.GherkinDocument private readonly newId: IdGenerator.NewId - private readonly pickle: messages.IPickle + private readonly pickle: messages.Pickle private readonly maxAttempts: number private readonly skip: boolean private readonly supportCodeLibrary: ISupportCodeLibrary private readonly testCaseId: string private readonly testSteps: ITestStep[] - private testStepResults: messages.TestStepFinished.ITestStepResult[] + private testStepResults: messages.TestStepResult[] private world: any private readonly worldParameters: any @@ -78,18 +75,16 @@ export default class PickleRunner { 'Cannot attach when a step/hook is not running. Ensure your step/hook waits for the attach to finish.' ) } - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - attachment: { - body: data, - contentEncoding: media.encoding, - mediaType: media.contentType, - testCaseStartedId: this.currentTestCaseStartedId, - testStepId: this.currentTestStepId, - }, - }) - ) + const attachment: messages.Envelope = { + attachment: { + body: data, + contentEncoding: media.encoding, + mediaType: media.contentType, + testCaseStartedId: this.currentTestCaseStartedId, + testStepId: this.currentTestStepId, + }, + } + this.eventBroadcaster.emit('envelope', attachment) }) this.eventBroadcaster = eventBroadcaster this.stopwatch = stopwatch @@ -173,15 +168,11 @@ export default class PickleRunner { } }), } - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ testCase }) - ) + const envelope: messages.Envelope = { testCase } + this.eventBroadcaster.emit('envelope', envelope) } - private mapArgumentGroup( - group: Group - ): messages.TestCase.TestStep.StepMatchArgumentsList.StepMatchArgument.IGroup { + private mapArgumentGroup(group: Group): messages.Group { return { start: group.start, value: group.value, @@ -215,28 +206,30 @@ export default class PickleRunner { .filter((hookDefinition) => hookDefinition.appliesToTestCase(this.pickle)) } - getStepDefinitions( - pickleStep: messages.Pickle.IPickleStep - ): StepDefinition[] { + getStepDefinitions(pickleStep: messages.PickleStep): StepDefinition[] { return this.supportCodeLibrary.stepDefinitions.filter((stepDefinition) => stepDefinition.matchesStepName(pickleStep.text) ) } - getWorstStepResult(): messages.TestStepFinished.ITestStepResult { + getWorstStepResult(): messages.TestStepResult { if (this.testStepResults.length === 0) { - return messages.TestStepFinished.TestStepResult.fromObject({ - status: this.skip ? Status.SKIPPED : Status.PASSED, - }) + return { + status: this.skip + ? messages.TestStepResultStatus.SKIPPED + : messages.TestStepResultStatus.PASSED, + willBeRetried: false, + duration: messages.TimeConversion.millisecondsToDuration(0), + } } - return new Query().getWorstTestStepResult(this.testStepResults) + return getWorstTestStepResult(this.testStepResults) } async invokeStep( - step: messages.Pickle.IPickleStep, + step: messages.PickleStep, stepDefinition: IDefinition, hookParameter?: any - ): Promise { + ): Promise { return await StepRunner.run({ defaultTimeout: this.supportCodeLibrary.defaultTimeout, hookParameter, @@ -247,7 +240,9 @@ export default class PickleRunner { } isSkippingSteps(): boolean { - return this.getWorstStepResult().status !== Status.PASSED + return ( + this.getWorstStepResult().status !== messages.TestStepResultStatus.PASSED + ) } shouldSkipHook(isBeforeHook: boolean): boolean { @@ -257,24 +252,22 @@ export default class PickleRunner { async aroundTestStep( testStepId: string, attempt: number, - runStepFn: () => Promise + runStepFn: () => Promise ): Promise { - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - testStepStarted: { - testCaseStartedId: this.currentTestCaseStartedId, - testStepId, - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const testStepStarted: messages.Envelope = { + testStepStarted: { + testCaseStartedId: this.currentTestCaseStartedId, + testStepId, + timestamp: this.stopwatch.timestamp(), + }, + } + this.eventBroadcaster.emit('envelope', testStepStarted) this.currentTestStepId = testStepId const testStepResult = await runStepFn() this.currentTestStepId = null this.testStepResults.push(testStepResult) if ( - testStepResult.status === Status.FAILED && + testStepResult.status === messages.TestStepResultStatus.FAILED && attempt + 1 < this.maxAttempts ) { /* @@ -283,34 +276,30 @@ export default class PickleRunner { */ testStepResult.willBeRetried = true } - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - testStepFinished: { - testCaseStartedId: this.currentTestCaseStartedId, - testStepId, - testStepResult, - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const testStepFinished: messages.Envelope = { + testStepFinished: { + testCaseStartedId: this.currentTestCaseStartedId, + testStepId, + testStepResult, + timestamp: this.stopwatch.timestamp(), + }, + } + this.eventBroadcaster.emit('envelope', testStepFinished) } - async run(): Promise { + async run(): Promise { this.emitTestCase() for (let attempt = 0; attempt < this.maxAttempts; attempt++) { this.currentTestCaseStartedId = this.newId() - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - testCaseStarted: { - attempt, - testCaseId: this.testCaseId, - id: this.currentTestCaseStartedId, - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const testCaseStarted: messages.Envelope = { + testCaseStarted: { + attempt, + testCaseId: this.testCaseId, + id: this.currentTestCaseStartedId, + timestamp: this.stopwatch.timestamp(), + }, + } + this.eventBroadcaster.emit('envelope', testCaseStarted) for (const testStep of this.testSteps) { await this.aroundTestStep(testStep.id, attempt, async () => { if (testStep.isHook) { @@ -332,15 +321,13 @@ export default class PickleRunner { } }) } - this.eventBroadcaster.emit( - 'envelope', - messages.Envelope.fromObject({ - testCaseFinished: { - testCaseStartedId: this.currentTestCaseStartedId, - timestamp: this.stopwatch.timestamp(), - }, - }) - ) + const testCaseFinished: messages.Envelope = { + testCaseFinished: { + testCaseStartedId: this.currentTestCaseStartedId, + timestamp: this.stopwatch.timestamp(), + }, + } + this.eventBroadcaster.emit('envelope', testCaseFinished) if (!this.getWorstStepResult().willBeRetried) { break } @@ -353,19 +340,21 @@ export default class PickleRunner { hookDefinition: TestCaseHookDefinition, hookParameter: ITestCaseHookParameter, isBeforeHook: boolean - ): Promise { + ): Promise { if (this.shouldSkipHook(isBeforeHook)) { - return messages.TestStepFinished.TestStepResult.fromObject({ - status: Status.SKIPPED, - }) + return { + status: messages.TestStepResultStatus.SKIPPED, + duration: messages.TimeConversion.millisecondsToDuration(0), + willBeRetried: false, + } } return await this.invokeStep(null, hookDefinition, hookParameter) } async runStepHooks( stepHooks: TestStepHookDefinition[], - stepResult?: messages.TestStepFinished.ITestStepResult - ): Promise { + stepResult?: messages.TestStepResult + ): Promise { const stepHooksResult = [] const hookParameter: ITestStepHookParameter = { gherkinDocument: this.gherkinDocument, @@ -382,43 +371,35 @@ export default class PickleRunner { return stepHooksResult } - async runStep( - testStep: ITestStep - ): Promise { + async runStep(testStep: ITestStep): Promise { if (testStep.stepDefinitions.length === 0) { - return messages.TestStepFinished.TestStepResult.fromObject({ - status: Status.UNDEFINED, - duration: { - seconds: '0', - nanos: 0, - }, - }) + return { + status: messages.TestStepResultStatus.UNDEFINED, + duration: messages.TimeConversion.millisecondsToDuration(0), + willBeRetried: false, + } } else if (testStep.stepDefinitions.length > 1) { - return messages.TestStepFinished.TestStepResult.fromObject({ + return { message: getAmbiguousStepException(testStep.stepDefinitions), - status: Status.AMBIGUOUS, - duration: { - seconds: '0', - nanos: 0, - }, - }) + status: messages.TestStepResultStatus.AMBIGUOUS, + duration: messages.TimeConversion.millisecondsToDuration(0), + willBeRetried: false, + } } else if (this.isSkippingSteps()) { - return messages.TestStepFinished.TestStepResult.fromObject({ - status: Status.SKIPPED, - duration: { - seconds: '0', - nanos: 0, - }, - }) + return { + status: messages.TestStepResultStatus.SKIPPED, + duration: messages.TimeConversion.millisecondsToDuration(0), + willBeRetried: false, + } } let stepResult let stepResults = await this.runStepHooks( - this.getBeforeStepHookDefinitions(), - stepResult + this.getBeforeStepHookDefinitions() ) if ( - new Query().getWorstTestStepResult(stepResults).status !== Status.FAILED + getWorstTestStepResult(stepResults).status !== + messages.TestStepResultStatus.FAILED ) { stepResult = await this.invokeStep( testStep.pickleStep, @@ -432,10 +413,13 @@ export default class PickleRunner { ) stepResults = stepResults.concat(afterStepHookResults) - const finalStepResult = new Query().getWorstTestStepResult(stepResults) - let finalDuration = getZeroDuration() + const finalStepResult = getWorstTestStepResult(stepResults) + let finalDuration = messages.TimeConversion.millisecondsToDuration(0) for (const result of stepResults) { - finalDuration = addDurations(finalDuration, result.duration) + finalDuration = messages.TimeConversion.addDurations( + finalDuration, + result.duration + ) } finalStepResult.duration = finalDuration return finalStepResult diff --git a/src/runtime/pickle_runner_spec.ts b/src/runtime/pickle_runner_spec.ts index 7c5746530..4f9d09e06 100644 --- a/src/runtime/pickle_runner_spec.ts +++ b/src/runtime/pickle_runner_spec.ts @@ -1,30 +1,30 @@ import { afterEach, beforeEach, describe, it } from 'mocha' import { expect } from 'chai' import PickleRunner from './pickle_runner' -import Status from '../status' import { EventEmitter } from 'events' -import { IdGenerator, messages } from '@cucumber/messages' +import { IdGenerator } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { parse } from '../../test/gherkin_helpers' import { buildSupportCodeLibrary } from '../../test/runtime_helpers' import FakeTimers, { InstalledClock } from '@sinonjs/fake-timers' -import timeMethods, { millisecondsToDuration } from '../time' +import timeMethods from '../time' import { getBaseSupportCodeLibrary } from '../../test/fixtures/steps' import { ISupportCodeLibrary } from '../support_code_library_builder/types' import { valueOrDefault } from '../value_checker' import { PredictableTestRunStopwatch } from './stopwatch' -import IEnvelope = messages.IEnvelope +import IEnvelope = messages.Envelope interface ITestPickleRunnerRequest { - gherkinDocument: messages.IGherkinDocument - pickle: messages.IPickle + gherkinDocument: messages.GherkinDocument + pickle: messages.Pickle retries?: number skip?: boolean supportCodeLibrary: ISupportCodeLibrary } interface ITestPickleRunnerResponse { - envelopes: messages.IEnvelope[] - result: messages.TestStepFinished.TestStepResult.Status + envelopes: messages.Envelope[] + result: messages.TestStepResultStatus } async function testPickleRunner( @@ -48,14 +48,10 @@ async function testPickleRunner( return { envelopes, result } } -function predictableTimestamp(counter: number): any { +function predictableTimestamp(counter: number): messages.Timestamp { return { nanos: 1000000 * counter, - seconds: { - high: 0, - low: 0, - unsigned: false, - }, + seconds: 0, } } @@ -86,12 +82,12 @@ describe('PickleRunner', () => { data: ['Feature: a', 'Scenario: b', 'Given a step'].join('\n'), uri: 'a.feature', }) - const passedTestResult = messages.TestStepFinished.TestStepResult.fromObject( - { - duration: millisecondsToDuration(1), - status: Status.PASSED, - } - ) + const passedTestResult: messages.TestStepResult = { + duration: messages.TimeConversion.millisecondsToDuration(1), + status: messages.TestStepResultStatus.PASSED, + message: undefined, + willBeRetried: false, + } // Act const { envelopes, result } = await testPickleRunner({ @@ -101,8 +97,8 @@ describe('PickleRunner', () => { }) // Assert - expect(envelopes).to.eql([ - messages.Envelope.fromObject({ + const expectedtEnvelopes: messages.Envelope[] = [ + { testCase: { id: '0', pickleId: pickle.id, @@ -119,38 +115,39 @@ describe('PickleRunner', () => { }, ], }, - }), - messages.Envelope.fromObject({ + }, + { testCaseStarted: { attempt: 0, id: '2', testCaseId: '0', timestamp: predictableTimestamp(0), }, - }), - messages.Envelope.fromObject({ + }, + { testStepStarted: { testCaseStartedId: '2', testStepId: '1', timestamp: predictableTimestamp(1), }, - }), - messages.Envelope.fromObject({ + }, + { testStepFinished: { testCaseStartedId: '2', testStepResult: passedTestResult, testStepId: '1', timestamp: predictableTimestamp(2), }, - }), - messages.Envelope.fromObject({ + }, + { testCaseFinished: { testCaseStartedId: '2', timestamp: predictableTimestamp(3), }, - }), - ]) - expect(result).to.eql(Status.PASSED) + }, + ] + expect(envelopes).to.eql(expectedtEnvelopes) + expect(result).to.eql(messages.TestStepResultStatus.PASSED) }) }) @@ -181,10 +178,8 @@ describe('PickleRunner', () => { supportCodeLibrary, }) - expect( - envelopes[0].testCase.testSteps[0].stepMatchArgumentsLists - ).to.deep.eq([ - messages.TestCase.TestStep.StepMatchArgumentsList.fromObject({ + const expected: messages.StepMatchArgumentsList[] = [ + { stepMatchArguments: [ { group: { @@ -201,6 +196,8 @@ describe('PickleRunner', () => { children: [ { children: [], + start: undefined, + value: undefined, }, ], start: 19, @@ -210,8 +207,12 @@ describe('PickleRunner', () => { children: [ { children: [], + start: undefined, + value: undefined, }, ], + start: undefined, + value: undefined, }, ], start: 18, @@ -220,8 +221,11 @@ describe('PickleRunner', () => { parameterTypeName: 'string', }, ], - }), - ]) + }, + ] + expect( + envelopes[0].testCase.testSteps[0].stepMatchArgumentsLists + ).to.deep.eq(expected) }) }) @@ -240,13 +244,12 @@ describe('PickleRunner', () => { data: ['Feature: a', 'Scenario: b', 'Given a step'].join('\n'), uri: 'a.feature', }) - const failingTestResult = messages.TestStepFinished.TestStepResult.fromObject( - { - duration: millisecondsToDuration(0), - status: Status.FAILED, - message: 'fail', - } - ) + const failingTestResult: messages.TestStepResult = { + duration: messages.TimeConversion.millisecondsToDuration(0), + status: messages.TestStepResultStatus.FAILED, + message: 'fail', + willBeRetried: false, + } // Act const { envelopes, result } = await testPickleRunner({ @@ -260,7 +263,7 @@ describe('PickleRunner', () => { expect(envelopes[3].testStepFinished.testStepResult).to.eql( failingTestResult ) - expect(result).to.eql(Status.FAILED) + expect(result).to.eql(messages.TestStepResultStatus.FAILED) }) }) @@ -292,16 +295,13 @@ describe('PickleRunner', () => { // Assert expect(envelopes).to.have.lengthOf(5) - expect(envelopes[3].testStepFinished.testStepResult).to.eql( - messages.TestStepFinished.TestStepResult.fromObject({ - message, - status: Status.AMBIGUOUS, - duration: { - seconds: '0', - nanos: 0, - }, - }) - ) + const expected: messages.TestStepResult = { + message, + status: messages.TestStepResultStatus.AMBIGUOUS, + duration: messages.TimeConversion.millisecondsToDuration(0), + willBeRetried: false, + } + expect(envelopes[3].testStepFinished.testStepResult).to.eql(expected) expect(result).to.eql( envelopes[3].testStepFinished.testStepResult.status ) @@ -329,15 +329,12 @@ describe('PickleRunner', () => { // Assert expect(envelopes).to.have.lengthOf(5) - expect(envelopes[3].testStepFinished.testStepResult).to.eql( - messages.TestStepFinished.TestStepResult.fromObject({ - status: Status.UNDEFINED, - duration: { - seconds: '0', - nanos: 0, - }, - }) - ) + const expected: messages.TestStepResult = { + status: messages.TestStepResultStatus.UNDEFINED, + duration: messages.TimeConversion.millisecondsToDuration(0), + willBeRetried: false, + } + expect(envelopes[3].testStepFinished.testStepResult).to.eql(expected) expect(result).to.eql( envelopes[3].testStepFinished.testStepResult.status ) @@ -374,8 +371,8 @@ describe('PickleRunner', () => { }) // Assert - expect(envelopes).to.eql([ - messages.Envelope.fromObject({ + const expected: messages.Envelope[] = [ + { testCase: { id: '0', pickleId: pickle.id, @@ -392,75 +389,78 @@ describe('PickleRunner', () => { }, ], }, - }), - messages.Envelope.fromObject({ + }, + { testCaseStarted: { attempt: 0, id: '2', testCaseId: '0', timestamp: predictableTimestamp(0), }, - }), - messages.Envelope.fromObject({ + }, + { testStepStarted: { testCaseStartedId: '2', testStepId: '1', timestamp: predictableTimestamp(1), }, - }), - messages.Envelope.fromObject({ + }, + { testStepFinished: { testCaseStartedId: '2', testStepResult: { - duration: millisecondsToDuration(0), + duration: messages.TimeConversion.millisecondsToDuration(0), message: 'error', - status: Status.FAILED, + status: messages.TestStepResultStatus.FAILED, willBeRetried: true, }, testStepId: '1', timestamp: predictableTimestamp(2), }, - }), - messages.Envelope.fromObject({ + }, + { testCaseFinished: { testCaseStartedId: '2', timestamp: predictableTimestamp(3), }, - }), - messages.Envelope.fromObject({ + }, + { testCaseStarted: { attempt: 1, id: '3', testCaseId: '0', timestamp: predictableTimestamp(4), }, - }), - messages.Envelope.fromObject({ + }, + { testStepStarted: { testCaseStartedId: '3', testStepId: '1', timestamp: predictableTimestamp(5), }, - }), - messages.Envelope.fromObject({ + }, + { testStepFinished: { testCaseStartedId: '3', testStepResult: { - duration: millisecondsToDuration(0), - status: Status.PASSED, + duration: messages.TimeConversion.millisecondsToDuration(0), + message: undefined, + status: messages.TestStepResultStatus.PASSED, + willBeRetried: false, }, testStepId: '1', timestamp: predictableTimestamp(6), }, - }), - messages.Envelope.fromObject({ + }, + { testCaseFinished: { testCaseStartedId: '3', timestamp: predictableTimestamp(7), }, - }), - ]) - expect(result).to.eql(Status.PASSED) + }, + ] + expect(envelopes).to.eql(expected) + expect(result).to.eql(messages.TestStepResultStatus.PASSED) }) }) @@ -490,15 +490,12 @@ describe('PickleRunner', () => { // Assert expect(envelopes).to.have.lengthOf(5) - expect(envelopes[3].testStepFinished.testStepResult).to.eql( - messages.TestStepFinished.TestStepResult.fromObject({ - status: Status.SKIPPED, - duration: { - seconds: '0', - nanos: 0, - }, - }) - ) + const expected: messages.TestStepResult = { + status: messages.TestStepResultStatus.SKIPPED, + duration: messages.TimeConversion.millisecondsToDuration(0), + willBeRetried: false, + } + expect(envelopes[3].testStepFinished.testStepResult).to.eql(expected) expect(result).to.eql( envelopes[3].testStepFinished.testStepResult.status ) @@ -534,38 +531,33 @@ describe('PickleRunner', () => { // Assert expect(envelopes).to.have.lengthOf(9) - expect(envelopes[0]).to.eql( - messages.Envelope.fromObject({ - testCase: { - id: '0', - pickleId: pickle.id, - testSteps: [ - { - id: '1', - hookId: [ - supportCodeLibrary.beforeTestCaseHookDefinitions[0].id, - ], - }, - { - id: '2', - pickleStepId: pickle.steps[0].id, - stepDefinitionIds: [supportCodeLibrary.stepDefinitions[0].id], - stepMatchArgumentsLists: [ - { - stepMatchArguments: [], - }, - ], - }, - { - id: '3', - hookId: [ - supportCodeLibrary.afterTestCaseHookDefinitions[0].id, - ], - }, - ], - }, - }) - ) + const expected: messages.Envelope = { + testCase: { + id: '0', + pickleId: pickle.id, + testSteps: [ + { + id: '1', + hookId: supportCodeLibrary.beforeTestCaseHookDefinitions[0].id, + }, + { + id: '2', + pickleStepId: pickle.steps[0].id, + stepDefinitionIds: [supportCodeLibrary.stepDefinitions[0].id], + stepMatchArgumentsLists: [ + { + stepMatchArguments: [], + }, + ], + }, + { + id: '3', + hookId: supportCodeLibrary.afterTestCaseHookDefinitions[0].id, + }, + ], + }, + } + expect(envelopes[0]).to.eql(expected) expect(result).to.eql( envelopes[7].testStepFinished.testStepResult.status ) @@ -601,26 +593,25 @@ describe('PickleRunner', () => { // Assert expect(envelopes).to.have.lengthOf(5) - expect(envelopes[0]).to.eql( - messages.Envelope.fromObject({ - testCase: { - id: '0', - pickleId: pickle.id, - testSteps: [ - { - id: '1', - pickleStepId: pickle.steps[0].id, - stepDefinitionIds: [supportCodeLibrary.stepDefinitions[0].id], - stepMatchArgumentsLists: [ - { - stepMatchArguments: [], - }, - ], - }, - ], - }, - }) - ) + const expected: messages.Envelope = { + testCase: { + id: '0', + pickleId: pickle.id, + testSteps: [ + { + id: '1', + pickleStepId: pickle.steps[0].id, + stepDefinitionIds: [supportCodeLibrary.stepDefinitions[0].id], + stepMatchArgumentsLists: [ + { + stepMatchArguments: [], + }, + ], + }, + ], + }, + } + expect(envelopes[0]).to.eql(expected) expect(result).to.eql( envelopes[3].testStepFinished.testStepResult.status ) diff --git a/src/runtime/step_runner.ts b/src/runtime/step_runner.ts index b104cd958..3ad83217a 100644 --- a/src/runtime/step_runner.ts +++ b/src/runtime/step_runner.ts @@ -1,8 +1,7 @@ import _ from 'lodash' -import Status from '../status' -import Time, { millisecondsToDuration } from '../time' +import Time from '../time' import UserCodeRunner from '../user_code_runner' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { format } from 'assertion-error-formatter' import { ITestCaseHookParameter } from '../support_code_library_builder/types' import { IDefinition, IGetInvocationDataResponse } from '../models/definition' @@ -17,7 +16,7 @@ const { beginTiming, endTiming } = Time export interface IRunOptions { defaultTimeout: number hookParameter: ITestCaseHookParameter - step: messages.Pickle.IPickleStep + step: messages.PickleStep stepDefinition: IDefinition world: any } @@ -28,11 +27,9 @@ export async function run({ step, stepDefinition, world, -}: IRunOptions): Promise { +}: IRunOptions): Promise { beginTiming() - let error: any, - result: messages.TestStepFinished.ITestStepResult, - invocationData: IGetInvocationDataResponse + let error: any, result: any, invocationData: IGetInvocationDataResponse try { invocationData = await stepDefinition.getInvocationParameters({ @@ -66,22 +63,26 @@ export async function run({ } } - const testStepResult = messages.TestStepFinished.TestStepResult.fromObject({ - duration: millisecondsToDuration(endTiming()), - }) - + const duration = messages.TimeConversion.millisecondsToDuration(endTiming()) + let status: messages.TestStepResultStatus + let message: string if (result === 'skipped') { - testStepResult.status = Status.SKIPPED + status = messages.TestStepResultStatus.SKIPPED } else if (result === 'pending') { - testStepResult.status = Status.PENDING + status = messages.TestStepResultStatus.PENDING } else if (doesHaveValue(error)) { - testStepResult.message = format(error) - testStepResult.status = Status.FAILED + message = format(error) + status = messages.TestStepResultStatus.FAILED } else { - testStepResult.status = Status.PASSED + status = messages.TestStepResultStatus.PASSED } - return testStepResult + return { + duration, + status, + message, + willBeRetried: false, + } } export default { run } diff --git a/src/runtime/stopwatch.ts b/src/runtime/stopwatch.ts index 34f83d5e1..592e20e04 100644 --- a/src/runtime/stopwatch.ts +++ b/src/runtime/stopwatch.ts @@ -1,4 +1,4 @@ -import { messages, TimeConversion } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { stopwatch, Stopwatch, duration, Duration } from 'durations' export interface ITestRunStopwatch { @@ -6,7 +6,7 @@ export interface ITestRunStopwatch { start: () => ITestRunStopwatch stop: () => ITestRunStopwatch duration: () => Duration - timestamp: () => messages.ITimestamp + timestamp: () => messages.Timestamp } export class RealTestRunStopwatch implements ITestRunStopwatch { @@ -36,8 +36,8 @@ export class RealTestRunStopwatch implements ITestRunStopwatch { return current } - timestamp(): messages.ITimestamp { - return TimeConversion.millisecondsSinceEpochToTimestamp(Date.now()) + timestamp(): messages.Timestamp { + return messages.TimeConversion.millisecondsSinceEpochToTimestamp(Date.now()) } } @@ -66,14 +66,14 @@ export class PredictableTestRunStopwatch implements ITestRunStopwatch { return current } - timestamp(): messages.ITimestamp { + timestamp(): messages.Timestamp { const fakeTimestamp = this.convertToTimestamp(this.duration()) this.count++ return fakeTimestamp } // TODO: Remove. It's impossible to convert timestamps to durations and vice-versa - private convertToTimestamp(duration: Duration): messages.ITimestamp { + private convertToTimestamp(duration: Duration): messages.Timestamp { const seconds = Math.floor(duration.seconds()) const nanos = Math.floor((duration.seconds() - seconds) * 1000000000) return { diff --git a/src/status.ts b/src/status.ts deleted file mode 100644 index 2ea433e15..000000000 --- a/src/status.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { messages } from '@cucumber/messages' - -export default messages.TestStepFinished.TestStepResult.Status diff --git a/src/step_arguments.ts b/src/step_arguments.ts index 28c12a177..18fa0ee54 100644 --- a/src/step_arguments.ts +++ b/src/step_arguments.ts @@ -1,14 +1,14 @@ import util from 'util' -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { doesHaveValue } from './value_checker' export interface IPickleStepArgumentFunctionMap { - dataTable: (arg: messages.PickleStepArgument.IPickleTable) => T - docString: (arg: messages.PickleStepArgument.IPickleDocString) => T + dataTable: (arg: messages.PickleTable) => T + docString: (arg: messages.PickleDocString) => T } export function parseStepArgument( - arg: messages.IPickleStepArgument, + arg: messages.PickleStepArgument, mapping: IPickleStepArgumentFunctionMap ): T { if (doesHaveValue(arg.dataTable)) { diff --git a/src/support_code_library_builder/index.ts b/src/support_code_library_builder/index.ts index a3275b95d..8147fc6bf 100644 --- a/src/support_code_library_builder/index.ts +++ b/src/support_code_library_builder/index.ts @@ -1,6 +1,7 @@ import _ from 'lodash' import { buildParameterType, getDefinitionLineAndUri } from './build_helpers' -import { IdGenerator, messages } from '@cucumber/messages' +import { IdGenerator } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import TestCaseHookDefinition from '../models/test_case_hook_definition' import TestStepHookDefinition from '../models/test_step_hook_definition' import TestRunHookDefinition from '../models/test_run_hook_definition' @@ -307,10 +308,10 @@ export class SupportCodeLibraryBuilder { buildStepDefinitions(): { stepDefinitions: StepDefinition[] - undefinedParameterTypes: messages.IUndefinedParameterType[] + undefinedParameterTypes: messages.UndefinedParameterType[] } { const stepDefinitions: StepDefinition[] = [] - const undefinedParameterTypes: messages.IUndefinedParameterType[] = [] + const undefinedParameterTypes: messages.UndefinedParameterType[] = [] this.stepDefinitionConfigs.forEach( ({ code, line, options, pattern, uri }) => { let expression diff --git a/src/support_code_library_builder/types.ts b/src/support_code_library_builder/types.ts index 5bd26cb3f..9e22f38e9 100644 --- a/src/support_code_library_builder/types.ts +++ b/src/support_code_library_builder/types.ts @@ -1,4 +1,4 @@ -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import TestCaseHookDefinition from '../models/test_case_hook_definition' import TestStepHookDefinition from '../models/test_step_hook_definition' import TestRunHookDefinition from '../models/test_run_hook_definition' @@ -8,16 +8,16 @@ import { ParameterTypeRegistry } from '@cucumber/cucumber-expressions' export type DefineStepPattern = string | RegExp export interface ITestCaseHookParameter { - gherkinDocument: messages.IGherkinDocument - pickle: messages.IPickle - result?: messages.TestStepFinished.ITestStepResult + gherkinDocument: messages.GherkinDocument + pickle: messages.Pickle + result?: messages.TestStepResult testCaseStartedId: string } export interface ITestStepHookParameter { - gherkinDocument: messages.IGherkinDocument - pickle: messages.IPickle - result: messages.TestStepFinished.ITestStepResult + gherkinDocument: messages.GherkinDocument + pickle: messages.Pickle + result: messages.TestStepResult testCaseStartedId: string testStepId: string } @@ -121,7 +121,7 @@ export interface ISupportCodeLibrary { readonly beforeTestRunHookDefinitions: TestRunHookDefinition[] readonly defaultTimeout: number readonly stepDefinitions: StepDefinition[] - readonly undefinedParameterTypes: messages.IUndefinedParameterType[] + readonly undefinedParameterTypes: messages.UndefinedParameterType[] readonly parameterTypeRegistry: ParameterTypeRegistry readonly World: any } diff --git a/src/time.ts b/src/time.ts index 3dd0d5031..a836862a2 100644 --- a/src/time.ts +++ b/src/time.ts @@ -1,10 +1,4 @@ -import { messages, TimeConversion } from '@cucumber/messages' -import { doesNotHaveValue } from './value_checker' -import Long from 'long' - -export const NANOSECONDS_IN_MILLISECOND = 1e6 -export const MILLISECONDS_IN_SECOND = 1e3 -export const NANOSECONDS_IN_SECOND = 1e9 +import * as messages from '@cucumber/messages' let previousTimestamp: number @@ -31,60 +25,16 @@ function getTimestamp(): number { return new methods.Date().getTime() } -function toNumber(x: number | Long): number { - return typeof x === 'number' ? x : x.toNumber() -} - -export function addDurations( - a: messages.IDuration, - b: messages.IDuration -): messages.IDuration { - if (doesNotHaveValue(b)) { - return a - } - let seconds = toNumber(a.seconds) + toNumber(b.seconds) - let nanos = a.nanos + b.nanos - if (nanos > NANOSECONDS_IN_SECOND) { - seconds += 1 - nanos -= NANOSECONDS_IN_SECOND - } - return new messages.Duration({ seconds, nanos }) -} - -// TODO use TimeConversion methods in cucumber-messages -// dependent on https://github.com/cucumber/cucumber/pull/832 -export function millisecondsToDuration( - milliseconds: number -): messages.IDuration { - const seconds = Math.floor(milliseconds / MILLISECONDS_IN_SECOND) - const nanos = - (milliseconds - seconds * MILLISECONDS_IN_SECOND) * - NANOSECONDS_IN_MILLISECOND - return new messages.Duration({ seconds, nanos }) -} - -export function durationToMilliseconds(duration: messages.IDuration): number { - const secondMillis = toNumber(duration.seconds) * MILLISECONDS_IN_SECOND - const nanoMillis = duration.nanos / NANOSECONDS_IN_MILLISECOND - return secondMillis + nanoMillis -} - -export function durationToNanoseconds(duration: messages.IDuration): number { - return toNumber(duration.seconds) * NANOSECONDS_IN_SECOND + duration.nanos -} - export function durationBetweenTimestamps( - startedTimestamp: messages.ITimestamp, - finishedTimestamp: messages.ITimestamp -): messages.IDuration { + startedTimestamp: messages.Timestamp, + finishedTimestamp: messages.Timestamp +): messages.Duration { const durationMillis = - TimeConversion.timestampToMillisecondsSinceEpoch(finishedTimestamp) - - TimeConversion.timestampToMillisecondsSinceEpoch(startedTimestamp) - return TimeConversion.millisecondsToDuration(durationMillis) -} - -export function getZeroDuration(): messages.IDuration { - return new messages.Duration({ seconds: 0, nanos: 0 }) + messages.TimeConversion.timestampToMillisecondsSinceEpoch( + finishedTimestamp + ) - + messages.TimeConversion.timestampToMillisecondsSinceEpoch(startedTimestamp) + return messages.TimeConversion.millisecondsToDuration(durationMillis) } export default methods diff --git a/src/types/ndjson-parse/index.d.ts b/src/types/ndjson-parse/index.d.ts deleted file mode 100644 index fa7fae7fd..000000000 --- a/src/types/ndjson-parse/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'ndjson-parse' { - export default function parse(input: string): any[] -} diff --git a/test/formatter_helpers.ts b/test/formatter_helpers.ts index b12246b6b..a9feced6b 100644 --- a/test/formatter_helpers.ts +++ b/test/formatter_helpers.ts @@ -4,7 +4,8 @@ import Runtime, { IRuntimeOptions } from '../src/runtime' import { EventEmitter } from 'events' import { EventDataCollector } from '../src/formatter/helpers' import FormatterBuilder from '../src/formatter/builder' -import { IdGenerator, messages } from '@cucumber/messages' +import { IdGenerator } from '@cucumber/messages' +import * as messages from '@cucumber/messages' import { ISupportCodeLibrary } from '../src/support_code_library_builder/types' import { ITestCaseAttempt } from '../src/formatter/helpers/event_data_collector' import { doesNotHaveValue } from '../src/value_checker' @@ -12,7 +13,6 @@ import { IParsedArgvFormatOptions } from '../src/cli/argv_parser' import { PassThrough } from 'stream' import { emitSupportCodeMessages } from '../src/cli/helpers' import bluebird from 'bluebird' -import IEnvelope = messages.IEnvelope const { uuid } = IdGenerator @@ -33,7 +33,7 @@ export interface ITestFormatterOptions extends ITestRunOptions { } export interface IEnvelopesAndEventDataCollector { - envelopes: messages.IEnvelope[] + envelopes: messages.Envelope[] eventDataCollector: EventDataCollector } @@ -135,7 +135,7 @@ export async function getEnvelopesAndEventDataCollector({ } const eventBroadcaster = new EventEmitter() const eventDataCollector = new EventDataCollector(eventBroadcaster) - const envelopes: IEnvelope[] = [] + const envelopes: messages.Envelope[] = [] eventBroadcaster.on('envelope', (envelope) => envelopes.push(envelope)) emitSupportCodeMessages({ supportCodeLibrary, diff --git a/test/gherkin_helpers.ts b/test/gherkin_helpers.ts index 394f77917..a0b94e187 100644 --- a/test/gherkin_helpers.ts +++ b/test/gherkin_helpers.ts @@ -1,17 +1,18 @@ -import { messages } from '@cucumber/messages' +import * as messages from '@cucumber/messages' +import { SourceMediaType } from '@cucumber/messages' import { doesHaveValue } from '../src/value_checker' import { IGherkinOptions } from '@cucumber/gherkin' import { GherkinStreams } from '@cucumber/gherkin-streams' import { EventEmitter } from 'events' export interface IParsedSource { - pickles: messages.IPickle[] - source: messages.ISource - gherkinDocument: messages.IGherkinDocument + pickles: messages.Pickle[] + source: messages.Source + gherkinDocument: messages.GherkinDocument } export interface IParsedSourceWithEnvelopes extends IParsedSource { - envelopes: messages.IEnvelope[] + envelopes: messages.Envelope[] } export interface IParseRequest { @@ -25,22 +26,22 @@ export async function parse({ uri, options, }: IParseRequest): Promise { - const sources = [ + const sources: messages.Envelope[] = [ { source: { uri, data: data, - mediaType: 'text/x.cucumber.gherkin+plain', + mediaType: SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN, }, }, ] return await new Promise((resolve, reject) => { - let source: messages.ISource - let gherkinDocument: messages.IGherkinDocument - const pickles: messages.IPickle[] = [] - const envelopes: messages.IEnvelope[] = [] + let source: messages.Source + let gherkinDocument: messages.GherkinDocument + const pickles: messages.Pickle[] = [] + const envelopes: messages.Envelope[] = [] const messageStream = GherkinStreams.fromSources(sources, options) - messageStream.on('data', (envelope: messages.IEnvelope) => { + messageStream.on('data', (envelope: messages.Envelope) => { envelopes.push(envelope) if (doesHaveValue(envelope.source)) { source = envelope.source @@ -90,7 +91,7 @@ export async function generateEvents({ export async function getPickleWithTags( tags: string[] -): Promise { +): Promise { const { pickles: [pickle], } = await parse({ @@ -107,7 +108,7 @@ Feature: a export async function getPickleStepWithText( text: string -): Promise { +): Promise { const { pickles: [pickle], } = await parse({ diff --git a/yarn.lock b/yarn.lock index 73836db90..c12c87c0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,270 +9,286 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: - "@babel/highlight" "^7.10.4" + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.13.15": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== "@babel/core@^7.7.5": - version "7.11.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" - integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.6" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.5" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.5" - "@babel/types" "^7.11.5" + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.3" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.3" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" + gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" + semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.11.5", "@babel/generator@^7.11.6": - version "7.11.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" - integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== +"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: - "@babel/types" "^7.11.5" + "@babel/types" "^7.14.2" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-member-expression-to-functions@^7.10.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== - dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" +"@babel/helper-compilation-targets@^7.13.16": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== + dependencies: + "@babel/compat-data" "^7.13.15" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" + +"@babel/helper-function-name@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.14.2" + +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-imports@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-module-transforms@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" + integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" + +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-replace-supers@^7.13.12": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz#ca17b318b859d107f0e9b722d58cf12d94436600" + integrity sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" + +"@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" - integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== +"@babel/parser@^7.0.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" + integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== "@babel/polyfill@^7.2.3": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.11.5.tgz#df550b2ec53abbc2ed599367ec59e64c7a707bb5" - integrity sha512-FunXnE0Sgpd61pKSj2OSOs1D44rKTD3pGOfGilZ6LGrrIH0QEtJlTjqOqdF8Bs98JmjfGhni2BBkTfv9KcKJ9g== + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" + integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" - integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.5" - "@babel/types" "^7.11.5" +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.2" + "@babel/helper-function-name" "^7.14.2" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.14.2" + "@babel/types" "^7.14.2" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" - integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== +"@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" + integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" -"@cucumber/compatibility-kit@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@cucumber/compatibility-kit/-/compatibility-kit-4.0.1.tgz#566f95f2b1ca9f9b8c10ef463e9558ee03a393a4" - integrity sha512-M6UPb4wnrk8Ue2tb0rH89kddFPO0Ccsp7Gkz1ruytQaFvIWqnlyjpadY3YdXjH3bkIisbGXK+djSh3PfwRZ8ew== +"@cucumber/compatibility-kit@6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@cucumber/compatibility-kit/-/compatibility-kit-6.0.0.tgz#c36aa033df6638450e84930015a7d5204eff9897" + integrity sha512-WkjgmbgKxjIk3hhfuvbqFvW1zLjX4DoCc+Ivjxg44Nrs2zj7FIvWP2R2isGtdAMQy2FUy//vfJlt0y61Pw2EtQ== -"@cucumber/create-meta@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/create-meta/-/create-meta-4.0.0.tgz#ef97070640475e6e1480be93dc1042d361516ea6" - integrity sha512-I2GWC9PoIGmpc0w/vz2YYeGl/eog1oFogYKUjgflDjhECo1mpD/WQjMRPNOsZnd859S8fPgVByKzGQAWjfjGyQ== +"@cucumber/create-meta@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@cucumber/create-meta/-/create-meta-5.0.0.tgz#baea1a40ec823881eeefc29a523d6c87d13f4016" + integrity sha512-Z5kMZkUff00S3/KSnKzB/KOm2UIxMXY1xXmj2dQMlD49lV6v/W8EEvgDMNtQotQNSOQU5bDupmWQpk+o16tXIw== dependencies: - "@cucumber/messages" "^15.0.0" + "@cucumber/messages" "^16.0.0" -"@cucumber/cucumber-expressions@12.0.1": - version "12.0.1" - resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-12.0.1.tgz#7ab8936adb82d2bb45b86baa494e4e6e3dc9839f" - integrity sha512-ANzu80Mw9GzTQ5ImuLdBtHnQfG8MghVvvtud4GHBvlQ4Wzu1SvkUj3RsdtW9w3p7mATSw8SiSFj6Jel3cEWN6Q== +"@cucumber/cucumber-expressions@^12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-12.1.1.tgz#93fa0436d82a23305f8ee0c226ef11e041f87352" + integrity sha512-WKkQAW5A8mReAFbl6FwkSiTNsy478JAOrHROrzUqNDW7Q/FU3yvrvgueX7G0NHAkvMYUMLYTSaxqLFQIMJ+K3Q== dependencies: becke-ch--regex--s0-0-v1--base--pl--lib "^1.4.0" -"@cucumber/gherkin-streams@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/gherkin-streams/-/gherkin-streams-1.0.0.tgz#e4938ba130fceec8ebc641298557c2a21dcabd5f" - integrity sha512-ZGUvkwj8DnMozii+8YqWtiWuKqU+Opt50dWVeJzv2e+4GDh0P1Nc04RGMZkFf8WTl2sgBJq5waPUKCQVPaw6iQ== - dependencies: - "@cucumber/gherkin" "^18.0.0" - "@cucumber/message-streams" "^1.0.0" - "@cucumber/messages" "^15.0.0" - commander "^7.2.0" - protobufjs "^6.10.2" - source-map-support "^0.5.19" - -"@cucumber/gherkin@18.0.0", "@cucumber/gherkin@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-18.0.0.tgz#af51ca7173aa7818ed1aa50e3477d9bbe9d1c954" - integrity sha512-Az+VD2NyOM2ZjzuVGrpJTl1VDv1j50graLtjUp7GfGYN+wMMV+jPgKV5fGYQeocjDnJYYlKymiUZzxcxvStJmg== - dependencies: - "@cucumber/message-streams" "^1.0.0" - "@cucumber/messages" "^15.0.0" - -"@cucumber/html-formatter@13.0.0": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-13.0.0.tgz#ac6abe30813e455efe5e19e01daa00cf2d9fe32b" - integrity sha512-+gNLbgeti/5UXm2bVYvtjgdlEiY6r1WsNWChezXE6LJsviy7HrA6WWbwFWFSxs3CLgee5Us5Pe8JonQAnFEiBw== - dependencies: - "@cucumber/messages" "^15.0.0" - commander "^7.2.0" - source-map-support "^0.5.19" - -"@cucumber/message-streams@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-1.0.0.tgz#5162e65df51eb51e0aa484ef0ed46200b19a699a" - integrity sha512-i1Jx0EDnE+3Na82UxJ2VqE6aWWJJ+1H+3ax+SYgHmCmlUDJiJzx9dHxAAO3GISrM/RYUAuqMGHNAMnIcxkL3Pw== +"@cucumber/gherkin-streams@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cucumber/gherkin-streams/-/gherkin-streams-2.0.2.tgz#de09e279fe793e93ee83606376df291954fef83b" + integrity sha512-cKmXOBz4OwGlrHMBCc4qCC3KzLaqcEZ11nWWskIbv6jyfvlIRuM2OgEF6VLcNVewczifW1p6DrDj0OO+BeXocA== + dependencies: + "@cucumber/gherkin" "^19.0.1" + "@cucumber/message-streams" "^2.0.0" + "@cucumber/messages" "^16.0.0" + commander "7.2.0" + source-map-support "0.5.19" + +"@cucumber/gherkin@^19.0.1", "@cucumber/gherkin@^19.0.3": + version "19.0.3" + resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-19.0.3.tgz#61036ca4940e66f8a787be5f92ce229ae3815ebf" + integrity sha512-gWdMm8mfRk3P+VugJWvNALaQV5QnT+5RkqWy3tO+4NsMSQZPo5p4V4vXwriQZ/sZR1Wni5TDRztuRsKLgZ3XHA== + dependencies: + "@cucumber/message-streams" "^2.0.0" + "@cucumber/messages" "^16.0.1" + +"@cucumber/html-formatter@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-14.0.0.tgz#4e36d40e5b3f334031b2290513200234cbc5c7c9" + integrity sha512-2Z1GPSEmgy7ZU4O+PG4/46utYVJv39wKfdgenWIfXQsXxYk7fByjphgFoAGQ89Ghg/9NgC4EFHMRTM/B4EYqEw== dependencies: - "@cucumber/messages" "^15.0.0" - protobufjs "^6.10.2" + "@cucumber/messages" "^16.0.0" + commander "7.2.0" + source-map-support "0.5.19" -"@cucumber/messages@15.0.0", "@cucumber/messages@^15.0.0": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-15.0.0.tgz#58e6541a6c21c4f0d3d4a82c24bbbfe72a6ff94c" - integrity sha512-LtxzSCRmYZTAKO6ucAcMflz0u90l2fev539OG+EioJ26F14KmmtxZwGabfjTxLf8NgyKeWsO8TGI2G3z4Kjr+A== +"@cucumber/message-streams@2.0.0", "@cucumber/message-streams@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-2.0.0.tgz#3cf2cdeebff50a60736ed0d04f696ca5964587ec" + integrity sha512-zbZY+vZCk99FZzsgkCrRdqpFizp+ksM7q2kJJbtjTcjN8T+2cnaLUmmFMNYzMvORx39dn4kdRJYaAQh+eachrg== dependencies: - "@types/uuid" "^8.3.0" - protobufjs "^6.10.2" - uuid "^8.3.2" + "@cucumber/messages" "^16.0.0" -"@cucumber/query@9.0.2": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@cucumber/query/-/query-9.0.2.tgz#2b7ef65df4bba58f14d9415b5eb167fde10e670e" - integrity sha512-YrOSZQzWWVle+8B57zaSFfQt9jYTPDamBnwdc1EGKI1sXyALjHnGgCLXUFH/HjDieQkXIh2y+MHJ51t2u9ys1A== +"@cucumber/messages@^16.0.0", "@cucumber/messages@^16.0.1": + version "16.0.1" + resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-16.0.1.tgz#8a9f9bb6ad0430d8ddd044dd49cb45ef37ee67b7" + integrity sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ== dependencies: - "@cucumber/messages" "^15.0.0" - "@teppeis/multimaps" "^2.0.0" + "@types/uuid" "8.3.0" + class-transformer "0.4.0" + reflect-metadata "0.1.13" + uuid "8.3.2" -"@cucumber/tag-expressions@3.0.1": +"@cucumber/query@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@cucumber/query/-/query-10.0.0.tgz#0b210f4701f5c243ce74e7b102a5570e456e4399" + integrity sha512-Ssp/So98rIl6o38bgR/Kh6xKdt902zoXXooj7924lvbmVZ5tvDvEgkaptHxztT5NVka7YU0bM04CrTk/DMKr5g== + dependencies: + "@cucumber/messages" "^16.0.0" + "@teppeis/multimaps" "2.0.0" + +"@cucumber/tag-expressions@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-3.0.1.tgz#ca0702342bc4234ad73d9de3f1bf97461c3b5eb7" integrity sha512-OGCXaJ1BQXmQ5b9pw+JYsBGumK2/LPZiLmbj1o1JFVeSNs2PY8WPQFSyXrskhrHz5Nd/6lYg7lvGMtFHOncC4w== "@eslint/eslintrc@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" - integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" + integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -296,93 +312,40 @@ resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.4" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= - "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" - integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" @@ -400,6 +363,13 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sinonjs/fake-timers@^7.0.4": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.0.tgz#8f13af27d842cbf51ad4502e05562fe9391d084e" + integrity sha512-hAEzXi6Wbvlb67NnGMGSNOeAflLVnMa4yliPU/ty1qjgW/vAletH15/v/esJwASSIA0YlIyjnloenFbEZc9q9A== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/samsam@^5.3.1": version "5.3.1" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f" @@ -421,7 +391,7 @@ dependencies: defer-to-connect "^1.0.1" -"@teppeis/multimaps@^2.0.0": +"@teppeis/multimaps@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@teppeis/multimaps/-/multimaps-2.0.0.tgz#2114ee964b702f9777d0e07899087ad9cd89a0de" integrity sha512-TL1adzq1HdxUf9WYduLcQ/DNGYiz71U31QRgbnr0Ef1cPyOUOsBojxHVWpFeOSUucB6Lrs0LxFRA14ntgtkc9w== @@ -440,27 +410,22 @@ "@types/node" "*" "@types/chai-as-promised@*": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" - integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg== + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" + integrity sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA== dependencies: "@types/chai" "*" "@types/chai@*": - version "4.2.12" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.12.tgz#6160ae454cd89dae05adc3bb97997f488b608201" - integrity sha512-aN5IAC8QNtSUdQzxu7lGBgYAOuU1tmRU4c9dIq5OKGf/SBVjXo+ffM2wEjudAWbgpOhy60nLoAGH1xm8fpCKFQ== + version "4.2.18" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.18.tgz#0c8e298dbff8205e2266606c1ea5fbdba29b46e4" + integrity sha512-rS27+EkB/RE1Iz3u0XtVL5q36MGDWbgYe7zWiodyKNUnthxY0rukK5V36eiUCtCisB7NN8zKYH6DO2M37qxFEQ== "@types/chai@4.2.17": version "4.2.17" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.17.tgz#85f9f0610f514b22a94125d441f73eef65bde5cc" integrity sha512-LaiwWNnYuL8xJlQcE91QB2JoswWZckq9A4b+nMPq8dt8AP96727Nb3X4e74u+E3tm4NLTILNI9MYFsyVc30wSA== -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - "@types/connect@*": version "3.4.34" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901" @@ -477,9 +442,9 @@ "@types/chai-as-promised" "*" "@types/express-serve-static-core@^4.17.18": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz#8371e260f40e0e1ca0c116a9afcd9426fa094c40" - integrity sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA== + version "4.17.19" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" + integrity sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -511,9 +476,9 @@ "@types/node" "*" "@types/json-schema@^7.0.3": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" - integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== "@types/json5@^0.0.29": version "0.0.29" @@ -525,20 +490,15 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== -"@types/long@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" - integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== - -"@types/mime@*": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" - integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" + integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== "@types/minimist@^1.2.0": version "1.2.1" @@ -563,20 +523,15 @@ "@types/node" "*" "@types/node@*": - version "14.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.10.1.tgz#cc323bad8e8a533d4822f45ce4e5326f36e42177" - integrity sha512-aYNbO+FZ/3KGeQCEkNhHFRIzBOUgc7QvcVNKXbfnhDkSfwUv91JsQQa10rDgKSTSLkXZ1UIyPe4FJJNVgw1xWQ== + version "15.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc" + integrity sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A== "@types/node@14.14.43": version "14.14.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8" integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ== -"@types/node@^13.7.0": - version "13.13.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.19.tgz#f4165496e66e3da37b9e136887db446795e00c5b" - integrity sha512-IVsULCpTdafcHhBDLYEPnV5l15xV0q065zvOHC1ZmzFYaBCMzku078eXnazoSG8907vZjRgEN/EQjku7GwwFyQ== - "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -590,9 +545,9 @@ "@types/node" "*" "@types/qs@*": - version "6.9.5" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" - integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + version "6.9.6" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" + integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== "@types/range-parser@*": version "1.2.3" @@ -610,11 +565,11 @@ integrity sha512-iotVxtCCsPLRAvxMFFgxL8HD2l4mAZ2Oin7/VJ2ooWO0VOK4EGOGmZWZn1uCq7RofR3I/1IOSjCHlFT71eVK0Q== "@types/serve-static@*": - version "1.13.8" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.8.tgz#851129d434433c7082148574ffec263d58309c46" - integrity sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA== + version "1.13.9" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e" + integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA== dependencies: - "@types/mime" "*" + "@types/mime" "^1" "@types/node" "*" "@types/sinon-chai@3.2.5": @@ -626,16 +581,11 @@ "@types/sinon" "*" "@types/sinon@*": - version "9.0.5" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.5.tgz#56b2a12662dd8c7d081cdc511af5f872cb37377f" - integrity sha512-4CnkGdM/5/FXDGqL32JQ1ttVrGvhOoesLLF7VnTh4KdjK5N5VQOtxaylFqqTjnHx55MnD9O02Nbk5c1ELC8wlQ== + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.0.tgz#eecc3847af03d45ffe53d55aaaaf6ecb28b5e584" + integrity sha512-jDZ55oCKxqlDmoTBBbBBEx+N8ZraUVhggMZ9T5t+6/Dh8/4NiOjSUfpLrPiEwxQDlAe3wpAkoXhWvE6LibtsMQ== dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz#681df970358c82836b42f989188d133e218c458e" - integrity sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA== + "@sinonjs/fake-timers" "^7.0.4" "@types/sinonjs__fake-timers@6.0.2": version "6.0.2" @@ -654,7 +604,7 @@ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.0.tgz#e3f52b4d7397eaa9193592ef3fdd44dc0af4298c" integrity sha512-flgpHJjntpBAdJD43ShRosQvNC0ME97DCfGvZEDlAThQmnerRXrLbX6YgzRBQCZTthET9eAWFAMaYP0m0Y4HzQ== -"@types/uuid@^8.3.0": +"@types/uuid@8.3.0": version "8.3.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== @@ -701,13 +651,13 @@ debug "^4.1.1" "@typescript-eslint/parser@^4.0.0": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.8.2.tgz#78dccbe5124de2b8dea2d4c363dee9f769151ca8" - integrity sha512-u0leyJqmclYr3KcXOqd2fmx6SDGBO0MUNHHAjr0JS4Crbb3C3d8dwAdlazy133PLCcPn+aOUFiHn72wcuc5wYw== + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.24.0.tgz#2e5f1cc78ffefe43bfac7e5659309a92b09a51bd" + integrity sha512-dj1ZIh/4QKeECLb2f/QjRwMmDArcwc2WorWPRlB8UNTZlY1KpTVsbX7e3ZZdphfRw29aTFUSNuGB8w9X5sS97w== dependencies: - "@typescript-eslint/scope-manager" "4.8.2" - "@typescript-eslint/types" "4.8.2" - "@typescript-eslint/typescript-estree" "4.8.2" + "@typescript-eslint/scope-manager" "4.24.0" + "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/typescript-estree" "4.24.0" debug "^4.1.1" "@typescript-eslint/scope-manager@4.22.0": @@ -718,23 +668,23 @@ "@typescript-eslint/types" "4.22.0" "@typescript-eslint/visitor-keys" "4.22.0" -"@typescript-eslint/scope-manager@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.8.2.tgz#a18388c63ae9c17adde519384f539392f2c4f0d9" - integrity sha512-qHQ8ODi7mMin4Sq2eh/6eu03uVzsf5TX+J43xRmiq8ujng7ViQSHNPLOHGw/Wr5dFEoxq/ubKhzClIIdQy5q3g== +"@typescript-eslint/scope-manager@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.24.0.tgz#38088216f0eaf235fa30ed8cabf6948ec734f359" + integrity sha512-9+WYJGDnuC9VtYLqBhcSuM7du75fyCS/ypC8c5g7Sdw7pGL4NDTbeH38eJPfzIydCHZDoOgjloxSAA3+4l/zsA== dependencies: - "@typescript-eslint/types" "4.8.2" - "@typescript-eslint/visitor-keys" "4.8.2" + "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/visitor-keys" "4.24.0" "@typescript-eslint/types@4.22.0": version "4.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.22.0.tgz#0ca6fde5b68daf6dba133f30959cc0688c8dd0b6" integrity sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA== -"@typescript-eslint/types@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.8.2.tgz#c862dd0e569d9478eb82d6aee662ea53f5661a36" - integrity sha512-z1/AVcVF8ju5ObaHe2fOpZYEQrwHyZ7PTOlmjd3EoFeX9sv7UekQhfrCmgUO7PruLNfSHrJGQvrW3Q7xQ8EoAw== +"@typescript-eslint/types@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.24.0.tgz#6d0cca2048cbda4e265e0c4db9c2a62aaad8228c" + integrity sha512-tkZUBgDQKdvfs8L47LaqxojKDE+mIUmOzdz7r+u+U54l3GDkTpEbQ1Jp3cNqqAU9vMUCBA1fitsIhm7yN0vx9Q== "@typescript-eslint/typescript-estree@4.22.0": version "4.22.0" @@ -749,17 +699,16 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.2.tgz#eeec34707d8577600fb21661b5287226cc8b3bed" - integrity sha512-HToGNwI6fekH0dOw3XEVESUm71Onfam0AKin6f26S2FtUmO7o3cLlWgrIaT1q3vjB3wCTdww3Dx2iGq5wtUOCg== +"@typescript-eslint/typescript-estree@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.24.0.tgz#b49249679a98014d8b03e8d4b70864b950e3c90f" + integrity sha512-kBDitL/by/HK7g8CYLT7aKpAwlR8doshfWz8d71j97n5kUa5caHWvY0RvEUEanL/EqBJoANev8Xc/mQ6LLwXGA== dependencies: - "@typescript-eslint/types" "4.8.2" - "@typescript-eslint/visitor-keys" "4.8.2" + "@typescript-eslint/types" "4.24.0" + "@typescript-eslint/visitor-keys" "4.24.0" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" - lodash "^4.17.15" semver "^7.3.2" tsutils "^3.17.1" @@ -771,12 +720,12 @@ "@typescript-eslint/types" "4.22.0" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@4.8.2": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.2.tgz#62cd3fbbbf65f8eccfbe6f159eb1b84a243a3f77" - integrity sha512-Vg+/SJTMZJEKKGHW7YC21QxgKJrSbxoYYd3MEUGtW7zuytHuEcksewq0DUmo4eh/CTNrVJGSdIY9AtRb6riWFw== +"@typescript-eslint/visitor-keys@4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.24.0.tgz#a8fafdc76cad4e04a681a945fbbac4e35e98e297" + integrity sha512-4ox1sjmGHIxjEDBnMCtWFFhErXtKA1Ec0sBpuz0fqf3P+g3JFGyTxxbF06byw0FRsPnnbq44cKivH7Ks1/0s6g== dependencies: - "@typescript-eslint/types" "4.8.2" + "@typescript-eslint/types" "4.24.0" eslint-visitor-keys "^2.0.0" "@ungap/promise-all-settled@1.1.2": @@ -792,7 +741,7 @@ accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: +acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== @@ -812,9 +761,9 @@ acorn-walk@^7.0.0: integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^7.0.0, acorn@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== aggregate-error@^3.0.0: version "3.1.0" @@ -825,15 +774,25 @@ aggregate-error@^3.0.0: indent-string "^4.0.0" ajv@^6.10.0, ajv@^6.12.4: - version "6.12.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" - integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" + integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-align@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" @@ -847,11 +806,11 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" + type-fest "^0.21.3" ansi-regex@^3.0.0: version "3.0.0" @@ -876,11 +835,10 @@ ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" any-promise@^1.0.0: @@ -889,9 +847,9 @@ any-promise@^1.0.0: integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -931,12 +889,14 @@ array-flatten@1.1.1: integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" is-string "^1.0.5" array-union@^2.1.0: @@ -945,12 +905,13 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" arrify@^1.0.1: version "1.0.1" @@ -962,7 +923,7 @@ assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -assertion-error-formatter@3.0.0: +assertion-error-formatter@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz#be9c8825dee6a8a6c72183d915912d9b57d5d265" integrity sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ== @@ -987,9 +948,9 @@ at-least-node@^1.0.0: integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== becke-ch--regex--s0-0-v1--base--pl--lib@^1.4.0: version "1.4.0" @@ -997,9 +958,9 @@ becke-ch--regex--s0-0-v1--base--pl--lib@^1.4.0: integrity sha1-Qpzuu/pffpNueNc/vcfacWKyDiA= binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bluebird@^3.4.3, bluebird@^3.7.2: version "3.7.2" @@ -1056,15 +1017,26 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +browserslist@^4.14.5: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== builtin-modules@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" - integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" + integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== bytes@3.1.0: version "3.1.0" @@ -1094,6 +1066,14 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1126,6 +1106,11 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== +caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== + capital-case@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" @@ -1172,9 +1157,9 @@ chalk@^3.0.0: supports-color "^7.1.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -1204,6 +1189,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +class-transformer@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.4.0.tgz#b52144117b423c516afb44cc1c76dbad31c2165b" + integrity sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -1278,17 +1268,17 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + colors@^1.0.3, colors@^1.1.2, colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -commander@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.0.0.tgz#3e2bbfd8bb6724760980988fb5b22b7ee6b71ab2" - integrity sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA== - -commander@^7.2.0: +commander@7.2.0, commander@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -1350,9 +1340,9 @@ cookie@0.4.0: integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== core-js@^2.6.5: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@1.0.2: version "1.0.2" @@ -1393,17 +1383,17 @@ debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4.3.1: +debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" @@ -1592,6 +1582,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.723: + version "1.3.736" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz#f632d900a1f788dab22fec9c62ec5c9c8f0c4052" + integrity sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1635,40 +1630,27 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.1.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.0: - version "1.18.0-next.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" - integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -1775,11 +1757,11 @@ eslint-import-resolver-node@^0.3.4: resolve "^1.13.1" eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + version "2.6.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz#b51be1e473dd0de1c5ea638e22429c2490ea8233" + integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== dependencies: - debug "^2.6.9" + debug "^3.2.7" pkg-dir "^2.0.0" eslint-plugin-es@^3.0.0: @@ -1839,9 +1821,9 @@ eslint-plugin-standard@4.1.0: integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== eslint-rule-docs@^1.1.5: - version "1.1.218" - resolved "https://registry.yarnpkg.com/eslint-rule-docs/-/eslint-rule-docs-1.1.218.tgz#089482e87918995f51f86c5412b30c9cb46a1ea1" - integrity sha512-oGT85qE8VvBEUuW1/9NjCye9+1kY5zjjiJgkzPHPDhwS3k3GwEN9NfflKW+eDM+lYB18EVuXUDiubNcdgabEQA== + version "1.1.226" + resolved "https://registry.yarnpkg.com/eslint-rule-docs/-/eslint-rule-docs-1.1.226.tgz#5778f20065109ab7c5604100776af089f76f9ca0" + integrity sha512-Wnn0ETzE2v2UT0OdRCcdMNPkQtbzyZr3pPPXnkreP0l6ZJaKqnl88dL1DqZ6nCCZZwDGBAnN0Y+nCvGxxLPQLQ== eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" @@ -1864,9 +1846,9 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@7.25.0: version "7.25.0" @@ -1911,16 +1893,7 @@ eslint@7.25.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" - integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.3.0" - -espree@^7.3.1: +espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== @@ -2027,9 +2000,9 @@ fast-diff@^1.1.2: integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.1.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2049,9 +2022,9 @@ fast-levenshtein@^2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" - integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== dependencies: reusify "^1.0.4" @@ -2140,9 +2113,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" - integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== foreground-child@^2.0.0: version "2.0.0" @@ -2163,9 +2136,9 @@ fresh@0.5.2: integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fromentries@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.1.tgz#64c31665630479bc993cd800d53387920dc61b4d" - integrity sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw== + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs-extra@9.1.0: version "9.1.0" @@ -2206,10 +2179,10 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" @@ -2221,6 +2194,15 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -2241,13 +2223,13 @@ get-stream@^5.1.0: pump "^3.0.0" glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.6, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -2259,6 +2241,18 @@ glob@7.1.6, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" @@ -2279,16 +2273,16 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.7.0.tgz#aed3bcefd80ad3ec0f0be2cf0c895110c0591795" - integrity sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA== + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== dependencies: type-fest "^0.20.2" globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" @@ -2315,9 +2309,9 @@ got@^9.6.0: url-parse-lax "^3.0.0" graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== growl@1.10.5: version "1.10.5" @@ -2329,6 +2323,11 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2339,10 +2338,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-yarn@^2.1.0: version "2.1.0" @@ -2357,9 +2356,9 @@ has@^1.0.3: function-bind "^1.1.1" hasha@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" - integrity sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw== + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: is-stream "^2.0.0" type-fest "^0.8.0" @@ -2370,9 +2369,9 @@ he@1.2.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-escaper@^2.0.0: version "2.0.2" @@ -2424,9 +2423,9 @@ ignore@^5.1.1, ignore@^5.1.4: integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -2480,15 +2479,20 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== irregular-plurals@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" - integrity sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q== + version "3.3.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.3.0.tgz#67d0715d4361a60d9fd9ee80af3881c631a31ee2" + integrity sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g== is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2496,10 +2500,17 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.1.tgz#4d1e21a4f437509d25ce55f8184350771421c96d" - integrity sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg== +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-ci@^2.0.0: version "2.0.0" @@ -2508,17 +2519,17 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== +is-core-module@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== is-extglob@^2.1.1: version "2.1.1" @@ -2555,16 +2566,21 @@ is-installed-globally@^0.3.1: global-dirs "^2.0.1" is-path-inside "^3.0.1" -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-npm@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2576,9 +2592,9 @@ is-obj@^2.0.0: integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^1.1.0: version "1.1.0" @@ -2590,12 +2606,13 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-regex@^1.1.0, is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== +is-regex@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== dependencies: - has-symbols "^1.0.1" + call-bind "^1.0.2" + has-symbols "^1.0.2" is-stream@^2.0.0: version "2.0.0" @@ -2603,22 +2620,27 @@ is-stream@^2.0.0: integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2718,9 +2740,9 @@ js-yaml@4.0.0: argparse "^2.0.1" js-yaml@^3.13.1, js-yaml@^3.3.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -2745,6 +2767,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -2758,9 +2785,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -2772,18 +2799,18 @@ jsonfile@^4.0.0: graceful-fs "^4.1.6" jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - universalify "^1.0.0" + universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" just-extend@^4.0.2: - version "4.1.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" - integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== keyv@^3.0.0: version "3.1.0" @@ -2856,6 +2883,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -2866,27 +2898,30 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.2.1: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.21, lodash@^4.2.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.0.0, log-symbols@^4.0.0: +log-symbols@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: chalk "^4.0.0" -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +log-symbols@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" lower-case@^1.1.1: version "1.1.4" @@ -2935,9 +2970,9 @@ map-obj@^1.0.0: integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + version "4.2.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" + integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== media-typer@0.3.0: version "0.3.0" @@ -2977,24 +3012,24 @@ methods@~1.1.2: integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.44.0" + mime-db "1.47.0" mime@1.6.0: version "1.6.0" @@ -3073,12 +3108,12 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3107,11 +3142,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -ndjson-parse@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ndjson-parse/-/ndjson-parse-1.0.4.tgz#65c031147ea1b5fa6f692e4fd63ab75f89dbf648" - integrity sha512-xwglvz2dMbxvX4NAVKnww8xEJ4kp4+CKVseQQdtkA79yI3abPqyBYqk6A6HvNci5oS0cUsSHheMEV1c+9MWlEw== - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -3155,6 +3185,11 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== + node-source-walk@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.2.0.tgz#c2efe731ea8ba9c03c562aa0a9d984e54f27bc2c" @@ -3178,9 +3213,9 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== nyc@15.1.0: version "15.1.0" @@ -3220,34 +3255,34 @@ object-assign@^4.0.1, object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-inspect@^1.7.0, object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== +object-inspect@^1.9.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" has-symbols "^1.0.1" object-keys "^1.1.1" object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" + integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.2" has "^1.0.3" on-finished@~2.3.0: @@ -3296,11 +3331,11 @@ p-limit@^2.2.0: p-try "^2.0.0" p-limit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" - integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-try "^2.0.0" + yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" @@ -3382,9 +3417,9 @@ parse-json@^2.2.0: error-ex "^1.2.0" parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" @@ -3450,10 +3485,10 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pify@^2.0.0: version "2.3.0" @@ -3520,25 +3555,6 @@ promise-polyfill@^1.1.6: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-1.1.6.tgz#cd04eff46f5c95c3a7d045591d79b5e3e01f12d7" integrity sha1-zQTv9G9clcOn0EVZHXm14+AfEtc= -protobufjs@^6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.2.tgz#b9cb6bd8ec8f87514592ba3fdfd28e93f33a469b" - integrity sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" "^13.7.0" - long "^4.0.0" - proxy-addr@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" @@ -3572,6 +3588,11 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -3660,6 +3681,11 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect-metadata@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" @@ -3701,6 +3727,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -3723,19 +3754,12 @@ resolve-pkg@^2.0.0: dependencies: resolve-from "^5.0.0" -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.19.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.1.0" + is-core-module "^2.2.0" path-parse "^1.0.6" responselike@^1.0.2: @@ -3758,9 +3782,11 @@ rimraf@^3.0.0, rimraf@^3.0.2: glob "^7.1.3" run-parallel@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" - integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" safe-buffer@5.1.2, safe-buffer@~5.1.1: version "5.1.2" @@ -3789,12 +3815,12 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1: +"semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.5: +semver@7.3.5, semver@^7.2.1, semver@^7.3.2: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -3806,11 +3832,6 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -3910,7 +3931,7 @@ sorted-object@^2.0.0: resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" integrity sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw= -source-map-support@^0.5.17, source-map-support@^0.5.19: +source-map-support@0.5.19, source-map-support@^0.5.17: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -3967,9 +3988,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.9" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" + integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== sprintf-js@~1.0.2: version "1.0.3" @@ -4050,29 +4071,29 @@ string-width@^3.0.0: strip-ansi "^5.1.0" string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.5" strip-ansi@^4.0.0: version "4.0.0" @@ -4144,22 +4165,24 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" table@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.4.tgz#c523dd182177e926c723eb20e1b341238188aa0d" - integrity sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw== + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: - ajv "^6.12.4" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" term-size@^2.1.0: version "2.2.1" @@ -4263,19 +4286,19 @@ tsd@0.14.0: update-notifier "^4.1.0" tslib@^1.8.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" - integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== tsutils@^3.17.1: - version "3.17.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" - integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -4291,11 +4314,6 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" @@ -4306,6 +4324,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -4330,9 +4353,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" - integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -4346,6 +4369,16 @@ typescript@4.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -4358,11 +4391,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -4405,9 +4433,9 @@ upper-case@^1.1.1: integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -4428,20 +4456,20 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^3.3.3: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== validate-npm-package-license@^3.0.1: version "3.0.4" @@ -4465,6 +4493,17 @@ verror@^1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -4545,14 +4584,14 @@ xtend@^4.0.2: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^4.0.0: version "4.0.0" @@ -4573,9 +4612,9 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: decamelize "^1.2.0" yargs-parser@^20.2.2: - version "20.2.6" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" - integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== yargs-unparser@2.0.0: version "2.0.0" @@ -4621,3 +4660,8 @@ yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==