From ff1b0bdc75d0094f98a6337bb3f69516706bf1a0 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 19 Feb 2021 20:31:48 +0100 Subject: [PATCH 01/25] feat(test-runner api): add call site information * Add optional `fileName` and `startPositio`n to `TestResult` interface --- packages/api/src/test-runner/test-result.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/api/src/test-runner/test-result.ts b/packages/api/src/test-runner/test-result.ts index e7f286ad1a..1769246f6c 100644 --- a/packages/api/src/test-runner/test-result.ts +++ b/packages/api/src/test-runner/test-result.ts @@ -1,9 +1,11 @@ +import { Position } from '../core'; + import { TestStatus } from './test-status'; /** * Indicates the result of a single test */ -interface BaseTestResult { +export interface BaseTestResult { /** * The id of this test. Can be the name if the test runner doesn't have an 'id' */ @@ -16,6 +18,16 @@ interface BaseTestResult { * The time it took to run the test */ timeSpentMs: number; + + /** + * The file where this test was defined in (if known) + */ + fileName?: string; + + /** + * The position of the test (if known) + */ + startPosition?: Position; } export interface FailedTestResult extends BaseTestResult { From 19c7fb80142a1f94b94bd590528660931ef2dcef Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 19 Feb 2021 20:32:22 +0100 Subject: [PATCH 02/25] feat(jest-runner): Add call site information to `DryRunResult` --- .../jest-greater-than-25-adapter.ts | 3 +- .../jest-less-than-25-adapter.ts | 3 +- .../jest-test-adapters/jest-test-adapter.ts | 1 + packages/jest-runner/src/jest-test-runner.ts | 38 +++++++++---------- .../jest-runner/test/helpers/assertions.ts | 15 ++++++++ .../jest-runner/test/helpers/producers.ts | 7 ++++ .../integration/jest-test-runner.it.spec.ts | 37 ++++++++++++++++++ .../jest-greater-than-25-adapter.spec.ts | 28 +++++++++++--- .../test/unit/jest-test-runner.spec.ts | 14 +++++++ 9 files changed, 119 insertions(+), 27 deletions(-) create mode 100644 packages/jest-runner/test/helpers/assertions.ts diff --git a/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts b/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts index 9a5fc1503b..b3f493ed94 100644 --- a/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts +++ b/packages/jest-runner/src/jest-test-adapters/jest-greater-than-25-adapter.ts @@ -4,7 +4,7 @@ import { JestRunResult } from '../jest-run-result'; import { JestTestAdapter, RunSettings } from './jest-test-adapter'; export class JestGreaterThan25TestAdapter implements JestTestAdapter { - public async run({ jestConfig, projectRoot, fileNameUnderTest, testNamePattern }: RunSettings): Promise { + public async run({ jestConfig, projectRoot, fileNameUnderTest, testNamePattern, testLocationInResults }: RunSettings): Promise { const config = JSON.stringify(jestConfig); const result = await jestWrapper.runCLI( { @@ -15,6 +15,7 @@ export class JestGreaterThan25TestAdapter implements JestTestAdapter { runInBand: true, silent: true, testNamePattern, + testLocationInResults, }, [projectRoot] ); diff --git a/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts b/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts index 72a4820022..b501d033b5 100644 --- a/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts +++ b/packages/jest-runner/src/jest-test-adapters/jest-less-than-25-adapter.ts @@ -9,7 +9,7 @@ import { RunSettings, JestTestAdapter } from './jest-test-adapter'; * It has a lot of `any` typings here, since the installed typings are not in sync. */ export class JestLessThan25TestAdapter implements JestTestAdapter { - public run({ jestConfig, projectRoot, fileNameUnderTest, testNamePattern }: RunSettings): Promise { + public run({ jestConfig, projectRoot, fileNameUnderTest, testNamePattern, testLocationInResults }: RunSettings): Promise { const config = JSON.stringify(jestConfig); return jest.runCLI( { @@ -18,6 +18,7 @@ export class JestLessThan25TestAdapter implements JestTestAdapter { runInBand: true, silent: true, testNamePattern, + testLocationInResults, } as any, [projectRoot] ); diff --git a/packages/jest-runner/src/jest-test-adapters/jest-test-adapter.ts b/packages/jest-runner/src/jest-test-adapters/jest-test-adapter.ts index 73970ee65f..67b3e5f29b 100644 --- a/packages/jest-runner/src/jest-test-adapters/jest-test-adapter.ts +++ b/packages/jest-runner/src/jest-test-adapters/jest-test-adapter.ts @@ -7,6 +7,7 @@ export interface RunSettings { projectRoot: string; testNamePattern?: string; fileNameUnderTest?: string; + testLocationInResults?: boolean; } export interface JestTestAdapter { diff --git a/packages/jest-runner/src/jest-test-runner.ts b/packages/jest-runner/src/jest-test-runner.ts index a713063cd4..0feb012393 100644 --- a/packages/jest-runner/src/jest-test-runner.ts +++ b/packages/jest-runner/src/jest-test-runner.ts @@ -14,6 +14,7 @@ import { TestResult, TestStatus, DryRunOptions, + BaseTestResult, } from '@stryker-mutator/api/test-runner'; import { escapeRegExp, notEmpty } from '@stryker-mutator/util'; import type * as jest from '@jest/types'; @@ -109,6 +110,7 @@ export class JestTestRunner implements TestRunner { const { dryRunResult, jestResult } = await this.run({ jestConfig: withCoverageAnalysis(this.jestConfig, coverageAnalysis), projectRoot: process.cwd(), + testLocationInResults: true, }); if (dryRunResult.status === DryRunStatus.Complete && coverageAnalysis !== 'off') { const errorMessage = verifyAllTestFilesHaveCoverage(jestResult, fileNamesWithMutantCoverage); @@ -190,37 +192,35 @@ export class JestTestRunner implements TestRunner { for (const suiteResult of suiteResults) { for (const testResult of suiteResult.testResults) { - let result: TestResult; - const timeSpentMs = testResult.duration ?? 0; + const result: BaseTestResult = { + id: testResult.fullName, + name: testResult.fullName, + timeSpentMs: testResult.duration ?? 0, + fileName: suiteResult.testFilePath, + startPosition: testResult.location ?? undefined, + }; switch (testResult.status) { case 'passed': - result = { - id: testResult.fullName, - name: testResult.fullName, + testResults.push({ status: TestStatus.Success, - timeSpentMs, - }; + ...result, + }); break; case 'failed': - result = { - id: testResult.fullName, - name: testResult.fullName, - failureMessage: testResult.failureMessages.join(', '), + testResults.push({ status: TestStatus.Failed, - timeSpentMs, - }; + failureMessage: testResult.failureMessages.join(', '), + ...result, + }); break; default: - result = { - id: testResult.fullName, - name: testResult.fullName, + testResults.push({ status: TestStatus.Skipped, - timeSpentMs, - }; + ...result, + }); break; } - testResults.push(result); } } diff --git a/packages/jest-runner/test/helpers/assertions.ts b/packages/jest-runner/test/helpers/assertions.ts new file mode 100644 index 0000000000..cdf8621496 --- /dev/null +++ b/packages/jest-runner/test/helpers/assertions.ts @@ -0,0 +1,15 @@ +import { CompleteDryRunResult, FailedTestResult, SkippedTestResult, SuccessTestResult } from '@stryker-mutator/api/test-runner'; +import { expect } from 'chai'; + +export type PartialTestResult = Partial | Partial | Partial; + +/** + * Compares test results without comparing the time it took to run them + */ +export function expectTestResults(actualResult: CompleteDryRunResult, expectedTestResults: PartialTestResult[]): void { + expect(actualResult.tests).to.have.length(expectedTestResults.length); + expectedTestResults.forEach((expectedTestResult) => { + const actualTestResult = actualResult.tests.find((test) => test.id === expectedTestResult.id); + expect(actualTestResult).deep.contains(expectedTestResult); + }); +} diff --git a/packages/jest-runner/test/helpers/producers.ts b/packages/jest-runner/test/helpers/producers.ts index 9b25f16130..a3fc39b451 100644 --- a/packages/jest-runner/test/helpers/producers.ts +++ b/packages/jest-runner/test/helpers/producers.ts @@ -118,6 +118,7 @@ export const createFailResult = (): AggregatedResult => success: false, testResults: [ createJestTestResult({ + testFilePath: 'qux.js', testResults: [ createAssertionResult({ failureMessages: ['Fail message 1', 'Fail message 2'], @@ -134,10 +135,12 @@ export const createFailResult = (): AggregatedResult => ], }), createJestTestResult({ + testFilePath: 'quux.js', testResults: [ createAssertionResult({ ancestorTitles: ['App'], duration: 23, + location: { line: 42, column: 43 }, failureMessages: [], fullName: 'App renders without crashing', numPassingAsserts: 0, @@ -198,10 +201,12 @@ export const createSuccessResult = (): AggregatedResult => success: true, testResults: [ createJestTestResult({ + testFilePath: 'foo.js', testResults: [ createAssertionResult({ fullName: 'App renders without crashing', status: 'passed', + location: { column: 4, line: 3 }, duration: 23, }), ], @@ -215,6 +220,7 @@ export const createPendingResult = (): AggregatedResult => success: true, testResults: [ createJestTestResult({ + testFilePath: 'bar.js', testResults: [ createAssertionResult({ duration: 0, @@ -232,6 +238,7 @@ export const createTodoResult = (): AggregatedResult => testResults: [ createJestTestResult({ skipped: false, + testFilePath: 'baz.js', testResults: [ createAssertionResult({ duration: 4, diff --git a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts index 72ce53d70f..1fc9e79471 100644 --- a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts +++ b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts @@ -11,6 +11,7 @@ import { JestRunnerOptionsWithStrykerOptions } from '../../src/jest-runner-optio import { JestOptions } from '../../src-generated/jest-runner-options'; import { createJestOptions } from '../helpers/producers'; import { resolveTestResource } from '../helpers/resolve-test-resource'; +import { expectTestResults } from '../helpers/assertions'; // eslint-disable-next-line @typescript-eslint/no-require-imports const paths = require('react-scripts-ts/config/paths'); @@ -92,6 +93,42 @@ describe(`${JestTestRunner.name} integration test`, () => { assertions.expectCompleted(runResult); expectToHaveSuccessfulTests(runResult, testNames.length); }); + + it('should report the test positions and file names', async () => { + process.chdir(resolveTestResource('exampleProjectWithExplicitJestConfig')); + const addSpecFileName = resolveTestResource('exampleProjectWithExplicitJestConfig', 'src', '__tests__', 'AddSpec.js'); + const circleSpecFileName = resolveTestResource('exampleProjectWithExplicitJestConfig', 'src', '__tests__', 'CircleSpec.js'); + const jestTestRunner = createSut(); + const runResult = await jestTestRunner.dryRun({ coverageAnalysis: 'perTest' }); + assertions.expectCompleted(runResult); + expectTestResults(runResult, [ + { + id: 'Add should be able to add two numbers', + fileName: addSpecFileName, + startPosition: { column: 2, line: 7 }, + }, + { + id: 'Add should be able to add one to a number', + fileName: addSpecFileName, + startPosition: { column: 2, line: 17 }, + }, + { + id: 'Add should be able negate a number', + fileName: addSpecFileName, + startPosition: { column: 2, line: 26 }, + }, + { + id: 'Add should be able to recognize a negative number', + fileName: addSpecFileName, + startPosition: { column: 2, line: 35 }, + }, + { + id: 'Circle should have a circumference of 2PI when the radius is 1', + fileName: circleSpecFileName, + startPosition: { column: 2, line: 4 }, + }, + ]); + }); }); describe('mutantRun', () => { diff --git a/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts b/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts index 3f1a0e5828..dfc892ceab 100644 --- a/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-adapters/jest-greater-than-25-adapter.spec.ts @@ -30,11 +30,11 @@ describe(JestGreaterThan25TestAdapter.name, () => { expect(runCLIStub).calledWith(sinon.match.object, [projectRoot]); }); - it('should call the runCLI method with the --findRelatedTests flag', async () => { + it('should call the runCLI method with the --findRelatedTests flag when provided', async () => { await sut.run({ jestConfig, projectRoot, fileNameUnderTest }); expect(runCLIStub).calledWith( - { + sinon.match({ $0: 'stryker', _: [fileNameUnderTest], config: JSON.stringify({ rootDir: projectRoot }), @@ -42,16 +42,16 @@ describe(JestGreaterThan25TestAdapter.name, () => { runInBand: true, silent: true, testNamePattern: undefined, - }, + }), [projectRoot] ); }); - it('should call the runCLI method with the --testNamePattern flag', async () => { + it('should call the runCLI method with the --testNamePattern flag when provided', async () => { await sut.run({ jestConfig, projectRoot, testNamePattern: 'Foo should bar' }); expect(runCLIStub).calledWith( - { + sinon.match({ $0: 'stryker', _: [], config: JSON.stringify({ rootDir: projectRoot }), @@ -59,11 +59,27 @@ describe(JestGreaterThan25TestAdapter.name, () => { runInBand: true, silent: true, testNamePattern: 'Foo should bar', - }, + }), [projectRoot] ); }); + it('should call the runCLI method with the --testLocationInResults flag when provided', async () => { + await sut.run({ jestConfig, projectRoot, testLocationInResults: true }); + + expect(runCLIStub).calledWith( + sinon.match({ + testLocationInResults: true, + }), + [projectRoot] + ); + }); + + it('should call the runCLI method without the --testLocationInResults flag when not', async () => { + await sut.run({ jestConfig, projectRoot, testLocationInResults: false }); + expect(runCLIStub).calledWith(sinon.match({ testLocationInResults: false }), [projectRoot]); + }); + it('should call the runCLI method and return the test result', async () => { const result = await sut.run({ jestConfig, projectRoot }); diff --git a/packages/jest-runner/test/unit/jest-test-runner.spec.ts b/packages/jest-runner/test/unit/jest-test-runner.spec.ts index 2f4c6f31ea..257022425a 100644 --- a/packages/jest-runner/test/unit/jest-test-runner.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-runner.spec.ts @@ -128,6 +128,8 @@ describe(JestTestRunner.name, () => { name: 'App renders without crashing', status: TestStatus.Success, timeSpentMs: 23, + startPosition: { column: 4, line: 3 }, + fileName: 'foo.js', }, ], }; @@ -147,7 +149,9 @@ describe(JestTestRunner.name, () => { id: 'App renders without crashing', name: 'App renders without crashing', status: TestStatus.Skipped, + startPosition: undefined, timeSpentMs: 0, + fileName: 'bar.js', }, ], }; @@ -167,13 +171,17 @@ describe(JestTestRunner.name, () => { id: 'App renders without crashing', name: 'App renders without crashing', status: TestStatus.Success, + startPosition: undefined, timeSpentMs: 4, + fileName: 'baz.js', }, { id: 'App renders without crashing with children', name: 'App renders without crashing with children', status: TestStatus.Skipped, + startPosition: undefined, timeSpentMs: 0, + fileName: 'baz.js', }, ], }; @@ -195,6 +203,8 @@ describe(JestTestRunner.name, () => { failureMessage: 'Fail message 1, Fail message 2', status: TestStatus.Failed, timeSpentMs: 2, + fileName: 'qux.js', + startPosition: undefined, }, { id: 'App render renders without crashing', @@ -202,12 +212,16 @@ describe(JestTestRunner.name, () => { failureMessage: 'Fail message 3, Fail message 4', status: TestStatus.Failed, timeSpentMs: 0, + fileName: 'qux.js', + startPosition: undefined, }, { id: 'App renders without crashing', name: 'App renders without crashing', status: TestStatus.Success, timeSpentMs: 23, + fileName: 'quux.js', + startPosition: { line: 42, column: 43 }, }, ], }; From 0d84d6134de8c330e7d8f6f994675657c10d4747 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 19 Feb 2021 21:10:18 +0100 Subject: [PATCH 03/25] fix(logging): log info about symlinking on debug (#2756) --- packages/core/src/sandbox/sandbox.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/sandbox/sandbox.ts b/packages/core/src/sandbox/sandbox.ts index 58b3058ecf..96ab8cd292 100644 --- a/packages/core/src/sandbox/sandbox.ts +++ b/packages/core/src/sandbox/sandbox.ts @@ -84,7 +84,7 @@ export class Sandbox implements Disposable { } private async symlinkNodeModulesIfNeeded(): Promise { - this.log.info('Start symlink node_modules'); + this.log.debug('Start symlink node_modules'); if (this.options.symlinkNodeModules && !this.options.inPlace) { // TODO: Change with this.options.basePath when we have it const basePath = process.cwd(); From 660eca316e0baade736ea7d39c9e95b930db03c0 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Mon, 22 Feb 2021 09:11:24 +0100 Subject: [PATCH 04/25] fix(reporting): report test name when a hook fails (#2757) Report the test name when a `beforeEach` or `afterEach` hook fails. --- .../src/stryker-mocha-reporter.ts | 6 +- .../test/integration/regession.it.spec.ts | 62 +++++++++++++++++++ .../issue-2720/failing-after-each.js | 10 +++ .../issue-2720/failing-before-each.js | 10 +++ 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 packages/mocha-runner/test/integration/regession.it.spec.ts create mode 100644 packages/mocha-runner/testResources/regression/issue-2720/failing-after-each.js create mode 100644 packages/mocha-runner/testResources/regression/issue-2720/failing-before-each.js diff --git a/packages/mocha-runner/src/stryker-mocha-reporter.ts b/packages/mocha-runner/src/stryker-mocha-reporter.ts index 000411c36b..1f7ef82c51 100644 --- a/packages/mocha-runner/src/stryker-mocha-reporter.ts +++ b/packages/mocha-runner/src/stryker-mocha-reporter.ts @@ -43,11 +43,11 @@ export class StrykerMochaReporter { this.timer.reset(); }); - this.runner.on('fail', (test: Mocha.Test, err: Error) => { - const title = test.fullTitle(); + this.runner.on('fail', (test: Mocha.Hook | Mocha.Test, err: Error) => { + const title = test.ctx?.currentTest?.fullTitle() ?? test.fullTitle(); const result: FailedTestResult = { id: title, - failureMessage: err.message, + failureMessage: (err.message || err.stack) ?? '', name: title, status: TestStatus.Failed, timeSpentMs: this.timer.elapsedMs(), diff --git a/packages/mocha-runner/test/integration/regession.it.spec.ts b/packages/mocha-runner/test/integration/regession.it.spec.ts new file mode 100644 index 0000000000..18316cae78 --- /dev/null +++ b/packages/mocha-runner/test/integration/regession.it.spec.ts @@ -0,0 +1,62 @@ +import { FailedTestResult, TestStatus } from '@stryker-mutator/api/test-runner'; +import { assertions, factory, testInjector } from '@stryker-mutator/test-helpers'; +import { expect } from 'chai'; + +import { createMochaTestRunnerFactory } from '../../src'; +import { MochaRunnerWithStrykerOptions } from '../../src/mocha-runner-with-stryker-options'; +import { resolveTestResource } from '../helpers/resolve-test-resource'; + +describe('regression integration tests', () => { + let options: MochaRunnerWithStrykerOptions; + + beforeEach(() => { + options = testInjector.options as MochaRunnerWithStrykerOptions; + options.mochaOptions = { 'no-config': true }; + }); + + describe('issue #2720', () => { + beforeEach(async () => { + process.chdir(resolveTestResource('regression', 'issue-2720')); + }); + + it('should have report correct failing test when "beforeEach" fails', async () => { + // Arrange + options.mochaOptions.spec = ['failing-before-each']; + const sut = testInjector.injector.injectFunction(createMochaTestRunnerFactory('__stryker2__')); + await sut.init(); + + // Act + const result = await sut.dryRun(factory.dryRunOptions({})); + + // Assert + assertions.expectCompleted(result); + const expected: Partial = { + name: 'suite should fail in beforeEach', + id: 'suite should fail in beforeEach', + status: TestStatus.Failed, + }; + expect(result.tests).lengthOf(1); + expect(result.tests[0]).deep.contains(expected); + }); + + it('should have report correct failing test when "afterEach" fails', async () => { + // Arrange + options.mochaOptions.spec = ['failing-after-each']; + const sut = testInjector.injector.injectFunction(createMochaTestRunnerFactory('__stryker2__')); + await sut.init(); + + // Act + const result = await sut.dryRun(factory.dryRunOptions({})); + + // Assert + assertions.expectCompleted(result); + const expected: Partial = { + name: 'suite2 should fail in afterEach', + id: 'suite2 should fail in afterEach', + status: TestStatus.Failed, + }; + expect(result.tests).lengthOf(2); + expect(result.tests[1]).deep.contains(expected); + }); + }); +}); diff --git a/packages/mocha-runner/testResources/regression/issue-2720/failing-after-each.js b/packages/mocha-runner/testResources/regression/issue-2720/failing-after-each.js new file mode 100644 index 0000000000..419bc74e39 --- /dev/null +++ b/packages/mocha-runner/testResources/regression/issue-2720/failing-after-each.js @@ -0,0 +1,10 @@ +describe('suite2', () => { + + afterEach(() => { + throw new Error(); + }); + + it('should fail in afterEach', () => { + // idle + }); +}); diff --git a/packages/mocha-runner/testResources/regression/issue-2720/failing-before-each.js b/packages/mocha-runner/testResources/regression/issue-2720/failing-before-each.js new file mode 100644 index 0000000000..de2818b862 --- /dev/null +++ b/packages/mocha-runner/testResources/regression/issue-2720/failing-before-each.js @@ -0,0 +1,10 @@ +describe('suite', () => { + + beforeEach(() => { + throw new Error(); + }); + + it('should fail in beforeEach', () => { + // idle + }); +}); From 18b911916bc27b8ba86f61a826be4aae6be09784 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Wed, 24 Feb 2021 21:50:09 +0100 Subject: [PATCH 05/25] WIP: new report model --- e2e/package-lock.json | 14 +- e2e/package.json | 2 +- .../karma-webpack-with-ts/package-lock.json | 14 +- e2e/test/karma-webpack-with-ts/package.json | 4 +- packages/api/package.json | 2 +- packages/api/src/core/index.ts | 7 +- packages/api/src/core/instrument.ts | 2 +- packages/api/src/core/mutant-coverage.ts | 5 +- packages/api/src/core/mutant.ts | 43 +- packages/api/src/report/index.ts | 12 - packages/api/src/report/matched-mutant.ts | 30 - packages/api/src/report/mutant-result.ts | 41 - packages/api/src/report/mutant-status.ts | 44 - packages/api/src/report/reporter.ts | 18 +- packages/api/test/unit/plugin/plugins.spec.ts | 2 +- packages/core/package.json | 4 +- .../child-proxy/child-process-proxy-worker.ts | 2 +- .../src/child-proxy/child-process-proxy.ts | 4 +- packages/core/src/input/index.ts | 2 + .../src/mutants/find-mutant-test-coverage.ts | 88 +- .../core/src/process/1-prepare-executor.ts | 2 +- .../src/process/4-mutation-test-executor.ts | 34 +- .../core/src/reporters/broadcast-reporter.ts | 8 +- .../core/src/reporters/clear-text-reporter.ts | 122 +-- .../dashboard-reporter/dashboard-reporter.ts | 8 +- .../reporters/dashboard-reporter/report.ts | 4 +- packages/core/src/reporters/dots-reporter.ts | 6 +- .../src/reporters/event-recorder-reporter.ts | 12 +- .../reporters/mutation-test-report-helper.ts | 143 +-- .../core/src/reporters/progress-keeper.ts | 11 +- packages/core/src/stryker-cli.ts | 4 +- packages/core/src/stryker.ts | 3 +- .../src/test-runner/command-test-runner.ts | 6 +- packages/core/src/utils/mutant-utils.ts | 51 -- packages/core/src/utils/object-utils.ts | 20 - packages/core/src/utils/string-utils.ts | 23 + .../reporters/html/simple-report.ts | 8 +- .../unit/process/1-prepare-executor.spec.ts | 3 +- .../reporters/clear-text-reporter.spec.ts | 145 ++- .../dashboard-reporter.spec.ts | 13 +- .../mutation-test-report-helper.spec.ts | 863 +++++++++--------- packages/instrumenter/src/mutant.ts | 2 +- .../instrumenter/test/unit/mutant.spec.ts | 3 +- .../jasmine-init-instrumented.it.spec.ts | 8 +- .../test/unit/jasmine-test-runner.spec.ts | 8 +- packages/test-helpers/package.json | 2 +- packages/test-helpers/src/factory.ts | 122 +-- 47 files changed, 850 insertions(+), 1124 deletions(-) delete mode 100644 packages/api/src/report/matched-mutant.ts delete mode 100644 packages/api/src/report/mutant-result.ts delete mode 100644 packages/api/src/report/mutant-status.ts create mode 100644 packages/core/src/input/index.ts delete mode 100644 packages/core/src/utils/mutant-utils.ts create mode 100644 packages/core/src/utils/string-utils.ts diff --git a/e2e/package-lock.json b/e2e/package-lock.json index e3ee9745af..956b7bc131 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -8842,18 +8842,18 @@ } }, "mutation-testing-metrics": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.5.2.tgz", - "integrity": "sha512-KRMBf1tRNh1snwt+5rZu4Le+dgam+GSX+39WfzJG9k55f/+isRn4hv3dhC4Vl/XdlJ29/Z0dTSe7ZFsWBTABUA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.6.0.tgz", + "integrity": "sha512-dJG8yDgBSQbTWnoqp9gTpIuszjvWw13/Eo3+w89PzGlKoqY2pxzSwyjTFVKF7GE+SH6aOoDBlsGKkzekYLz6Aw==", "dev": true, "requires": { - "mutation-testing-report-schema": "^1.5.2" + "mutation-testing-report-schema": "^1.6.0" } }, "mutation-testing-report-schema": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/mutation-testing-report-schema/-/mutation-testing-report-schema-1.5.2.tgz", - "integrity": "sha512-ad90c42vMHa0S4ZZ3e5oZOzGAWg4G8JWto9MrmDkrwInf/Dq+Q8FupCOOTqed0V9FTWqv4sl5arRlYEbedW6Ww==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mutation-testing-report-schema/-/mutation-testing-report-schema-1.6.0.tgz", + "integrity": "sha512-aQlE9Tx7X1MoW2592miQSxPk3oll2GjVCE+0bYWIoSfe9UAKp3TSULd8IDHDXhDgQ4QNSGUARhCObMz3XhNXEw==", "dev": true }, "mz": { diff --git a/e2e/package.json b/e2e/package.json index ad4bc39f9e..d9e5903a65 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -30,7 +30,7 @@ "link-parent-bin": "^2.0.0", "load-grunt-tasks": "~5.1.0", "mocha": "~8.2.0", - "mutation-testing-metrics": "~1.5.2", + "mutation-testing-metrics": "~1.6.2", "rxjs": "~6.5.3", "semver": "~6.3.0", "ts-jest": "~26.3.0", diff --git a/e2e/test/karma-webpack-with-ts/package-lock.json b/e2e/test/karma-webpack-with-ts/package-lock.json index baa6c30fb4..4648ec502c 100644 --- a/e2e/test/karma-webpack-with-ts/package-lock.json +++ b/e2e/test/karma-webpack-with-ts/package-lock.json @@ -23,17 +23,17 @@ "integrity": "sha512-GSJHHXMGLZDzTRq59IUfL9FCdAlGfqNp/dEa7k7aBaaWD+JKaCjsAk9KYm2V12ItonVaYx2dprN66Zdm1AuBTQ==" }, "mutation-testing-metrics": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.5.2.tgz", - "integrity": "sha512-KRMBf1tRNh1snwt+5rZu4Le+dgam+GSX+39WfzJG9k55f/+isRn4hv3dhC4Vl/XdlJ29/Z0dTSe7ZFsWBTABUA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.6.0.tgz", + "integrity": "sha512-dJG8yDgBSQbTWnoqp9gTpIuszjvWw13/Eo3+w89PzGlKoqY2pxzSwyjTFVKF7GE+SH6aOoDBlsGKkzekYLz6Aw==", "requires": { - "mutation-testing-report-schema": "^1.5.2" + "mutation-testing-report-schema": "^1.6.0" } }, "mutation-testing-report-schema": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/mutation-testing-report-schema/-/mutation-testing-report-schema-1.5.2.tgz", - "integrity": "sha512-ad90c42vMHa0S4ZZ3e5oZOzGAWg4G8JWto9MrmDkrwInf/Dq+Q8FupCOOTqed0V9FTWqv4sl5arRlYEbedW6Ww==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mutation-testing-report-schema/-/mutation-testing-report-schema-1.6.0.tgz", + "integrity": "sha512-aQlE9Tx7X1MoW2592miQSxPk3oll2GjVCE+0bYWIoSfe9UAKp3TSULd8IDHDXhDgQ4QNSGUARhCObMz3XhNXEw==" } } } diff --git a/e2e/test/karma-webpack-with-ts/package.json b/e2e/test/karma-webpack-with-ts/package.json index 5fbca1acb8..1f022191c6 100644 --- a/e2e/test/karma-webpack-with-ts/package.json +++ b/e2e/test/karma-webpack-with-ts/package.json @@ -8,8 +8,8 @@ }, "dependencies": { "lit-element": "~2.3.1", - "mutation-testing-metrics": "~1.5.2", - "mutation-testing-report-schema": "~1.5.2" + "mutation-testing-metrics": "~1.6.2", + "mutation-testing-report-schema": "~1.6.0" }, "devDependencies": { "@types/webpack-env": "~1.15.2" diff --git a/packages/api/package.json b/packages/api/package.json index a7ddf86ab9..35b4fdffa4 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -38,7 +38,7 @@ "node": ">=10" }, "dependencies": { - "mutation-testing-report-schema": "~1.5.2", + "mutation-testing-report-schema": "~1.6.0", "surrial": "~2.0.2", "tslib": "~2.1.0" }, diff --git a/packages/api/src/core/index.ts b/packages/api/src/core/index.ts index 4ef67d5724..cfe270ca40 100644 --- a/packages/api/src/core/index.ts +++ b/packages/api/src/core/index.ts @@ -2,10 +2,15 @@ export { File } from './file'; export { Position } from './position'; export { Location } from './location'; export { Range } from './range'; -export { Mutant } from './mutant'; +export * from './mutant'; export * from '../../src-generated/stryker-core'; export * from './report-types'; export * from './stryker-options-schema'; export * from './partial-stryker-options'; export * from './instrument'; export * from './mutant-coverage'; + +/** + * Re-export all members from "mutation-testing-report-schema" under the `schema` key + */ +export * as schema from 'mutation-testing-report-schema'; diff --git a/packages/api/src/core/instrument.ts b/packages/api/src/core/instrument.ts index 3463f72d0a..6153c5f4ec 100644 --- a/packages/api/src/core/instrument.ts +++ b/packages/api/src/core/instrument.ts @@ -12,7 +12,7 @@ export const INSTRUMENTER_CONSTANTS = Object.freeze({ } as const); export interface InstrumenterContext { - activeMutant?: number; + activeMutant?: string; currentTestId?: string; mutantCoverage?: MutantCoverage; } diff --git a/packages/api/src/core/mutant-coverage.ts b/packages/api/src/core/mutant-coverage.ts index c0a2834be8..a62a727501 100644 --- a/packages/api/src/core/mutant-coverage.ts +++ b/packages/api/src/core/mutant-coverage.ts @@ -5,4 +5,7 @@ export interface MutantCoverage { export type CoveragePerTestId = Record; -export type CoverageData = Record; +/** + * Keys are mutant ids, the numbers are the amount of times it was hit. + */ +export type CoverageData = Record; diff --git a/packages/api/src/core/mutant.ts b/packages/api/src/core/mutant.ts index 42ab40c2f4..167cb09854 100644 --- a/packages/api/src/core/mutant.ts +++ b/packages/api/src/core/mutant.ts @@ -1,36 +1,43 @@ +import * as schema from 'mutation-testing-report-schema'; + import { Range } from './range'; -import { Location } from './location'; + +export { MutantStatus } from 'mutation-testing-report-schema'; + +// We're reusing the `MutantResult` interface here to acquire uniformity. /** - * Represents a mutant + * Represents a mutant in its initial state. */ -export interface Mutant { - /** - * The id of the mutant. Unique within a run. - */ - id: number; - /** - * The name of the mutator that generated this mutant. - */ - mutatorName: string; +export interface Mutant extends Pick { /** * The file name from which this mutant originated */ fileName: string; /** * The range of this mutant (from/to within the file) + * deprecate? */ range: Range; /** - * The line number/column location of this mutant + * If the mutant was ignored during generation, the reason for ignoring it, otherwise `undefined` */ - location: Location; + ignoreReason?: string; /** - * The replacement (actual mutated code) + * Actual mutation that has been applied. */ replacement: string; - /** - * If the mutant was ignored during generation, the reason for ignoring it, otherwise `undefined` - */ - ignoreReason?: string; } + +/** + * Represents a mutant in its matched-with-the-tests state, ready to be tested. + */ +export type MutantTestCoverage = Mutant & + Pick & { + estimatedNetTime: number; + }; + +/** + * Represents a mutant in its final state, ready to be reported. + */ +export type MutantResult = Omit & schema.MutantResult; diff --git a/packages/api/src/report/index.ts b/packages/api/src/report/index.ts index 79074321bd..79b8b0ab06 100644 --- a/packages/api/src/report/index.ts +++ b/packages/api/src/report/index.ts @@ -1,14 +1,2 @@ -import * as mutationTestReportSchema from 'mutation-testing-report-schema'; - export { Reporter } from './reporter'; -export * from './mutant-result'; -export { MutantStatus } from './mutant-status'; export { SourceFile } from './source-file'; -export { MatchedMutant } from './matched-mutant'; -export { - /** - * Types exported directly from mutation-testing-schema - * @see https://github.com/stryker-mutator/mutation-testing-elements/tree/master/packages/mutation-testing-report-schema - */ - mutationTestReportSchema, -}; diff --git a/packages/api/src/report/matched-mutant.ts b/packages/api/src/report/matched-mutant.ts deleted file mode 100644 index fa2aa8925b..0000000000 --- a/packages/api/src/report/matched-mutant.ts +++ /dev/null @@ -1,30 +0,0 @@ -export interface MatchedMutant { - /** - * The ID of the mutant - */ - readonly id: string; - /** - * The Mutator name - */ - readonly mutatorName: string; - /** - * Whether or not all tests will run for this mutant - */ - readonly runAllTests: boolean; - /** - * If not all tests will run for this mutant, this array will contain the ids of the tests that will run. - */ - readonly testFilter: string[] | undefined; - /** - * The time spent on the tests that will run in initial test run - */ - readonly timeSpentScopedTests: number; - /** - * The file name that contains the mutant - */ - readonly fileName: string; - /** - * The replacement code to be inserted - */ - readonly replacement: string; -} diff --git a/packages/api/src/report/mutant-result.ts b/packages/api/src/report/mutant-result.ts deleted file mode 100644 index 9c8cbae420..0000000000 --- a/packages/api/src/report/mutant-result.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Location, Range } from '../core'; - -import { MutantStatus } from './mutant-status'; - -export interface BaseMutantResult { - id: string; - fileName: string; - mutatorName: string; - replacement: string; - originalLines: string; - mutatedLines: string; - nrOfTestsRan: number; - location: Location; - range: Range; -} - -export interface KilledMutantResult extends BaseMutantResult { - status: MutantStatus.Killed; - killedBy: string; -} - -export interface InvalidMutantResult extends BaseMutantResult { - status: MutantStatus.CompileError | MutantStatus.RuntimeError; - errorMessage: string; -} - -export interface IgnoredMutantResult extends BaseMutantResult { - status: MutantStatus.Ignored; - ignoreReason: string; -} - -export interface UndetectedMutantResult extends BaseMutantResult { - status: MutantStatus.NoCoverage | MutantStatus.Survived; - testFilter: string[] | undefined; -} - -export interface TimeoutMutantResult extends BaseMutantResult { - status: MutantStatus.TimedOut; -} - -export type MutantResult = IgnoredMutantResult | InvalidMutantResult | KilledMutantResult | TimeoutMutantResult | UndetectedMutantResult; diff --git a/packages/api/src/report/mutant-status.ts b/packages/api/src/report/mutant-status.ts deleted file mode 100644 index 61bb8527bf..0000000000 --- a/packages/api/src/report/mutant-status.ts +++ /dev/null @@ -1,44 +0,0 @@ -export enum MutantStatus { - /** - * The status of a survived mutant, because it was not covered by any test. - */ - NoCoverage, - - /** - * The status of a killed mutant. - */ - Killed, - - /** - * The status of a survived mutant. - */ - Survived, - - /** - * The status of a timed out mutant. - */ - TimedOut, - - /** - * The status of a mutant of which the tests resulted in a runtime error. - * @example - * ```javascript - * const fs = require('f' - 's'); // mutated code - * ``` - */ - RuntimeError, - - /** - * The status of a mutant which could not be compiled. - * @example - * ```typescript - * const foo = 'foo' - 'bar'; // mutated code - * ``` - */ - CompileError, - - /** - * The status of a mutant that is ignored. For example, by user configuration. - */ - Ignored, -} diff --git a/packages/api/src/report/reporter.ts b/packages/api/src/report/reporter.ts index 39db07bf5c..e998ef6b52 100644 --- a/packages/api/src/report/reporter.ts +++ b/packages/api/src/report/reporter.ts @@ -1,7 +1,5 @@ -import { MutationTestResult } from 'mutation-testing-report-schema'; +import { MutantResult, MutantTestCoverage, schema } from '../core'; -import { MatchedMutant } from './matched-mutant'; -import { MutantResult } from './mutant-result'; import { SourceFile } from './source-file'; /** @@ -12,38 +10,38 @@ export interface Reporter { * Called when a source file was loaded * @param file The immutable source file */ - onSourceFileRead?(file: SourceFile): void; + onSourceFileRead?(file: Readonly): void; /** * Called when all source files were loaded * @param files The immutable source files */ - onAllSourceFilesRead?(files: SourceFile[]): void; + onAllSourceFilesRead?(files: readonly SourceFile[]): void; /** * Called when mutants are matched with tests * @param results The immutable array of mutants */ - onAllMutantsMatchedWithTests?(results: readonly MatchedMutant[]): void; + onAllMutantsMatchedWithTests?(results: ReadonlyArray>): void; /** * Called when a mutant was tested * @param result The immutable result */ - onMutantTested?(result: MutantResult): void; + onMutantTested?(result: Readonly): void; /** * Called when all mutants were tested * @param results The immutable results */ - onAllMutantsTested?(results: MutantResult[]): void; + onAllMutantsTested?(results: ReadonlyArray>): void; /** * Called when mutation testing is done * @param report the mutation test result that is valid according to the mutation-testing-report-schema (json schema) * @see https://github.com/stryker-mutator/mutation-testing-elements/tree/master/packages/mutation-testing-report-schema#mutation-testing-elements-schema */ - onMutationTestReportReady?(report: MutationTestResult): void; + onMutationTestReportReady?(report: Readonly): void; /** * Called when stryker wants to quit @@ -51,5 +49,5 @@ export interface Reporter { * Stryker will not close until the promise is either resolved or rejected. * @return a promise which will resolve when the reporter is done reporting */ - wrapUp?(): Promise | Promise | void; + wrapUp?(): Promise | void; } diff --git a/packages/api/test/unit/plugin/plugins.spec.ts b/packages/api/test/unit/plugin/plugins.spec.ts index f856418c5a..4f20e3d0f7 100644 --- a/packages/api/test/unit/plugin/plugins.spec.ts +++ b/packages/api/test/unit/plugin/plugins.spec.ts @@ -2,7 +2,7 @@ import { expect } from 'chai'; import { tokens, commonTokens, PluginKind, declareClassPlugin, declareFactoryPlugin } from '../../../src/plugin'; import { Logger } from '../../../logging'; -import { MutantResult } from '../../../report'; +import { MutantResult } from '../../../core'; describe('plugins', () => { describe(declareClassPlugin.name, () => { diff --git a/packages/core/package.json b/packages/core/package.json index ecae2d28cd..524f29484a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -71,8 +71,8 @@ "log4js": "~6.2.1", "minimatch": "~3.0.4", "mkdirp": "~1.0.3", - "mutation-testing-elements": "~1.5.2", - "mutation-testing-metrics": "~1.5.2", + "mutation-testing-elements": "~1.6.2", + "mutation-testing-metrics": "~1.6.2", "npm-run-path": "~4.0.1", "progress": "~2.0.0", "rimraf": "~3.0.0", diff --git a/packages/core/src/child-proxy/child-process-proxy-worker.ts b/packages/core/src/child-proxy/child-process-proxy-worker.ts index 25edc49ca6..5f49e0f06e 100644 --- a/packages/core/src/child-proxy/child-process-proxy-worker.ts +++ b/packages/core/src/child-proxy/child-process-proxy-worker.ts @@ -6,7 +6,7 @@ import { getLogger, Logger } from 'log4js'; import { buildChildProcessInjector } from '../di'; import { LogConfigurator } from '../logging'; -import { deserialize, serialize } from '../utils/object-utils'; +import { deserialize, serialize } from '../utils/string-utils'; import { autoStart, CallMessage, ParentMessage, ParentMessageKind, WorkerMessage, WorkerMessageKind, InitMessage } from './message-protocol'; diff --git a/packages/core/src/child-proxy/child-process-proxy.ts b/packages/core/src/child-proxy/child-process-proxy.ts index 6eb020ca31..de95145a83 100644 --- a/packages/core/src/child-proxy/child-process-proxy.ts +++ b/packages/core/src/child-proxy/child-process-proxy.ts @@ -8,9 +8,11 @@ import { getLogger } from 'log4js'; import { Disposable, InjectableClass, InjectionToken } from 'typed-inject'; import { LoggingClientContext } from '../logging'; -import { deserialize, kill, padLeft, serialize } from '../utils/object-utils'; +import { kill } from '../utils/object-utils'; import { StringBuilder } from '../utils/string-builder'; +import { deserialize, padLeft, serialize } from '../utils/string-utils'; + import { ChildProcessCrashedError } from './child-process-crashed-error'; import { autoStart, ParentMessage, ParentMessageKind, WorkerMessage, WorkerMessageKind } from './message-protocol'; import { OutOfMemoryError } from './out-of-memory-error'; diff --git a/packages/core/src/input/index.ts b/packages/core/src/input/index.ts new file mode 100644 index 0000000000..fe45b919a7 --- /dev/null +++ b/packages/core/src/input/index.ts @@ -0,0 +1,2 @@ +export { InputFileCollection } from './input-file-collection'; +export { InputFileResolver } from './input-file-resolver'; diff --git a/packages/core/src/mutants/find-mutant-test-coverage.ts b/packages/core/src/mutants/find-mutant-test-coverage.ts index 01cfdf7c24..4b5bad7c33 100644 --- a/packages/core/src/mutants/find-mutant-test-coverage.ts +++ b/packages/core/src/mutants/find-mutant-test-coverage.ts @@ -1,21 +1,12 @@ import { CompleteDryRunResult, TestResult } from '@stryker-mutator/api/test-runner'; -import { Mutant, CoveragePerTestId } from '@stryker-mutator/api/core'; +import { Mutant, CoveragePerTestId, MutantTestCoverage } from '@stryker-mutator/api/core'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import { MatchedMutant } from '@stryker-mutator/api/report'; - import { Logger } from '@stryker-mutator/api/logging'; import { coreTokens } from '../di'; import { StrictReporter } from '../reporters/strict-reporter'; -export interface MutantTestCoverage { - estimatedNetTime: number; - coveredByTests: boolean; - testFilter?: string[]; - mutant: Mutant; -} - findMutantTestCoverage.inject = tokens(coreTokens.dryRunResult, coreTokens.mutants, coreTokens.reporter, commonTokens.logger); export function findMutantTestCoverage( dryRunResult: CompleteDryRunResult, @@ -24,64 +15,54 @@ export function findMutantTestCoverage( logger: Logger ): MutantTestCoverage[] { const mutantTestCoverage = mapToMutantTestCoverage(dryRunResult, mutants, logger); - reporter.onAllMutantsMatchedWithTests(mutantTestCoverage.map(toMatchedMutant)); + reporter.onAllMutantsMatchedWithTests(mutantTestCoverage); return mutantTestCoverage; } -function toMatchedMutant({ mutant, testFilter, coveredByTests, estimatedNetTime }: MutantTestCoverage): MatchedMutant { - return { - fileName: mutant.fileName, - id: mutant.id.toString(), - mutatorName: mutant.mutatorName, - replacement: mutant.replacement, - runAllTests: !testFilter && coveredByTests, - testFilter: testFilter, - timeSpentScopedTests: estimatedNetTime, - }; -} - -function mapToMutantTestCoverage(dryRunResult: CompleteDryRunResult, mutants: readonly Mutant[], logger: Logger) { +function mapToMutantTestCoverage(dryRunResult: CompleteDryRunResult, mutants: readonly Mutant[], logger: Logger): MutantTestCoverage[] { const testsByMutantId = findTestsByMutant(dryRunResult.mutantCoverage?.perTest, dryRunResult.tests, logger); const timeSpentAllTests = calculateTotalTime(dryRunResult.tests); - const mutantCoverage = mutants.map((mutant) => { - if (mutant.ignoreReason !== undefined) { - return { - mutant, - estimatedNetTime: 0, - coveredByTests: false, - }; - } else if (!dryRunResult.mutantCoverage || dryRunResult.mutantCoverage.static[mutant.id] > 0) { - return { - mutant, - estimatedNetTime: timeSpentAllTests, - testFilter: undefined, - coveredByTests: true, - }; - } else { - const tests = testsByMutantId.get(mutant.id); - if (tests && tests.size > 0) { + const mutantCoverage = mutants.map( + (mutant): MutantTestCoverage => { + if (mutant.ignoreReason !== undefined) { return { - mutant, - estimatedNetTime: calculateTotalTime(tests), - testFilter: toTestIds(tests), - coveredByTests: true, + ...mutant, + static: false, + estimatedNetTime: 0, }; - } else { + } else if (!dryRunResult.mutantCoverage || dryRunResult.mutantCoverage.static[mutant.id] > 0) { return { - mutant, - estimatedNetTime: 0, - testFilter: undefined, - coveredByTests: false, + ...mutant, + estimatedNetTime: timeSpentAllTests, + coveredBy: undefined, + static: true, }; + } else { + const tests = testsByMutantId.get(mutant.id); + if (tests && tests.size > 0) { + return { + ...mutant, + estimatedNetTime: calculateTotalTime(tests), + coveredBy: toTestIds(tests), + static: false, + }; + } else { + return { + ...mutant, + estimatedNetTime: 0, + coveredBy: [], + static: false, + }; + } } } - }); + ); return mutantCoverage; } function findTestsByMutant(coveragePerTest: CoveragePerTestId | undefined, allTests: TestResult[], logger: Logger) { - const testsByMutantId = new Map>(); + const testsByMutantId = new Map>(); coveragePerTest && Object.entries(coveragePerTest).forEach(([testId, mutantCoverage]) => { const foundTest = allTests.find((test) => test.id === testId); @@ -91,9 +72,8 @@ function findTestsByMutant(coveragePerTest: CoveragePerTestId | undefined, allTe ); return; } - Object.entries(mutantCoverage).forEach(([mutantIdAsString, count]) => { + Object.entries(mutantCoverage).forEach(([mutantId, count]) => { if (count) { - const mutantId = parseInt(mutantIdAsString, 10); let tests = testsByMutantId.get(mutantId); if (!tests) { tests = new Set(); diff --git a/packages/core/src/process/1-prepare-executor.ts b/packages/core/src/process/1-prepare-executor.ts index e5ff696555..83d7637136 100644 --- a/packages/core/src/process/1-prepare-executor.ts +++ b/packages/core/src/process/1-prepare-executor.ts @@ -3,7 +3,7 @@ import { commonTokens, Injector, tokens } from '@stryker-mutator/api/plugin'; import { LogConfigurator } from '../logging'; import { buildMainInjector, coreTokens, CliOptionsProvider } from '../di'; -import { InputFileResolver } from '../input/input-file-resolver'; +import { InputFileResolver } from '../input'; import { ConfigError } from '../errors'; import { MutantInstrumenterContext } from '.'; diff --git a/packages/core/src/process/4-mutation-test-executor.ts b/packages/core/src/process/4-mutation-test-executor.ts index 6b9df150c3..31d1efcb98 100644 --- a/packages/core/src/process/4-mutation-test-executor.ts +++ b/packages/core/src/process/4-mutation-test-executor.ts @@ -1,8 +1,7 @@ import { from, partition, merge, Observable } from 'rxjs'; import { toArray, map, tap, shareReplay } from 'rxjs/operators'; import { tokens, commonTokens } from '@stryker-mutator/api/plugin'; -import { StrykerOptions } from '@stryker-mutator/api/core'; -import { MutantResult } from '@stryker-mutator/api/report'; +import { MutantTestCoverage, MutantResult, StrykerOptions } from '@stryker-mutator/api/core'; import { MutantRunOptions, TestRunner } from '@stryker-mutator/api/test-runner'; import { Logger } from '@stryker-mutator/api/logging'; import { I } from '@stryker-mutator/util'; @@ -10,7 +9,6 @@ import { CheckStatus, Checker, CheckResult, PassedCheckResult } from '@stryker-m import { coreTokens } from '../di'; import { StrictReporter } from '../reporters/strict-reporter'; -import { MutantTestCoverage } from '../mutants/find-mutant-test-coverage'; import { MutationTestReportHelper } from '../reporters/mutation-test-report-helper'; import { Timer } from '../utils/timer'; import { Pool, ConcurrencyTokenProvider } from '../concurrent'; @@ -67,21 +65,24 @@ export class MutationTestExecutor { } private executeIgnore(input$: Observable) { - const [notIgnoredMutant$, ignoredMutant$] = partition(input$.pipe(shareReplay()), ({ mutant }) => mutant.ignoreReason === undefined); - const ignoredResult$ = ignoredMutant$.pipe(map(({ mutant }) => this.mutationTestReportHelper.reportMutantIgnored(mutant))); + const [notIgnoredMutant$, ignoredMutant$] = partition(input$.pipe(shareReplay()), (mutant) => mutant.ignoreReason === undefined); + const ignoredResult$ = ignoredMutant$.pipe(map((mutant) => this.mutationTestReportHelper.reportMutantIgnored(mutant))); return { ignoredResult$, notIgnoredMutant$ }; } private executeNoCoverage(input$: Observable) { - const [coveredMutant$, noCoverageMatchedMutant$] = partition(input$.pipe(shareReplay()), (matchedMutant) => matchedMutant.coveredByTests); - const noCoverageResult$ = noCoverageMatchedMutant$.pipe(map(({ mutant }) => this.mutationTestReportHelper.reportNoCoverage(mutant))); + const [coveredMutant$, noCoverageMatchedMutant$] = partition( + input$.pipe(shareReplay()), + (mutant) => !!mutant.static || mutant.coveredBy!.length > 0 + ); + const noCoverageResult$ = noCoverageMatchedMutant$.pipe(map((mutant) => this.mutationTestReportHelper.reportNoCoverage(mutant))); return { noCoverageResult$, coveredMutant$ }; } private executeCheck(input$: Observable) { const checkTask$ = this.checkerPool .schedule(input$, async (checker, mutant) => { - const checkResult = await checker.check(mutant.mutant); + const checkResult = await checker.check(mutant); return { checkResult, mutant, @@ -101,10 +102,7 @@ export class MutationTestExecutor { const [passedCheckResult$, failedCheckResult$] = partition(checkTask$, ({ checkResult }) => checkResult.status === CheckStatus.Passed); const checkResult$ = failedCheckResult$.pipe( map((failedMutant) => - this.mutationTestReportHelper.reportCheckFailed( - failedMutant.mutant.mutant, - failedMutant.checkResult as Exclude - ) + this.mutationTestReportHelper.reportCheckFailed(failedMutant.mutant, failedMutant.checkResult as Exclude) ) ); const passedMutant$ = passedCheckResult$.pipe(map(({ mutant }) => mutant)); @@ -119,13 +117,13 @@ export class MutationTestExecutor { }); } - private createMutantRunOptions(mutant: MutantTestCoverage): MutantRunOptions { - const timeout = this.options.timeoutFactor * mutant.estimatedNetTime + this.options.timeoutMS + this.timeOverheadMS; + private createMutantRunOptions(activeMutant: MutantTestCoverage): MutantRunOptions { + const timeout = this.options.timeoutFactor * activeMutant.estimatedNetTime + this.options.timeoutMS + this.timeOverheadMS; return { - activeMutant: mutant.mutant, - timeout: timeout, - testFilter: mutant.testFilter, - sandboxFileName: this.sandbox.sandboxFileFor(mutant.mutant.fileName), + activeMutant, + timeout, + testFilter: activeMutant.coveredBy, + sandboxFileName: this.sandbox.sandboxFileFor(activeMutant.fileName), }; } diff --git a/packages/core/src/reporters/broadcast-reporter.ts b/packages/core/src/reporters/broadcast-reporter.ts index 6e3ac5b3fd..99b9920ea0 100644 --- a/packages/core/src/reporters/broadcast-reporter.ts +++ b/packages/core/src/reporters/broadcast-reporter.ts @@ -1,7 +1,7 @@ -import { StrykerOptions } from '@stryker-mutator/api/core'; +import { MutantTestCoverage, MutantResult, schema, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, PluginKind } from '@stryker-mutator/api/plugin'; -import { MatchedMutant, MutantResult, mutationTestReportSchema, Reporter, SourceFile } from '@stryker-mutator/api/report'; +import { Reporter, SourceFile } from '@stryker-mutator/api/report'; import { tokens } from 'typed-inject'; import { coreTokens } from '../di'; @@ -65,7 +65,7 @@ export class BroadcastReporter implements StrictReporter { this.broadcast('onAllSourceFilesRead', files); } - public onAllMutantsMatchedWithTests(results: readonly MatchedMutant[]): void { + public onAllMutantsMatchedWithTests(results: readonly MutantTestCoverage[]): void { this.broadcast('onAllMutantsMatchedWithTests', results); } @@ -77,7 +77,7 @@ export class BroadcastReporter implements StrictReporter { this.broadcast('onAllMutantsTested', results); } - public onMutationTestReportReady(report: mutationTestReportSchema.MutationTestResult): void { + public onMutationTestReportReady(report: schema.MutationTestResult): void { this.broadcast('onMutationTestReportReady', report); } diff --git a/packages/core/src/reporters/clear-text-reporter.ts b/packages/core/src/reporters/clear-text-reporter.ts index c5890ff1b8..7010410cfa 100644 --- a/packages/core/src/reporters/clear-text-reporter.ts +++ b/packages/core/src/reporters/clear-text-reporter.ts @@ -1,15 +1,19 @@ import os from 'os'; import chalk from 'chalk'; -import { Position, StrykerOptions } from '@stryker-mutator/api/core'; +import { schema, Position, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens } from '@stryker-mutator/api/plugin'; -import { MutantResult, MutantStatus, mutationTestReportSchema, Reporter, UndetectedMutantResult } from '@stryker-mutator/api/report'; -import { calculateMetrics } from 'mutation-testing-metrics'; +import { Reporter } from '@stryker-mutator/api/report'; +import { calculateMutationTestMetrics, MetricsResult, MutantModel, TestModel, MutationTestMetricsResult } from 'mutation-testing-metrics'; import { tokens } from 'typed-inject'; +import { plural } from '../utils/string-utils'; + import { ClearTextScoreTable } from './clear-text-score-table'; +const { MutantStatus } = schema; + export class ClearTextReporter implements Reporter { public static inject = tokens(commonTokens.logger, commonTokens.options); constructor(private readonly log: Logger, private readonly options: StrykerOptions) { @@ -28,7 +32,13 @@ export class ClearTextReporter implements Reporter { } } - public onAllMutantsTested(mutantResults: MutantResult[]): void { + public onMutationTestReportReady(report: schema.MutationTestResult): void { + const metricsResult = calculateMutationTestMetrics(report); + this.reportAllMutants(metricsResult); + this.writeLine(new ClearTextScoreTable(metricsResult.systemUnderTestMetrics, this.options.thresholds).draw()); + } + + private reportAllMutants({ systemUnderTestMetrics }: MutationTestMetricsResult): void { this.writeLine(); let totalTests = 0; @@ -36,46 +46,61 @@ export class ClearTextReporter implements Reporter { const logDebugFn = (input: string) => this.log.debug(input); const writeLineFn = (input: string) => this.writeLine(input); - mutantResults.forEach((result) => { - totalTests += result.nrOfTestsRan; - switch (result.status) { - case MutantStatus.Killed: - case MutantStatus.TimedOut: - case MutantStatus.RuntimeError: - case MutantStatus.CompileError: - this.logMutantResult(result, logDebugFn); - break; - case MutantStatus.Survived: - case MutantStatus.NoCoverage: - this.logMutantResult(result, writeLineFn); - break; - default: - } - }); - this.writeLine(`Ran ${(totalTests / mutantResults.length).toFixed(2)} tests per mutant on average.`); + const reportMutants = (metrics: MetricsResult[]) => { + metrics.forEach((child) => { + const file = child.file; + file?.mutants.forEach((result) => { + totalTests += result.testsCompleted ?? 0; + switch (result.status) { + case MutantStatus.Killed: + case MutantStatus.Timeout: + case MutantStatus.RuntimeError: + case MutantStatus.CompileError: + this.reportMutantResult(result, logDebugFn); + break; + case MutantStatus.Survived: + case MutantStatus.NoCoverage: + this.reportMutantResult(result, writeLineFn); + break; + default: + } + }); + reportMutants(child.childResults); + }); + }; + reportMutants(systemUnderTestMetrics.childResults); + this.writeLine(`Ran ${(totalTests / systemUnderTestMetrics.metrics.totalMutants).toFixed(2)} tests per mutant on average.`); } - private logMutantResult(result: MutantResult, logImplementation: (input: string) => void): void { + private reportMutantResult(result: MutantModel, logImplementation: (input: string) => void): void { logImplementation(`#${result.id}. [${MutantStatus[result.status]}] ${result.mutatorName}`); logImplementation(this.colorSourceFileAndLocation(result.fileName, result.location.start)); - result.originalLines.split('\n').forEach((line) => { - logImplementation(chalk.red('- ' + line)); - }); - result.mutatedLines.split('\n').forEach((line) => { - logImplementation(chalk.green('+ ' + line)); - }); + result + .getOriginalLines() + .split('\n') + .filter(Boolean) + .forEach((line) => { + logImplementation(chalk.red('- ' + line)); + }); + result + .getMutatedLines() + .split('\n') + .filter(Boolean) + .forEach((line) => { + logImplementation(chalk.green('+ ' + line)); + }); logImplementation(''); if (result.status === MutantStatus.Survived) { - if (this.options.coverageAnalysis === 'perTest' && result.testFilter) { - this.logExecutedTests(result, logImplementation); - } else { + if (result.static) { logImplementation('Ran all tests for this mutant.'); + } else if (result.coveredByTests) { + this.logExecutedTests(result.coveredByTests, logImplementation); } } else if (result.status === MutantStatus.Killed) { logImplementation(`Killed by: ${result.killedBy}`); } else if (result.status === MutantStatus.RuntimeError || result.status === MutantStatus.CompileError) { - logImplementation(`Error message: ${result.errorMessage}`); + logImplementation(`Error message: ${result.statusReason}`); } } @@ -87,34 +112,23 @@ export class ClearTextReporter implements Reporter { return [chalk.cyan(fileName), chalk.yellow(`${position.line}`), chalk.yellow(`${position.column}`)].join(':'); } - private logExecutedTests(result: UndetectedMutantResult, logImplementation: (input: string) => void) { + private logExecutedTests(tests: TestModel[], logImplementation: (input: string) => void) { if (!this.options.clearTextReporter.logTests) { return; } - if (result.nrOfTestsRan > 0) { - const { maxTestsToLog } = this.options.clearTextReporter; + const testCount = Math.min(this.options.clearTextReporter.maxTestsToLog, tests.length); - if (maxTestsToLog > 0) { - logImplementation('Tests ran:'); - for (let i = 0; i < maxTestsToLog; i++) { - if (i > result.testFilter!.length - 1) { - break; - } - logImplementation(` ${result.testFilter![i]}`); - } - const diff = result.testFilter!.length - maxTestsToLog; - if (diff > 0) { - const plural = diff === 1 ? '' : 's'; - logImplementation(` and ${diff} more test${plural}!`); - } - logImplementation(''); + if (testCount > 0) { + logImplementation('Tests ran:'); + tests.slice(0, testCount).forEach((test) => { + logImplementation(` ${test.name}`); + }); + const diff = tests.length - this.options.clearTextReporter.maxTestsToLog; + if (diff > 0) { + logImplementation(` and ${diff} more test${plural(diff)}!`); } + logImplementation(''); } } - - public onMutationTestReportReady(report: mutationTestReportSchema.MutationTestResult): void { - const metricsResult = calculateMetrics(report.files); - this.writeLine(new ClearTextScoreTable(metricsResult, this.options.thresholds).draw()); - } } diff --git a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts index 65df2ef0b5..380987bea5 100644 --- a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts +++ b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts @@ -1,7 +1,7 @@ -import { StrykerOptions, ReportType } from '@stryker-mutator/api/core'; +import { StrykerOptions, ReportType, schema } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import { mutationTestReportSchema, Reporter } from '@stryker-mutator/api/report'; +import { Reporter } from '@stryker-mutator/api/report'; import { calculateMetrics } from 'mutation-testing-metrics'; import { CIProvider } from '../ci/provider'; @@ -27,7 +27,7 @@ export class DashboardReporter implements Reporter { private onGoingWork: Promise | undefined; - public onMutationTestReportReady(result: mutationTestReportSchema.MutationTestResult): void { + public onMutationTestReportReady(result: schema.MutationTestResult): void { this.onGoingWork = (async () => { const { projectName, version, moduleName } = this.getContextFromEnvironment(); if (projectName && version) { @@ -44,7 +44,7 @@ export class DashboardReporter implements Reporter { await this.onGoingWork; } - private toReport(result: mutationTestReportSchema.MutationTestResult): Report { + private toReport(result: schema.MutationTestResult): Report { if (this.options.dashboard.reportType === ReportType.Full) { return result; } else { diff --git a/packages/core/src/reporters/dashboard-reporter/report.ts b/packages/core/src/reporters/dashboard-reporter/report.ts index 6abf439fb3..2cb5d6fe08 100644 --- a/packages/core/src/reporters/dashboard-reporter/report.ts +++ b/packages/core/src/reporters/dashboard-reporter/report.ts @@ -1,6 +1,6 @@ -import { mutationTestReportSchema } from '@stryker-mutator/api/report'; +import { schema } from '@stryker-mutator/api/core'; export interface MutationScoreOnlyReport { mutationScore: number; } -export type Report = MutationScoreOnlyReport | mutationTestReportSchema.MutationTestResult; +export type Report = MutationScoreOnlyReport | schema.MutationTestResult; diff --git a/packages/core/src/reporters/dots-reporter.ts b/packages/core/src/reporters/dots-reporter.ts index 59783fa4c7..ae8bee8b60 100644 --- a/packages/core/src/reporters/dots-reporter.ts +++ b/packages/core/src/reporters/dots-reporter.ts @@ -1,8 +1,8 @@ import os from 'os'; -import { MutantResult, MutantStatus, Reporter } from '@stryker-mutator/api/report'; - import chalk from 'chalk'; +import { Reporter } from '@stryker-mutator/api/report'; +import { MutantResult, MutantStatus } from '@stryker-mutator/api/core'; export class DotsReporter implements Reporter { public onMutantTested(result: MutantResult): void { @@ -11,7 +11,7 @@ export class DotsReporter implements Reporter { case MutantStatus.Killed: toLog = '.'; break; - case MutantStatus.TimedOut: + case MutantStatus.Timeout: toLog = chalk.yellow('T'); break; case MutantStatus.Survived: diff --git a/packages/core/src/reporters/event-recorder-reporter.ts b/packages/core/src/reporters/event-recorder-reporter.ts index 4be8f5981b..be285ad9d3 100644 --- a/packages/core/src/reporters/event-recorder-reporter.ts +++ b/packages/core/src/reporters/event-recorder-reporter.ts @@ -1,10 +1,10 @@ import path from 'path'; import { promises as fsPromises } from 'fs'; -import { StrykerOptions } from '@stryker-mutator/api/core'; +import { MutantResult, MutantTestCoverage, schema, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import { MatchedMutant, MutantResult, mutationTestReportSchema, Reporter, SourceFile } from '@stryker-mutator/api/report'; +import { Reporter, SourceFile } from '@stryker-mutator/api/report'; import { cleanFolder } from '../utils/file-utils'; @@ -49,7 +49,7 @@ export class EventRecorderReporter implements StrictReporter { this.work('onAllSourceFilesRead', files); } - public onAllMutantsMatchedWithTests(results: readonly MatchedMutant[]): void { + public onAllMutantsMatchedWithTests(results: MutantTestCoverage[]): void { this.work('onAllMutantsMatchedWithTests', results); } @@ -57,7 +57,7 @@ export class EventRecorderReporter implements StrictReporter { this.work('onMutantTested', result); } - public onMutationTestReportReady(report: mutationTestReportSchema.MutationTestResult): void { + public onMutationTestReportReady(report: schema.MutationTestResult): void { this.work('onMutationTestReportReady', report); } @@ -65,8 +65,8 @@ export class EventRecorderReporter implements StrictReporter { this.work('onAllMutantsTested', results); } - public async wrapUp(): Promise { + public async wrapUp(): Promise { await this.createBaseFolderTask; - return Promise.all(this.allWork); + await Promise.all(this.allWork); } } diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index f66d1a068d..d93ee24e4b 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -1,20 +1,9 @@ import path from 'path'; -import { Location, Position, StrykerOptions, Mutant } from '@stryker-mutator/api/core'; +import { Location, Position, StrykerOptions, Mutant, MutantTestCoverage, MutantResult, schema, MutantStatus } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import { - MutantResult, - MutantStatus, - mutationTestReportSchema, - Reporter, - TimeoutMutantResult, - InvalidMutantResult, - BaseMutantResult, - UndetectedMutantResult, - KilledMutantResult, - IgnoredMutantResult, -} from '@stryker-mutator/api/report'; +import { Reporter } from '@stryker-mutator/api/report'; import { normalizeWhitespaces } from '@stryker-mutator/util'; import { calculateMetrics } from 'mutation-testing-metrics'; import { CompleteDryRunResult, MutantRunResult, MutantRunStatus } from '@stryker-mutator/api/test-runner'; @@ -23,8 +12,6 @@ import { CheckStatus, PassedCheckResult, CheckResult } from '@stryker-mutator/ap import { coreTokens } from '../di'; import { InputFileCollection } from '../input/input-file-collection'; import { setExitCode } from '../utils/object-utils'; -import { MutantTestCoverage } from '../mutants/find-mutant-test-coverage'; -import { mutatedLines, originalLines } from '../utils/mutant-utils'; /** * A helper class to convert and report mutants that survived or get killed @@ -44,63 +31,64 @@ export class MutationTestReportHelper { } public reportCheckFailed(mutant: Mutant, checkResult: Exclude): MutantResult { - return this.reportOne(mutant, { + return this.reportOne({ + ...mutant, status: this.checkStatusToResultStatus(checkResult.status), - errorMessage: checkResult.reason, + statusReason: checkResult.reason, }); } - public reportNoCoverage(mutant: Mutant): MutantResult { - return this.reportOne(mutant, { status: MutantStatus.NoCoverage, testFilter: [] }); + public reportNoCoverage(mutant: MutantTestCoverage): MutantResult { + return this.reportOne({ + ...mutant, + status: MutantStatus.NoCoverage, + coveredBy: [], + }); } - public reportMutantIgnored(mutant: Mutant): MutantResult { - return this.reportOne(mutant, { status: MutantStatus.Ignored, ignoreReason: mutant.ignoreReason! }); + public reportMutantIgnored(mutant: MutantTestCoverage): MutantResult { + return this.reportOne({ + ...mutant, + status: MutantStatus.Ignored, + statusReason: mutant.ignoreReason, + }); } public reportMutantRunResult(mutantWithTestCoverage: MutantTestCoverage, result: MutantRunResult): MutantResult { - const { mutant, testFilter } = mutantWithTestCoverage; switch (result.status) { case MutantRunStatus.Error: - return this.reportOne(mutant, { status: MutantStatus.RuntimeError, errorMessage: result.errorMessage }); + return this.reportOne({ + ...mutantWithTestCoverage, + status: MutantStatus.RuntimeError, + statusReason: result.errorMessage, + }); case MutantRunStatus.Killed: - return this.reportOne(mutant, { + return this.reportOne({ + ...mutantWithTestCoverage, status: MutantStatus.Killed, - nrOfTestsRan: result.nrOfTests, - killedBy: this.testNamesById.get(result.killedBy)!, + testsCompleted: result.nrOfTests, + killedBy: [this.testNamesById.get(result.killedBy)!], }); case MutantRunStatus.Timeout: - return this.reportOne(mutant, { status: MutantStatus.TimedOut }); + return this.reportOne({ + ...mutantWithTestCoverage, + status: MutantStatus.Timeout, + }); case MutantRunStatus.Survived: - return this.reportOne(mutant, { + return this.reportOne({ + ...mutantWithTestCoverage, status: MutantStatus.Survived, - nrOfTestsRan: result.nrOfTests, - testFilter: testFilter ? this.dryRunResult.tests.filter((t) => testFilter.includes(t.id)).map((t) => t.name) : undefined, + testsCompleted: result.nrOfTests, }); } } - private reportOne(mutant: Mutant, additionalFields: Omit & { nrOfTestsRan?: number }) { - const originalFileTextContent = this.inputFiles.filesToMutate.find((fileToMutate) => fileToMutate.name === mutant.fileName)!.textContent; - - const mutantResult = { - id: mutant.id.toString(), - location: mutant.location, - mutatedLines: mutatedLines(originalFileTextContent, mutant), - mutatorName: mutant.mutatorName, - originalLines: originalLines(originalFileTextContent, mutant), - range: mutant.range, - replacement: mutant.replacement, - fileName: mutant.fileName, - nrOfTestsRan: 0, - ...additionalFields, - } as MutantResult; - this.reporter.onMutantTested(mutantResult); - - return mutantResult; + private reportOne(result: MutantResult): MutantResult { + this.reporter.onMutantTested(result); + return result; } - private checkStatusToResultStatus(status: Exclude): MutantStatus.CompileError { + private checkStatusToResultStatus(status: Exclude): MutantStatus { switch (status) { case CheckStatus.CompileError: return MutantStatus.CompileError; @@ -114,7 +102,7 @@ export class MutationTestReportHelper { this.determineExitCode(report); } - private determineExitCode(report: mutationTestReportSchema.MutationTestResult) { + private determineExitCode(report: schema.MutationTestResult) { const { metrics } = calculateMetrics(report.files); const breaking = this.options.thresholds.break; const formattedScore = metrics.mutationScore.toFixed(2); @@ -133,7 +121,7 @@ export class MutationTestReportHelper { } } - private mutationTestReport(results: readonly MutantResult[]): mutationTestReportSchema.MutationTestResult { + private mutationTestReport(results: readonly MutantResult[]): schema.MutationTestResult { return { files: this.toFileResults(results), schemaVersion: '1.0', @@ -141,8 +129,8 @@ export class MutationTestReportHelper { }; } - private toFileResults(results: readonly MutantResult[]): mutationTestReportSchema.FileResultDictionary { - const resultDictionary: mutationTestReportSchema.FileResultDictionary = Object.create(null); + private toFileResults(results: readonly MutantResult[]): schema.FileResultDictionary { + const resultDictionary: schema.FileResultDictionary = Object.create(null); results.forEach((mutantResult) => { const fileResult = resultDictionary[mutantResult.fileName]; if (fileResult) { @@ -180,68 +168,27 @@ export class MutationTestReportHelper { } } - private toMutantResult(mutantResult: MutantResult): mutationTestReportSchema.MutantResult { + private toMutantResult(mutantResult: MutantResult): schema.MutantResult { return { id: mutantResult.id, location: this.toLocation(mutantResult.location), mutatorName: mutantResult.mutatorName, replacement: mutantResult.replacement, - status: this.toStatus(mutantResult.status), - description: this.describe(mutantResult), + status: mutantResult.status, }; } - private toLocation(location: Location): mutationTestReportSchema.Location { + private toLocation(location: Location): schema.Location { return { end: this.toPosition(location.end), start: this.toPosition(location.start), }; } - private toPosition(pos: Position): mutationTestReportSchema.Position { + private toPosition(pos: Position): schema.Position { return { column: pos.column + 1, // convert from 0-based to 1-based line: pos.line + 1, }; } - - private toStatus(status: MutantStatus): mutationTestReportSchema.MutantStatus { - switch (status) { - case MutantStatus.Killed: - return mutationTestReportSchema.MutantStatus.Killed; - case MutantStatus.NoCoverage: - return mutationTestReportSchema.MutantStatus.NoCoverage; - case MutantStatus.RuntimeError: - return mutationTestReportSchema.MutantStatus.RuntimeError; - case MutantStatus.Survived: - return mutationTestReportSchema.MutantStatus.Survived; - case MutantStatus.TimedOut: - return mutationTestReportSchema.MutantStatus.Timeout; - case MutantStatus.CompileError: - return mutationTestReportSchema.MutantStatus.CompileError; - case MutantStatus.Ignored: - return mutationTestReportSchema.MutantStatus.Ignored; - default: - this.logUnsupportedMutantStatus(status); - return mutationTestReportSchema.MutantStatus.RuntimeError; - } - } - - private describe(mutantResult: MutantResult): string | undefined { - switch (mutantResult.status) { - case MutantStatus.Ignored: - return `Ignore reason: ${mutantResult.ignoreReason}`; - case MutantStatus.Killed: - return `Killed by: ${mutantResult.killedBy}`; - case MutantStatus.CompileError: - case MutantStatus.RuntimeError: - return `Error message: ${mutantResult.errorMessage}`; - default: - return undefined; - } - } - - private logUnsupportedMutantStatus(status: never) { - this.log.warn('Unable to convert "%s" to a MutantStatus', status); - } } diff --git a/packages/core/src/reporters/progress-keeper.ts b/packages/core/src/reporters/progress-keeper.ts index 0065838ff7..2bae67b49b 100644 --- a/packages/core/src/reporters/progress-keeper.ts +++ b/packages/core/src/reporters/progress-keeper.ts @@ -1,4 +1,5 @@ -import { MatchedMutant, MutantResult, Reporter, MutantStatus } from '@stryker-mutator/api/report'; +import { MutantResult, MutantStatus, MutantTestCoverage } from '@stryker-mutator/api/core'; +import { Reporter } from '@stryker-mutator/api/report'; import { Timer } from '../utils/timer'; @@ -12,10 +13,10 @@ export abstract class ProgressKeeper implements Reporter { total: 0, }; - public onAllMutantsMatchedWithTests(matchedMutants: readonly MatchedMutant[]): void { + public onAllMutantsMatchedWithTests(mutants: readonly MutantTestCoverage[]): void { this.timer = new Timer(); - this.mutantIdsWithoutCoverage = matchedMutants.filter((m) => !m.runAllTests && !m.testFilter?.length).map((m) => m.id); - this.progress.total = matchedMutants.length - this.mutantIdsWithoutCoverage.length; + this.mutantIdsWithoutCoverage = mutants.filter((m) => !m.static && !m.coveredBy?.length).map((m) => m.id); + this.progress.total = mutants.length - this.mutantIdsWithoutCoverage.length; } public onMutantTested(result: MutantResult): void { @@ -25,7 +26,7 @@ export abstract class ProgressKeeper implements Reporter { if (result.status === MutantStatus.Survived) { this.progress.survived++; } - if (result.status === MutantStatus.TimedOut) { + if (result.status === MutantStatus.Timeout) { this.progress.timedOut++; } } diff --git a/packages/core/src/stryker-cli.ts b/packages/core/src/stryker-cli.ts index 109c3a332b..2435b99ca5 100644 --- a/packages/core/src/stryker-cli.ts +++ b/packages/core/src/stryker-cli.ts @@ -1,7 +1,5 @@ import commander from 'commander'; -import { DashboardOptions, ALL_REPORT_TYPES, PartialStrykerOptions } from '@stryker-mutator/api/core'; - -import { MutantResult } from '@stryker-mutator/api/report'; +import { MutantResult, DashboardOptions, ALL_REPORT_TYPES, PartialStrykerOptions } from '@stryker-mutator/api/core'; import { initializerFactory } from './initializer'; import { LogConfigurator } from './logging'; diff --git a/packages/core/src/stryker.ts b/packages/core/src/stryker.ts index 1654cc17ef..63373a5402 100644 --- a/packages/core/src/stryker.ts +++ b/packages/core/src/stryker.ts @@ -1,5 +1,4 @@ -import { PartialStrykerOptions } from '@stryker-mutator/api/core'; -import { MutantResult } from '@stryker-mutator/api/report'; +import { MutantResult, PartialStrykerOptions } from '@stryker-mutator/api/core'; import { createInjector } from 'typed-inject'; import { commonTokens } from '@stryker-mutator/api/plugin'; diff --git a/packages/core/src/test-runner/command-test-runner.ts b/packages/core/src/test-runner/command-test-runner.ts index 0563dca0aa..a3d1aea23c 100644 --- a/packages/core/src/test-runner/command-test-runner.ts +++ b/packages/core/src/test-runner/command-test-runner.ts @@ -61,14 +61,12 @@ export class CommandTestRunner implements TestRunner { return toMutantRunResult(result); } - private run({ activeMutantId }: { activeMutantId?: number }): Promise { + private run({ activeMutantId }: { activeMutantId?: string }): Promise { return new Promise((res, rej) => { const timerInstance = new Timer(); const output: Array = []; const env = - activeMutantId === undefined - ? process.env - : { ...process.env, [INSTRUMENTER_CONSTANTS.ACTIVE_MUTANT_ENV_VARIABLE]: activeMutantId.toString() }; + activeMutantId === undefined ? process.env : { ...process.env, [INSTRUMENTER_CONSTANTS.ACTIVE_MUTANT_ENV_VARIABLE]: activeMutantId }; const childProcess = exec(this.settings.command, { cwd: this.workingDir, env }); childProcess.on('error', (error) => { kill(childProcess.pid) diff --git a/packages/core/src/utils/mutant-utils.ts b/packages/core/src/utils/mutant-utils.ts deleted file mode 100644 index 188c823cf4..0000000000 --- a/packages/core/src/utils/mutant-utils.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Mutant } from '@stryker-mutator/api/core'; - -const enum CharacterCodes { - MaxAsciiCharacter = 0x7f, - LineFeed = 0x0a, // \n - CarriageReturn = 0x0d, // \r - LineSeparator = 0x2028, - ParagraphSeparator = 0x2029, -} - -export function isLineBreak(ch: number): boolean { - // ES5 7.3: - // The ECMAScript line terminator characters are listed in Table 3. - // Table 3: Line Terminator Characters - // Code Unit Value Name Formal Name - // \u000A Line Feed - // \u000D Carriage Return - // \u2028 Line separator - // \u2029 Paragraph separator - // Only the characters in Table 3 are treated as line terminators. Other new line or line - // breaking characters are treated as white space but not as line terminators. - - return ( - ch === CharacterCodes.LineFeed || - ch === CharacterCodes.CarriageReturn || - ch === CharacterCodes.LineSeparator || - ch === CharacterCodes.ParagraphSeparator - ); -} - -export function originalLines(originalText: string, mutant: Mutant): string { - const [startIndex, endIndex] = getMutationLineIndexes(originalText, mutant); - return originalText.substring(startIndex, endIndex); -} - -function getMutationLineIndexes(originalText: string, mutant: Mutant): [number, number] { - let startIndexLines = mutant.range[0]; - let endIndexLines = mutant.range[1]; - while (startIndexLines > 0 && !isLineBreak(originalText.charCodeAt(startIndexLines - 1))) { - startIndexLines--; - } - while (endIndexLines < originalText.length && !isLineBreak(originalText.charCodeAt(endIndexLines))) { - endIndexLines++; - } - return [startIndexLines, endIndexLines]; -} - -export function mutatedLines(originalText: string, mutant: Mutant): string { - const [startIndex, endIndex] = getMutationLineIndexes(originalText, mutant); - return `${originalText.substring(startIndex, mutant.range[0])}${mutant.replacement}${originalText.substring(mutant.range[1], endIndex)}`; -} diff --git a/packages/core/src/utils/object-utils.ts b/packages/core/src/utils/object-utils.ts index 14599854fa..0a080d8a80 100644 --- a/packages/core/src/utils/object-utils.ts +++ b/packages/core/src/utils/object-utils.ts @@ -2,15 +2,6 @@ import treeKill from 'tree-kill'; import { StrykerError, KnownKeys } from '@stryker-mutator/util'; import { WarningOptions } from '@stryker-mutator/api/core'; -export { serialize, deserialize } from 'surrial'; - -export function wrapInClosure(codeFragment: string): string { - return ` - (function (window) { - ${codeFragment} - })((Function('return this'))());`; -} - /** * A wrapper around `process.env` (for testability) */ @@ -49,10 +40,6 @@ export function setExitCode(n: number): void { process.exitCode = n; } -export function base64Decode(base64EncodedString: string): string { - return Buffer.from(base64EncodedString, 'base64').toString('utf8'); -} - export function kill(pid: number): Promise { return new Promise((res, rej) => { treeKill(pid, 'SIGKILL', (err?: Error & { code?: number }) => { @@ -71,13 +58,6 @@ export function kill(pid: number): Promise { }); } -export function padLeft(input: string): string { - return input - .split('\n') - .map((str) => '\t' + str) - .join('\n'); -} - /** * Creates a random integer number. * @returns A random integer. diff --git a/packages/core/src/utils/string-utils.ts b/packages/core/src/utils/string-utils.ts new file mode 100644 index 0000000000..d66149d7ce --- /dev/null +++ b/packages/core/src/utils/string-utils.ts @@ -0,0 +1,23 @@ +export { serialize, deserialize } from 'surrial'; + +export function wrapInClosure(codeFragment: string): string { + return ` + (function (window) { + ${codeFragment} + })((Function('return this'))());`; +} + +export function padLeft(input: string): string { + return input + .split('\n') + .map((str) => '\t' + str) + .join('\n'); +} + +export function plural(items: number): string { + if (items > 1) { + return 's'; + } else { + return ''; + } +} diff --git a/packages/core/test/integration/reporters/html/simple-report.ts b/packages/core/test/integration/reporters/html/simple-report.ts index 16d6703720..a8ba1bf705 100644 --- a/packages/core/test/integration/reporters/html/simple-report.ts +++ b/packages/core/test/integration/reporters/html/simple-report.ts @@ -1,6 +1,6 @@ -import { mutationTestReportSchema } from '@stryker-mutator/api/report'; +import { MutantStatus, schema } from '@stryker-mutator/api/core'; -export const simpleReport: mutationTestReportSchema.MutationTestResult = { +export const simpleReport: schema.MutationTestResult = { files: { 'test.js': { language: 'javascript', @@ -19,7 +19,7 @@ export const simpleReport: mutationTestReportSchema.MutationTestResult = { }, mutatorName: 'String Literal', replacement: '""', - status: mutationTestReportSchema.MutantStatus.Survived, + status: MutantStatus.Survived, }, { id: '1', @@ -35,7 +35,7 @@ export const simpleReport: mutationTestReportSchema.MutationTestResult = { }, mutatorName: 'Arithmetic Operator', replacement: '-', - status: mutationTestReportSchema.MutantStatus.Survived, + status: MutantStatus.Survived, }, ], source: '"use strict";\nfunction add(a, b) {\n return a + b;\n}', diff --git a/packages/core/test/unit/process/1-prepare-executor.spec.ts b/packages/core/test/unit/process/1-prepare-executor.spec.ts index f958caac25..acd1540455 100644 --- a/packages/core/test/unit/process/1-prepare-executor.spec.ts +++ b/packages/core/test/unit/process/1-prepare-executor.spec.ts @@ -11,8 +11,7 @@ import { coreTokens } from '../../../src/di'; import { LogConfigurator, LoggingClientContext } from '../../../src/logging'; import * as buildMainInjectorModule from '../../../src/di/build-main-injector'; import { Timer } from '../../../src/utils/timer'; -import { InputFileResolver } from '../../../src/input/input-file-resolver'; -import { InputFileCollection } from '../../../src/input/input-file-collection'; +import { InputFileResolver, InputFileCollection } from '../../../src/input'; import { TemporaryDirectory } from '../../../src/utils/temporary-directory'; import { ConfigError } from '../../../src/errors'; diff --git a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts index 8af7220da1..365197f857 100644 --- a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts +++ b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts @@ -1,6 +1,6 @@ import os from 'os'; -import { mutationTestReportSchema, MutantStatus } from '@stryker-mutator/api/report'; +import { MutantStatus, schema } from '@stryker-mutator/api/core'; import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import sinon from 'sinon'; @@ -33,7 +33,7 @@ describe(ClearTextReporter.name, () => { location: { start: { line: 0, column: 0 }, end: { line: 0, column: 0 } }, mutatorName: 'Block', replacement: '{}', - status: mutationTestReportSchema.MutantStatus.Killed, + status: MutantStatus.Killed, }, ], source: 'console.log("hello world!")', @@ -71,28 +71,50 @@ describe(ClearTextReporter.name, () => { }); }); - describe('onAllMutantsTested', () => { + describe(ClearTextReporter.prototype.onMutationTestReportReady.name, () => { + let report: schema.MutationTestResult; + let mutant: schema.MutantResult; + + beforeEach(() => { + mutant = factory.mutationTestReportSchemaMutantResult({ + location: { start: { line: 2, column: 1 }, end: { line: 2, column: 4 } }, + replacement: 'bar', + mutatorName: 'Math', + }); + report = factory.mutationTestReportSchemaMutationTestResult({ + files: { + 'foo.js': factory.mutationTestReportSchemaFileResult({ + source: '\nfoo\n', + mutants: [mutant], + }), + }, + testFiles: { + 'foo.spec.js': factory.mutationTestReportSchemaTestFile({ + tests: [ + factory.mutationTestReportSchemaTestDefinition({ id: '1', name: 'foo should be bar' }), + factory.mutationTestReportSchemaTestDefinition({ id: '2', name: 'bar should be baz' }), + factory.mutationTestReportSchemaTestDefinition({ id: '3', name: 'baz should be qux' }), + factory.mutationTestReportSchemaTestDefinition({ id: '4', name: 'qux should be quux' }), + factory.mutationTestReportSchemaTestDefinition({ id: '5', name: 'quux should be corge' }), + ], + }), + }, + }); + }); + it('should report a killed mutant to debug', async () => { - sut.onAllMutantsTested([ - factory.killedMutantResult({ id: '1', mutatorName: 'Math', killedBy: 'foo should be bar', originalLines: 'foo', mutatedLines: 'bar' }), - ]); + mutant.status = MutantStatus.Killed; + sut.onMutationTestReportReady(report); expect(testInjector.logger.debug).calledWithMatch(sinon.match('1. [Killed] Math')); expect(testInjector.logger.debug).calledWith(`${chalk.red('- foo')}`); expect(testInjector.logger.debug).calledWith(`${chalk.green('+ bar')}`); expect(testInjector.logger.debug).calledWith('Killed by: foo should be bar'); }); - it('should report a transpileError mutant to debug', async () => { - sut.onAllMutantsTested([ - factory.invalidMutantResult({ - id: '1', - mutatorName: 'Math', - errorMessage: 'could not call bar of undefined', - status: MutantStatus.CompileError, - originalLines: 'foo', - mutatedLines: 'bar', - }), - ]); + it('should report a CompileError mutant to debug', async () => { + mutant.status = MutantStatus.CompileError; + mutant.statusReason = 'could not call bar of undefined'; + sut.onMutationTestReportReady(report); expect(testInjector.logger.debug).calledWithMatch(sinon.match('1. [CompileError] Math')); expect(testInjector.logger.debug).calledWith(`${chalk.red('- foo')}`); expect(testInjector.logger.debug).calledWith(`${chalk.green('+ bar')}`); @@ -100,53 +122,40 @@ describe(ClearTextReporter.name, () => { }); it('should report a NoCoverage mutant to stdout', async () => { - sut.onAllMutantsTested([ - factory.undetectedMutantResult({ - id: '1', - mutatorName: 'Math', - status: MutantStatus.NoCoverage, - originalLines: 'foo', - mutatedLines: 'bar', - }), - ]); + mutant.status = MutantStatus.NoCoverage; + sut.onMutationTestReportReady(report); expect(stdoutStub).calledWithMatch(sinon.match('1. [NoCoverage] Math')); expect(stdoutStub).calledWith(`${chalk.red('- foo')}${os.EOL}`); expect(stdoutStub).calledWith(`${chalk.green('+ bar')}${os.EOL}`); }); it('should report a Survived mutant to stdout', async () => { - sut.onAllMutantsTested([factory.undetectedMutantResult({ id: '42', mutatorName: 'Math', status: MutantStatus.Survived })]); + mutant.status = MutantStatus.Survived; + sut.onMutationTestReportReady(report); expect(stdoutStub).calledWithMatch(sinon.match('42. [Survived] Math')); }); it('should report a Timeout mutant to stdout', async () => { - sut.onAllMutantsTested([factory.timeoutMutantResult({ id: '42', mutatorName: 'Math', status: MutantStatus.TimedOut })]); + mutant.status = MutantStatus.Timeout; + sut.onMutationTestReportReady(report); expect(testInjector.logger.debug).calledWithMatch(sinon.match('42. [TimedOut] Math')); }); it('should report the tests ran for a Survived mutant to stdout for "perTest" coverage analysis', async () => { - testInjector.options.coverageAnalysis = 'perTest'; - sut.onAllMutantsTested([ - factory.undetectedMutantResult({ - status: MutantStatus.Survived, - testFilter: ['foo should be bar', 'baz should be qux', 'quux should be corge'], - }), - ]); + mutant.coveredBy = ['1', '2', '3']; + mutant.status = MutantStatus.Survived; + sut.onMutationTestReportReady(report); expect(stdoutStub).calledWithExactly(`Tests ran:${os.EOL}`); expect(stdoutStub).calledWithExactly(` foo should be bar${os.EOL}`); + expect(stdoutStub).calledWithExactly(` bar should be baz${os.EOL}`); expect(stdoutStub).calledWithExactly(` baz should be qux${os.EOL}`); - expect(stdoutStub).calledWithExactly(` quux should be corge${os.EOL}`); }); it('should report the max tests to log and however many more tests', async () => { - testInjector.options.coverageAnalysis = 'perTest'; testInjector.options.clearTextReporter.maxTestsToLog = 2; - sut.onAllMutantsTested([ - factory.undetectedMutantResult({ - status: MutantStatus.Survived, - testFilter: ['foo should be bar', 'baz should be qux', 'quux should be corge'], - }), - ]); + mutant.coveredBy = ['1', '2', '3']; + mutant.status = MutantStatus.Survived; + sut.onMutationTestReportReady(report); expect(stdoutStub).calledWithExactly(`Tests ran:${os.EOL}`); expect(stdoutStub).calledWithExactly(` foo should be bar${os.EOL}`); expect(stdoutStub).calledWithExactly(` baz should be qux${os.EOL}`); @@ -154,62 +163,52 @@ describe(ClearTextReporter.name, () => { expect(stdoutStub).calledWithExactly(` and 1 more test!${os.EOL}`); }); - it('should report that all tests have ran for a mutant when coverage analysis when testFilter is not defined', async () => { - testInjector.options.coverageAnalysis = 'perTest'; + it('should report that all tests have ran for a surviving mutant that is static', async () => { testInjector.options.clearTextReporter.maxTestsToLog = 2; - sut.onAllMutantsTested([ - factory.undetectedMutantResult({ - status: MutantStatus.Survived, - testFilter: undefined, - }), - ]); + mutant.static = true; + mutant.status = MutantStatus.Survived; + sut.onMutationTestReportReady(report); expect(stdoutStub).calledWithExactly(`Ran all tests for this mutant.${os.EOL}`); }); it('should not log individual ran tests when logTests is not true', () => { - testInjector.options.coverageAnalysis = 'perTest'; testInjector.options.clearTextReporter.logTests = false; - sut.onAllMutantsTested([factory.undetectedMutantResult({ status: MutantStatus.Survived, testFilter: ['foo should be bar'] })]); + mutant.coveredBy = ['1', '2', '3']; + mutant.status = MutantStatus.Survived; + sut.onMutationTestReportReady(report); expect(process.stdout.write).not.calledWithMatch(sinon.match('Tests ran: ')); expect(process.stdout.write).not.calledWithMatch(sinon.match('foo should be bar')); expect(process.stdout.write).not.calledWithMatch(sinon.match('Ran all tests for this mutant.')); }); - it('should report that all tests have ran for a mutant when coverage analysis = "all"', async () => { - testInjector.options.coverageAnalysis = 'all'; - sut.onAllMutantsTested([factory.undetectedMutantResult({ status: MutantStatus.Survived, testFilter: [] })]); - expect(stdoutStub).calledWithExactly(`Ran all tests for this mutant.${os.EOL}`); - }); - it('should correctly report tests run per mutant on avg', () => { - sut.onAllMutantsTested([ - factory.undetectedMutantResult({ nrOfTestsRan: 4 }), - factory.killedMutantResult({ nrOfTestsRan: 5 }), - factory.undetectedMutantResult({ nrOfTestsRan: 1 }), - ]); + mutant.testsCompleted = 4; + report.files['foo.js'].mutants.push(factory.mutationTestReportSchemaMutantResult({ testsCompleted: 5 })); + report.files['foo.js'].mutants.push(factory.mutationTestReportSchemaMutantResult({ testsCompleted: 1 })); + sut.onMutationTestReportReady(report); + expect(stdoutStub).calledWithExactly(`Ran 3.33 tests per mutant on average.${os.EOL}`); }); it('should log source file location', () => { - testInjector.options.coverageAnalysis = 'perTest'; - - sut.onAllMutantsTested([factory.undetectedMutantResult({ fileName: 'foo.js', location: factory.location({ start: { line: 4, column: 6 } }) })]); + mutant.status = MutantStatus.Survived; + mutant.location.start = { line: 4, column: 6 }; + sut.onMutationTestReportReady(report); expect(stdoutStub).to.have.been.calledWithMatch(sinon.match(`${chalk.cyan('foo.js')}:${chalk.yellow('4')}:${chalk.yellow('6')}`)); }); it('should log source file names without colored text when clearTextReporter is not false and allowConsoleColors is false', () => { - testInjector.options.coverageAnalysis = 'perTest'; testInjector.options.allowConsoleColors = false; + mutant.status = MutantStatus.Survived; + mutant.location.start = { line: 4, column: 6 }; + sut.onMutationTestReportReady(report); // Recreate, color setting is set in constructor sut = testInjector.injector.injectClass(ClearTextReporter); + sut.onMutationTestReportReady(report); - sut.onAllMutantsTested([ - factory.killedMutantResult({ fileName: 'sourceFile.ts', location: factory.location({ start: { line: 1, column: 2 } }) }), - ]); - - expect(testInjector.logger.debug).calledWithMatch(sinon.match('sourceFile.ts:1:2')); + expect(testInjector.logger.debug).calledWithMatch(sinon.match('foo.js:4:6')); }); }); }); diff --git a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts index fba48cb037..cae64536ac 100644 --- a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts +++ b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts @@ -1,8 +1,7 @@ -import { mutationTestReportSchema } from '@stryker-mutator/api/report'; import { testInjector, factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import sinon from 'sinon'; -import { ReportType } from '@stryker-mutator/api/core'; +import { MutantStatus, ReportType, schema } from '@stryker-mutator/api/core'; import { CIProvider } from '../../../../src/reporters/ci/provider'; import { DashboardReporter } from '../../../../src/reporters/dashboard-reporter/dashboard-reporter'; @@ -78,10 +77,10 @@ describe(DashboardReporter.name, () => { files: { 'a.js': factory.mutationTestReportSchemaFileResult({ mutants: [ - factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), - factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), - factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Killed }), - factory.mutationTestReportSchemaMutantResult({ status: mutationTestReportSchema.MutantStatus.Survived }), + factory.mutationTestReportSchemaMutantResult({ status: MutantStatus.Killed }), + factory.mutationTestReportSchemaMutantResult({ status: MutantStatus.Killed }), + factory.mutationTestReportSchemaMutantResult({ status: MutantStatus.Killed }), + factory.mutationTestReportSchemaMutantResult({ status: MutantStatus.Survived }), ], }), }, @@ -118,7 +117,7 @@ describe(DashboardReporter.name, () => { ); }); - async function act(result: mutationTestReportSchema.MutationTestResult) { + async function act(result: schema.MutationTestResult) { const sut = createSut(); sut.onMutationTestReportReady(result); await sut.wrapUp(); diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index 6069568ec9..c8fdb3e4e6 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -1,437 +1,426 @@ -import sinon from 'sinon'; -import { File, Location, Range } from '@stryker-mutator/api/core'; -import { - MutantResult, - MutantStatus, - mutationTestReportSchema, - Reporter, - InvalidMutantResult, - UndetectedMutantResult, - KilledMutantResult, - TimeoutMutantResult, - IgnoredMutantResult, -} from '@stryker-mutator/api/report'; -import { factory, testInjector } from '@stryker-mutator/test-helpers'; -import { expect } from 'chai'; -import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; -import { CheckStatus } from '@stryker-mutator/api/check'; - -import { coreTokens } from '../../../src/di'; -import { InputFileCollection } from '../../../src/input/input-file-collection'; -import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; -import * as objectUtils from '../../../src/utils/object-utils'; -import { createMutantTestCoverage } from '../../helpers/producers'; - -describe(MutationTestReportHelper.name, () => { - let reporterMock: sinon.SinonStubbedInstance>; - let inputFiles: InputFileCollection; - let files: File[]; - let setExitCodeStub: sinon.SinonStub; - let dryRunResult: CompleteDryRunResult; - - beforeEach(() => { - reporterMock = factory.reporter(); - setExitCodeStub = sinon.stub(objectUtils, 'setExitCode'); - files = []; - inputFiles = { - files, - filesToMutate: [], - // eslint-disable-next-line @typescript-eslint/no-empty-function - logFiles: () => {}, - }; - dryRunResult = factory.completeDryRunResult(); - }); - - function createSut() { - return testInjector.injector - .provideValue(coreTokens.reporter, reporterMock) - .provideValue(coreTokens.inputFiles, inputFiles) - .provideValue(coreTokens.dryRunResult, dryRunResult) - .injectClass(MutationTestReportHelper); - } - - describe(MutationTestReportHelper.prototype.reportAll.name, () => { - let sut: MutationTestReportHelper; - - beforeEach(() => { - sut = createSut(); - }); - - it('should report "mutationTestReportReady"', () => { - sut.reportAll([]); - expect(reporterMock.onMutationTestReportReady).calledOnce; - }); - - it('should report "onAllMutantsTested"', () => { - sut.reportAll([]); - expect(reporterMock.onAllMutantsTested).calledOnce; - }); - - it('should report "onAllMutantsTested" before mutationTestReportReady', () => { - sut.reportAll([]); - expect(reporterMock.onAllMutantsTested).calledBefore(reporterMock.onMutationTestReportReady); - }); - - it('should copy thresholds', () => { - const actualReport = actReportAll(); - expect(actualReport.thresholds).eq(testInjector.options.thresholds); - }); - - it('should set correct schema version', () => { - const actualReport = actReportAll(); - expect(actualReport.schemaVersion).eq('1.0'); - }); - - it('should correctly map file properties', () => { - // Arrange - files.push(new File('foo.js', 'foo content')); - files.push(new File('bar.html', 'bar content')); - files.push(new File('baz.vue', 'baz content')); - files.push(new File('qux.ts', 'qux content')); - files.push(new File('corge.tsx', 'corge content')); - const inputMutants = files.map((file) => factory.killedMutantResult({ fileName: file.name })); - - // Act - const actualReport = actReportAll(inputMutants); - - // Assert - expect(Object.keys(actualReport.files)).lengthOf(5); - expect(actualReport.files['foo.js']).include({ language: 'javascript', source: 'foo content' }); - expect(actualReport.files['bar.html']).include({ language: 'html', source: 'bar content' }); - expect(actualReport.files['baz.vue']).include({ language: 'html', source: 'baz content' }); - expect(actualReport.files['qux.ts']).include({ language: 'typescript', source: 'qux content' }); - expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); - }); - - it('should correctly map basic MutantResult properties', () => { - // Arrange - const inputMutants = [ - factory.killedMutantResult({ - id: '1', - mutatorName: 'Foo', - replacement: 'foo replacement', - fileName: 'foo.js', - status: MutantStatus.Killed, - }), - factory.undetectedMutantResult({ - fileName: 'bar.js', - status: MutantStatus.NoCoverage, - }), - factory.invalidMutantResult({ - fileName: 'baz.js', - status: MutantStatus.RuntimeError, - }), - factory.undetectedMutantResult({ - fileName: 'qux.js', - status: MutantStatus.Survived, - }), - factory.timeoutMutantResult({ - fileName: '5.js', - status: MutantStatus.TimedOut, - }), - factory.invalidMutantResult({ - fileName: '6.js', - status: MutantStatus.CompileError, - }), - ]; - files.push(...inputMutants.map((m) => new File(m.fileName, ''))); - - // Act - const actualReport = actReportAll(inputMutants); - - // Assert - expect(Object.keys(actualReport.files)).lengthOf(6); - expect(actualReport.files['foo.js'].mutants[0]).include({ - id: '1', - mutatorName: 'Foo', - replacement: 'foo replacement', - status: mutationTestReportSchema.MutantStatus.Killed, - }); - expect(actualReport.files['bar.js'].mutants[0]).include({ status: mutationTestReportSchema.MutantStatus.NoCoverage }); - expect(actualReport.files['baz.js'].mutants[0]).include({ status: mutationTestReportSchema.MutantStatus.RuntimeError }); - expect(actualReport.files['qux.js'].mutants[0]).include({ status: mutationTestReportSchema.MutantStatus.Survived }); - expect(actualReport.files['5.js'].mutants[0]).include({ status: mutationTestReportSchema.MutantStatus.Timeout }); - expect(actualReport.files['6.js'].mutants[0]).include({ status: mutationTestReportSchema.MutantStatus.CompileError }); - }); - - it('should offset location correctly', () => { - const inputMutants = [factory.killedMutantResult({ location: { end: { line: 3, column: 4 }, start: { line: 1, column: 2 } } })]; - files.push(...inputMutants.map((m) => new File(m.fileName, ''))); - const actualReport = actReportAll(inputMutants); - expect(actualReport.files['file.js'].mutants[0].location).deep.eq({ end: { line: 4, column: 5 }, start: { line: 2, column: 3 } }); - }); - - it('should group mutants by file name', () => { - // Arrange - const inputMutants = [ - factory.killedMutantResult({ - mutatorName: 'Foo', - fileName: 'foo.js', - }), - factory.undetectedMutantResult({ - mutatorName: 'Bar', - fileName: 'foo.js', - }), - ]; - files.push(new File('foo.js', '')); - - // Act - const actualReport = actReportAll(inputMutants); - - // Assert - expect(Object.keys(actualReport.files)).lengthOf(1); - expect(actualReport.files['foo.js'].mutants).lengthOf(2); - }); - - it('should log a warning if source file could not be found', () => { - const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; - const actualReport = actReportAll(inputMutants); - expect(Object.keys(actualReport.files)).lengthOf(0); - expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); - }); - - describe('determineExitCode', () => { - beforeEach(() => { - files.push(new File('file.js', '')); - }); - - it('should not set exit code = 1 if `threshold.break` is not configured', () => { - actReportAll([factory.undetectedMutantResult({ status: MutantStatus.Survived })]); - - expect(setExitCodeStub).not.called; - expect(testInjector.logger.debug).calledWith( - "No breaking threshold configured. Won't fail the build no matter how low your mutation score is. Set `thresholds.break` to change this behavior." - ); - }); - - it('should not set exit code = 1 if `threshold.break` === score', () => { - testInjector.options.thresholds.break = 50; - actReportAll([ - factory.undetectedMutantResult({ status: MutantStatus.Survived }), - factory.killedMutantResult({ status: MutantStatus.Killed }), - ]); // 50 % - expect(setExitCodeStub).not.called; - expect(testInjector.logger.info).calledWith('Final mutation score of 50.00 is greater than or equal to break threshold 50'); - }); - - it('should set exit code = 1 if `threshold.break` > score', () => { - testInjector.options.thresholds.break = 50.01; - actReportAll([ - factory.undetectedMutantResult({ status: MutantStatus.Survived }), - factory.killedMutantResult({ status: MutantStatus.Killed }), - ]); // 50 % - expect(setExitCodeStub).calledWith(1); - expect(testInjector.logger.error).calledWith('Final mutation score 50.00 under breaking threshold 50.01, setting exit code to 1 (failure).'); - expect(testInjector.logger.info).calledWith('(improve mutation score or set `thresholds.break = null` to prevent this error in the future)'); - }); - }); - - describe('determine description', () => { - beforeEach(() => { - files.push(new File('file.js', '')); - }); - - it('should provide the error message as description', () => { - const mutantResult = factory.invalidMutantResult({ fileName: 'file.js', errorMessage: 'Cannot call "foo" of undefined' }); - const actualReport = actReportAll([mutantResult]); - expect(actualReport.files['file.js'].mutants[0].description).eq('Error message: Cannot call "foo" of undefined'); - }); - - it('should provide the "killedBy" as description', () => { - const mutantResult = factory.killedMutantResult({ fileName: 'file.js', killedBy: 'Foo should be bar' }); - const actualReport = actReportAll([mutantResult]); - expect(actualReport.files['file.js'].mutants[0].description).eq('Killed by: Foo should be bar'); - }); - - it('should provide the ignore reason as description', () => { - const mutantResult = factory.ignoredMutantResult({ fileName: 'file.js', ignoreReason: 'Ignored by "fooMutator" in excludedMutations' }); - const actualReport = actReportAll([mutantResult]); - expect(actualReport.files['file.js'].mutants[0].description).eq('Ignore reason: Ignored by "fooMutator" in excludedMutations'); - }); - }); - - function actReportAll(input: MutantResult[] = []): mutationTestReportSchema.MutationTestResult { - sut.reportAll(input); - return reporterMock.onMutationTestReportReady.firstCall.args[0]; - } - }); - - describe('reportOne', () => { - beforeEach(() => { - inputFiles = new InputFileCollection([new File('add.js', 'function add(a, b) {\n return a + b;\n}\n')], ['add.js']); - }); - - it('should map simple attributes to the mutant result', () => { - // Arrange - const sut = createSut(); - const location: Location = Object.freeze({ start: Object.freeze({ line: 1, column: 5 }), end: Object.freeze({ line: 3, column: 1 }) }); - const range: Range = [21, 35]; - - // Act - const actual = sut.reportCheckFailed( - factory.mutant({ - id: 32, - fileName: 'add.js', - location, - replacement: '{}', - mutatorName: 'fooMutator', - range, - }), - factory.failedCheckResult() - ); - - // Assert - const expected: Partial = { - id: '32', - location, - mutatorName: 'fooMutator', - range, - fileName: 'add.js', - replacement: '{}', - }; - expect(actual).include(expected); - }); - - it('should report failed message on reportCheckFailed', () => { - // Arrange - const sut = createSut(); - - // Act - const actual = sut.reportCheckFailed( - factory.mutant({ fileName: 'add.js' }), - factory.failedCheckResult({ status: CheckStatus.CompileError, reason: 'cannot call foo of undefined' }) - ); - - // Assert - const expected: Partial = { - status: MutantStatus.CompileError, - errorMessage: 'cannot call foo of undefined', - }; - expect(actual).include(expected); - }); - - it('should report an empty test filter on reportNoCoverage', () => { - // Arrange - const sut = createSut(); - - // Act - const actual = sut.reportNoCoverage(factory.mutant({ fileName: 'add.js' })); - - // Assert - const expected: Partial = { - status: MutantStatus.NoCoverage, - testFilter: [], - }; - expect(actual).deep.include(expected); - }); - - it('should report a killed mutant on reportMutantRunResult with a KilledMutantRunResult', () => { - // Arrange - dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); - const sut = createSut(); - - // Act - const actual = sut.reportMutantRunResult( - createMutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), - factory.killedMutantRunResult({ killedBy: '1', nrOfTests: 42 }) - ); - - // Assert - const expected: Partial = { - status: MutantStatus.Killed, - killedBy: 'foo should be bar', - nrOfTestsRan: 42, - }; - expect(actual).deep.include(expected); - }); - - it('should report a runtime error mutant on reportMutantRunResult with a ErrorMutantRunResult', () => { - // Arrange - const sut = createSut(); - - // Act - const actual = sut.reportMutantRunResult( - createMutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), - factory.errorMutantRunResult({ errorMessage: 'Cannot call foo of null' }) - ); - - // Assert - const expected: Partial = { - status: MutantStatus.RuntimeError, - errorMessage: 'Cannot call foo of null', - }; - expect(actual).deep.include(expected); - }); - - it('should report a timeout mutant on reportMutantRunResult with a TimeoutMutantRunResult', () => { - // Arrange - const sut = createSut(); - - // Act - const actual = sut.reportMutantRunResult( - createMutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), - factory.timeoutMutantRunResult() - ); - - // Assert - const expected: Partial = { - status: MutantStatus.TimedOut, - }; - expect(actual).deep.include(expected); - }); - - it('should report an ignored mutant on reportMutantRunResult with a IgnoredMutantResult', () => { - // Arrange - const sut = createSut(); - - // Act - const actual = sut.reportMutantIgnored(factory.mutant({ fileName: 'add.js', ignoreReason: 'foo is ignored' })); - - // Assert - const expected: Partial = { - status: MutantStatus.Ignored, - ignoreReason: 'foo is ignored', - }; - expect(actual).deep.include(expected); - }); - - it('should report a survived mutant on reportMutantRunResult with a SurvivedMutantRunResult', () => { - // Arrange - dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); - const sut = createSut(); - - // Act - const actual = sut.reportMutantRunResult( - createMutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }), testFilter: ['1'] }), - factory.survivedMutantRunResult({ nrOfTests: 4 }) - ); - - // Assert - const expected: Partial = { - status: MutantStatus.Survived, - testFilter: ['foo should be bar'], - nrOfTestsRan: 4, - }; - expect(actual).deep.include(expected); - }); - - it('should be able to report testFilter as `undefined` for a survived mutant', () => { - // Arrange - dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); - const sut = createSut(); - - // Act - const actual = sut.reportMutantRunResult( - createMutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }), testFilter: undefined }), - factory.survivedMutantRunResult() - ); - - // Assert - const expected: Partial = { - status: MutantStatus.Survived, - testFilter: undefined, - }; - expect(actual).deep.include(expected); - }); - }); -}); +// import sinon from 'sinon'; +// import { File, Location, Range } from '@stryker-mutator/api/core'; +// import { Reporter } from '@stryker-mutator/api/report'; +// import { factory, testInjector } from '@stryker-mutator/test-helpers'; +// import { expect } from 'chai'; +// import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; +// import { CheckStatus } from '@stryker-mutator/api/check'; + +// import { coreTokens } from '../../../src/di'; +// import { InputFileCollection } from '../../../src/input/input-file-collection'; +// import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; +// import * as objectUtils from '../../../src/utils/object-utils'; + +// describe(MutationTestReportHelper.name, () => { +// let reporterMock: sinon.SinonStubbedInstance>; +// let inputFiles: InputFileCollection; +// let files: File[]; +// let setExitCodeStub: sinon.SinonStub; +// let dryRunResult: CompleteDryRunResult; + +// beforeEach(() => { +// reporterMock = factory.reporter(); +// setExitCodeStub = sinon.stub(objectUtils, 'setExitCode'); +// files = []; +// inputFiles = { +// files, +// filesToMutate: [], +// // eslint-disable-next-line @typescript-eslint/no-empty-function +// logFiles: () => {}, +// }; +// dryRunResult = factory.completeDryRunResult(); +// }); + +// function createSut() { +// return testInjector.injector +// .provideValue(coreTokens.reporter, reporterMock) +// .provideValue(coreTokens.inputFiles, inputFiles) +// .provideValue(coreTokens.dryRunResult, dryRunResult) +// .injectClass(MutationTestReportHelper); +// } + +// describe(MutationTestReportHelper.prototype.reportAll.name, () => { +// let sut: MutationTestReportHelper; + +// beforeEach(() => { +// sut = createSut(); +// }); + +// it('should report "mutationTestReportReady"', () => { +// sut.reportAll([]); +// expect(reporterMock.onMutationTestReportReady).calledOnce; +// }); + +// it('should report "onAllMutantsTested"', () => { +// sut.reportAll([]); +// expect(reporterMock.onAllMutantsTested).calledOnce; +// }); + +// it('should report "onAllMutantsTested" before mutationTestReportReady', () => { +// sut.reportAll([]); +// expect(reporterMock.onAllMutantsTested).calledBefore(reporterMock.onMutationTestReportReady); +// }); + +// it('should copy thresholds', () => { +// const actualReport = actReportAll(); +// expect(actualReport.thresholds).eq(testInjector.options.thresholds); +// }); + +// it('should set correct schema version', () => { +// const actualReport = actReportAll(); +// expect(actualReport.schemaVersion).eq('1.0'); +// }); + +// it('should correctly map file properties', () => { +// // Arrange +// files.push(new File('foo.js', 'foo content')); +// files.push(new File('bar.html', 'bar content')); +// files.push(new File('baz.vue', 'baz content')); +// files.push(new File('qux.ts', 'qux content')); +// files.push(new File('corge.tsx', 'corge content')); +// const inputMutants = files.map((file) => factory.killedMutantResult({ fileName: file.name })); + +// // Act +// const actualReport = actReportAll(inputMutants); + +// // Assert +// expect(Object.keys(actualReport.files)).lengthOf(5); +// expect(actualReport.files['foo.js']).include({ language: 'javascript', source: 'foo content' }); +// expect(actualReport.files['bar.html']).include({ language: 'html', source: 'bar content' }); +// expect(actualReport.files['baz.vue']).include({ language: 'html', source: 'baz content' }); +// expect(actualReport.files['qux.ts']).include({ language: 'typescript', source: 'qux content' }); +// expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); +// }); + +// it('should correctly map basic MutantResult properties', () => { +// // Arrange +// const inputMutants = [ +// factory.killedMutantResult({ +// id: '1', +// mutatorName: 'Foo', +// replacement: 'foo replacement', +// fileName: 'foo.js', +// status: MutantStatus.Killed, +// }), +// factory.undetectedMutantResult({ +// fileName: 'bar.js', +// status: MutantStatus.NoCoverage, +// }), +// factory.invalidMutantResult({ +// fileName: 'baz.js', +// status: MutantStatus.RuntimeError, +// }), +// factory.undetectedMutantResult({ +// fileName: 'qux.js', +// status: MutantStatus.Survived, +// }), +// factory.timeoutMutantResult({ +// fileName: '5.js', +// status: MutantStatus.TimedOut, +// }), +// factory.invalidMutantResult({ +// fileName: '6.js', +// status: MutantStatus.CompileError, +// }), +// ]; +// files.push(...inputMutants.map((m) => new File(m.fileName, ''))); + +// // Act +// const actualReport = actReportAll(inputMutants); + +// // Assert +// expect(Object.keys(actualReport.files)).lengthOf(6); +// expect(actualReport.files['foo.js'].mutants[0]).include({ +// id: '1', +// mutatorName: 'Foo', +// replacement: 'foo replacement', +// status: mutationTestReportMutantStatus.Killed, +// }); +// expect(actualReport.files['bar.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.NoCoverage }); +// expect(actualReport.files['baz.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.RuntimeError }); +// expect(actualReport.files['qux.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.Survived }); +// expect(actualReport.files['5.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.Timeout }); +// expect(actualReport.files['6.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.CompileError }); +// }); + +// it('should offset location correctly', () => { +// const inputMutants = [factory.killedMutantResult({ location: { end: { line: 3, column: 4 }, start: { line: 1, column: 2 } } })]; +// files.push(...inputMutants.map((m) => new File(m.fileName, ''))); +// const actualReport = actReportAll(inputMutants); +// expect(actualReport.files['file.js'].mutants[0].location).deep.eq({ end: { line: 4, column: 5 }, start: { line: 2, column: 3 } }); +// }); + +// it('should group mutants by file name', () => { +// // Arrange +// const inputMutants = [ +// factory.killedMutantResult({ +// mutatorName: 'Foo', +// fileName: 'foo.js', +// }), +// factory.undetectedMutantResult({ +// mutatorName: 'Bar', +// fileName: 'foo.js', +// }), +// ]; +// files.push(new File('foo.js', '')); + +// // Act +// const actualReport = actReportAll(inputMutants); + +// // Assert +// expect(Object.keys(actualReport.files)).lengthOf(1); +// expect(actualReport.files['foo.js'].mutants).lengthOf(2); +// }); + +// it('should log a warning if source file could not be found', () => { +// const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; +// const actualReport = actReportAll(inputMutants); +// expect(Object.keys(actualReport.files)).lengthOf(0); +// expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); +// }); + +// describe('determineExitCode', () => { +// beforeEach(() => { +// files.push(new File('file.js', '')); +// }); + +// it('should not set exit code = 1 if `threshold.break` is not configured', () => { +// actReportAll([factory.undetectedMutantResult({ status: MutantStatus.Survived })]); + +// expect(setExitCodeStub).not.called; +// expect(testInjector.logger.debug).calledWith( +// "No breaking threshold configured. Won't fail the build no matter how low your mutation score is. Set `thresholds.break` to change this behavior." +// ); +// }); + +// it('should not set exit code = 1 if `threshold.break` === score', () => { +// testInjector.options.thresholds.break = 50; +// actReportAll([ +// factory.undetectedMutantResult({ status: MutantStatus.Survived }), +// factory.killedMutantResult({ status: MutantStatus.Killed }), +// ]); // 50 % +// expect(setExitCodeStub).not.called; +// expect(testInjector.logger.info).calledWith('Final mutation score of 50.00 is greater than or equal to break threshold 50'); +// }); + +// it('should set exit code = 1 if `threshold.break` > score', () => { +// testInjector.options.thresholds.break = 50.01; +// actReportAll([ +// factory.undetectedMutantResult({ status: MutantStatus.Survived }), +// factory.killedMutantResult({ status: MutantStatus.Killed }), +// ]); // 50 % +// expect(setExitCodeStub).calledWith(1); +// expect(testInjector.logger.error).calledWith('Final mutation score 50.00 under breaking threshold 50.01, setting exit code to 1 (failure).'); +// expect(testInjector.logger.info).calledWith('(improve mutation score or set `thresholds.break = null` to prevent this error in the future)'); +// }); +// }); + +// describe('determine description', () => { +// beforeEach(() => { +// files.push(new File('file.js', '')); +// }); + +// it('should provide the error message as description', () => { +// const mutantResult = factory.invalidMutantResult({ fileName: 'file.js', errorMessage: 'Cannot call "foo" of undefined' }); +// const actualReport = actReportAll([mutantResult]); +// expect(actualReport.files['file.js'].mutants[0].description).eq('Error message: Cannot call "foo" of undefined'); +// }); + +// it('should provide the "killedBy" as description', () => { +// const mutantResult = factory.killedMutantResult({ fileName: 'file.js', killedBy: 'Foo should be bar' }); +// const actualReport = actReportAll([mutantResult]); +// expect(actualReport.files['file.js'].mutants[0].description).eq('Killed by: Foo should be bar'); +// }); + +// it('should provide the ignore reason as description', () => { +// const mutantResult = factory.ignoredMutantResult({ fileName: 'file.js', ignoreReason: 'Ignored by "fooMutator" in excludedMutations' }); +// const actualReport = actReportAll([mutantResult]); +// expect(actualReport.files['file.js'].mutants[0].description).eq('Ignore reason: Ignored by "fooMutator" in excludedMutations'); +// }); +// }); + +// function actReportAll(input: MutantResult[] = []): mutationTestReportSchema.MutationTestResult { +// sut.reportAll(input); +// return reporterMock.onMutationTestReportReady.firstCall.args[0]; +// } +// }); + +// describe('reportOne', () => { +// beforeEach(() => { +// inputFiles = new InputFileCollection([new File('add.js', 'function add(a, b) {\n return a + b;\n}\n')], ['add.js']); +// }); + +// it('should map simple attributes to the mutant result', () => { +// // Arrange +// const sut = createSut(); +// const location: Location = Object.freeze({ start: Object.freeze({ line: 1, column: 5 }), end: Object.freeze({ line: 3, column: 1 }) }); +// const range: Range = [21, 35]; + +// // Act +// const actual = sut.reportCheckFailed( +// factory.mutant({ +// id: 32, +// fileName: 'add.js', +// location, +// replacement: '{}', +// mutatorName: 'fooMutator', +// range, +// }), +// factory.failedCheckResult() +// ); + +// // Assert +// const expected: Partial = { +// id: '32', +// location, +// mutatorName: 'fooMutator', +// range, +// fileName: 'add.js', +// replacement: '{}', +// }; +// expect(actual).include(expected); +// }); + +// it('should report failed message on reportCheckFailed', () => { +// // Arrange +// const sut = createSut(); + +// // Act +// const actual = sut.reportCheckFailed( +// factory.mutant({ fileName: 'add.js' }), +// factory.failedCheckResult({ status: CheckStatus.CompileError, reason: 'cannot call foo of undefined' }) +// ); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.CompileError, +// errorMessage: 'cannot call foo of undefined', +// }; +// expect(actual).include(expected); +// }); + +// it('should report an empty test filter on reportNoCoverage', () => { +// // Arrange +// const sut = createSut(); + +// // Act +// const actual = sut.reportNoCoverage(factory.mutant({ fileName: 'add.js' })); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.NoCoverage, +// testFilter: [], +// }; +// expect(actual).deep.include(expected); +// }); + +// it('should report a killed mutant on reportMutantRunResult with a KilledMutantRunResult', () => { +// // Arrange +// dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); +// const sut = createSut(); + +// // Act +// const actual = sut.reportMutantRunResult( +// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), +// factory.killedMutantRunResult({ killedBy: '1', nrOfTests: 42 }) +// ); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.Killed, +// killedBy: 'foo should be bar', +// nrOfTestsRan: 42, +// }; +// expect(actual).deep.include(expected); +// }); + +// it('should report a runtime error mutant on reportMutantRunResult with a ErrorMutantRunResult', () => { +// // Arrange +// const sut = createSut(); + +// // Act +// const actual = sut.reportMutantRunResult( +// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), +// factory.errorMutantRunResult({ errorMessage: 'Cannot call foo of null' }) +// ); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.RuntimeError, +// errorMessage: 'Cannot call foo of null', +// }; +// expect(actual).deep.include(expected); +// }); + +// it('should report a timeout mutant on reportMutantRunResult with a TimeoutMutantRunResult', () => { +// // Arrange +// const sut = createSut(); + +// // Act +// const actual = sut.reportMutantRunResult( +// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), +// factory.timeoutMutantRunResult() +// ); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.TimedOut, +// }; +// expect(actual).deep.include(expected); +// }); + +// it('should report an ignored mutant on reportMutantRunResult with a IgnoredMutantResult', () => { +// // Arrange +// const sut = createSut(); + +// // Act +// const actual = sut.reportMutantIgnored(factory.mutant({ fileName: 'add.js', ignoreReason: 'foo is ignored' })); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.Ignored, +// ignoreReason: 'foo is ignored', +// }; +// expect(actual).deep.include(expected); +// }); + +// it('should report a survived mutant on reportMutantRunResult with a SurvivedMutantRunResult', () => { +// // Arrange +// dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); +// const sut = createSut(); + +// // Act +// const actual = sut.reportMutantRunResult( +// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }), testFilter: ['1'] }), +// factory.survivedMutantRunResult({ nrOfTests: 4 }) +// ); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.Survived, +// testFilter: ['foo should be bar'], +// nrOfTestsRan: 4, +// }; +// expect(actual).deep.include(expected); +// }); + +// it('should be able to report testFilter as `undefined` for a survived mutant', () => { +// // Arrange +// dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); +// const sut = createSut(); + +// // Act +// const actual = sut.reportMutantRunResult( +// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }), testFilter: undefined }), +// factory.survivedMutantRunResult() +// ); + +// // Assert +// const expected: Partial = { +// status: MutantStatus.Survived, +// testFilter: undefined, +// }; +// expect(actual).deep.include(expected); +// }); +// }); +// }); diff --git a/packages/instrumenter/src/mutant.ts b/packages/instrumenter/src/mutant.ts index 3900d153ac..0ad89da572 100644 --- a/packages/instrumenter/src/mutant.ts +++ b/packages/instrumenter/src/mutant.ts @@ -29,7 +29,7 @@ export class Mutant { public toApiMutant(): ApiMutant { return { fileName: this.fileName, - id: this.id, + id: this.id.toString(), location: toApiLocation(this.original.loc!), mutatorName: this.mutatorName, range: [this.original.start!, this.original.end!], diff --git a/packages/instrumenter/test/unit/mutant.spec.ts b/packages/instrumenter/test/unit/mutant.spec.ts index 08756bac0b..e85492386d 100644 --- a/packages/instrumenter/test/unit/mutant.spec.ts +++ b/packages/instrumenter/test/unit/mutant.spec.ts @@ -36,7 +36,7 @@ describe(Mutant.name, () => { mutant.original.loc = { start: { column: 0, line: 0 }, end: { column: 0, line: 0 } }; const expected: Partial = { fileName: 'file.js', - id: 2, + id: '2', mutatorName: 'fooMutator', replacement: '"Stryker was here!"', ignoreReason: 'ignore', @@ -55,7 +55,6 @@ describe(Mutant.name, () => { // Assert expect(actual.location).deep.eq({ start: { line: 0, column: 3 }, end: { line: 0, column: 8 } }); - expect(actual.range).deep.eq([3, 8]); }); }); }); diff --git a/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts b/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts index d5cfc5568f..8a84ded5be 100644 --- a/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts +++ b/packages/jasmine-runner/test/integration/jasmine-init-instrumented.it.spec.ts @@ -43,20 +43,20 @@ describe('JasmineRunner integration with code instrumentation', () => { describe('mutantRun', () => { it('should be able to kill a mutant', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 1 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '1' }) })); assertions.expectKilled(result); expect(result.killedBy).eq('spec0'); expect(result.failureMessage).eq('Expected Player({ currentlyPlayingSong: Song({ }), isPlaying: false }) to be playing Song({ }).'); }); it('should be able report "survive" when a mutant is invincible', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 12 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '12' }) })); assertions.expectSurvived(result); }); it('should be able to kill again after a mutant survived', async () => { - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 12 }) })); - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 2 }) })); + await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '12' }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '2' }) })); const expected = factory.killedMutantRunResult({ killedBy: 'spec1', status: MutantRunStatus.Killed, diff --git a/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts b/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts index 47290b500a..e63e48f60d 100644 --- a/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts +++ b/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts @@ -5,6 +5,8 @@ import { TestStatus, CompleteDryRunResult, DryRunStatus } from '@stryker-mutator import Jasmine from 'jasmine'; import { DirectoryRequireCache } from '@stryker-mutator/util'; +import { MutantCoverage } from '@stryker-mutator/api/core'; + import * as helpers from '../../src/helpers'; import * as pluginTokens from '../../src/plugin-tokens'; import { JasmineTestRunner } from '../../src'; @@ -69,7 +71,7 @@ describe(JasmineTestRunner.name, () => { }); it('should set the activeMutant on global scope', async () => { - actEmptyMutantRun(undefined, factory.mutant({ id: 23 })); + actEmptyMutantRun(undefined, factory.mutant({ id: '23' })); expect(global.__stryker2__?.activeMutant).eq(23); }); @@ -108,9 +110,9 @@ describe(JasmineTestRunner.name, () => { (['perTest', 'all'] as const).forEach((coverageAnalysis) => it(`should report mutation coverage when coverage analysis is ${coverageAnalysis}`, async () => { // Arrange - const expectedMutationCoverage = { + const expectedMutationCoverage: MutantCoverage = { perTest: { - [1]: [2, 3], + '1': { '0': 2, '1': 3 }, }, static: {}, }; diff --git a/packages/test-helpers/package.json b/packages/test-helpers/package.json index de64d9ee49..aaea401d77 100644 --- a/packages/test-helpers/package.json +++ b/packages/test-helpers/package.json @@ -18,7 +18,7 @@ "license": "ISC", "dependencies": { "ajv": "~7.1.0", - "mutation-testing-metrics": "~1.5.2" + "mutation-testing-metrics": "~1.6.2" }, "devDependencies": { "@stryker-mutator/api": "4.4.1", diff --git a/packages/test-helpers/src/factory.ts b/packages/test-helpers/src/factory.ts index d9ea219cef..d98fdc4beb 100644 --- a/packages/test-helpers/src/factory.ts +++ b/packages/test-helpers/src/factory.ts @@ -7,20 +7,14 @@ import { strykerCoreSchema, WarningOptions, Mutant, + MutantTestCoverage, + MutantResult, MutantCoverage, + schema, + MutantStatus, } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; -import { - MatchedMutant, - MutantStatus, - mutationTestReportSchema, - Reporter, - KilledMutantResult, - InvalidMutantResult, - UndetectedMutantResult, - TimeoutMutantResult, - IgnoredMutantResult, -} from '@stryker-mutator/api/report'; +import { Reporter } from '@stryker-mutator/api/report'; import { Metrics, MetricsResult } from 'mutation-testing-metrics'; import sinon from 'sinon'; import { Injector } from 'typed-inject'; @@ -87,75 +81,31 @@ export const warningOptions = factoryMethod(() => ({ preprocessorErrors: true, })); -export const killedMutantResult = factoryMethod(() => ({ +export const killedMutantResult = (overrides?: Partial>): MutantResult => + mutantResult({ ...overrides, status: MutantStatus.Killed, killedBy: ['45'], testsCompleted: 2 }); +export const timeoutMutantResult = (overrides?: Partial>): MutantResult => + mutantResult({ ...overrides, status: MutantStatus.Timeout, statusReason: 'expected error' }); +export const invalidMutantResult = (overrides?: Partial>): MutantResult => + mutantResult({ ...overrides, status: MutantStatus.RuntimeError, statusReason: 'expected error' }); +export const ignoredMutantResult = (overrides?: Partial>): MutantResult => + mutantResult({ ...overrides, status: MutantStatus.Ignored, statusReason: 'Ignored by "fooMutator" in excludedMutations' }); +export const undetectedMutantResult = (overrides?: Partial>): MutantResult => + mutantResult({ ...overrides, status: MutantStatus.NoCoverage }); + +export const mutantResult = factoryMethod(() => ({ id: '256', location: location(), - mutatedLines: '', mutatorName: '', - originalLines: '', range: [0, 0], replacement: '', fileName: 'file.js', - status: MutantStatus.Killed, - killedBy: '', - nrOfTestsRan: 2, -})); -export const timeoutMutantResult = factoryMethod(() => ({ - id: '256', - location: location(), - mutatedLines: '', - mutatorName: '', - originalLines: '', - range: [0, 0], - replacement: '', - fileName: 'file.js', - status: MutantStatus.TimedOut, - nrOfTestsRan: 0, + status: MutantStatus.Survived, + coveredBy: ['1', '2'], + testsCompleted: 2, + static: false, })); -export const invalidMutantResult = factoryMethod(() => ({ - id: '256', - location: location(), - mutatedLines: '', - mutatorName: '', - originalLines: '', - range: [0, 0], - replacement: '', - fileName: 'file.js', - status: MutantStatus.RuntimeError, - errorMessage: 'expected error', - nrOfTestsRan: 2, -})); - -export const ignoredMutantResult = factoryMethod(() => ({ - id: '256', - location: location(), - mutatedLines: '', - mutatorName: '', - originalLines: '', - range: [0, 0], - replacement: '', - fileName: 'file.js', - status: MutantStatus.Ignored, - ignoreReason: 'Ignored by "fooMutator" in excludedMutations', - nrOfTestsRan: 2, -})); - -export const undetectedMutantResult = factoryMethod(() => ({ - id: '256', - location: location(), - mutatedLines: '', - mutatorName: '', - originalLines: '', - range: [0, 0], - replacement: '', - fileName: 'file.js', - status: MutantStatus.NoCoverage, - testFilter: undefined, - nrOfTestsRan: 2, -})); - -export const mutationTestReportSchemaMutantResult = factoryMethod(() => ({ +export const mutationTestReportSchemaMutantResult = factoryMethod(() => ({ id: '256', location: location(), mutatedLines: '', @@ -164,17 +114,27 @@ export const mutationTestReportSchemaMutantResult = factoryMethod(() => ({ +export const mutationTestReportSchemaFileResult = factoryMethod(() => ({ language: 'javascript', mutants: [mutationTestReportSchemaMutantResult()], source: 'export function add (a, b) { return a + b; }', })); -export const mutationTestReportSchemaMutationTestResult = factoryMethod(() => ({ +export const mutationTestReportSchemaTestFile = factoryMethod(() => ({ + tests: [], + source: '', +})); + +export const mutationTestReportSchemaTestDefinition = factoryMethod(() => ({ + id: '4', + name: 'foo should be bar', +})); + +export const mutationTestReportSchemaMutationTestResult = factoryMethod(() => ({ files: { 'fileA.js': mutationTestReportSchemaFileResult(), }, @@ -186,7 +146,7 @@ export const mutationTestReportSchemaMutationTestResult = factoryMethod(() => ({ - id: 42, + id: '42', fileName: 'file', mutatorName: 'foobarMutator', range: [0, 0], @@ -369,14 +329,16 @@ export function reporter(name = 'fooReporter'): sinon.SinonStubbedInstance(() => ({ - testFilter: undefined, +export const mutantTestCoverage = factoryMethod(() => ({ + coveredBy: undefined, fileName: '', id: '1', mutatorName: '', - runAllTests: false, + static: false, replacement: '', - timeSpentScopedTests: 0, + location: location(), + estimatedNetTime: 42, + range: [0, 1], })); export function injector(): sinon.SinonStubbedInstance { From 2ad448fc9ebed5956390b91e28317e5a4d86672d Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Wed, 24 Feb 2021 21:51:18 +0100 Subject: [PATCH 06/25] WIP: new reporter model --- .../core/src/reporters/html/html-reporter.ts | 8 +- .../src/reporters/html/report-template.ts | 4 +- packages/core/src/reporters/json-reporter.ts | 8 +- .../progress-append-only-reporter.ts | 4 +- .../core/src/reporters/progress-reporter.ts | 4 +- packages/core/test/helpers/producers.ts | 11 --- .../command-test-runner.it.spec.ts | 4 +- .../child-proxy/child-process-proxy.spec.ts | 9 +- .../child-proxy/child-process-worker.spec.ts | 2 +- .../mutants/find-mutant-test-coverage.spec.ts | 96 +++++++++---------- .../2-mutant-instrumenter-executor.spec.ts | 2 +- .../process/4-mutation-test-executor.spec.ts | 56 +++++------ .../test/unit/reporters/dots-reporter.spec.ts | 6 +- .../unit/reporters/html/html-reporter.spec.ts | 8 +- .../test/unit/reporters/json-reporter.spec.ts | 6 +- .../progress-append-only-reporter.spec.ts | 6 +- .../unit/reporters/progress-reporter.spec.ts | 58 +++++------ packages/core/test/unit/stryker.spec.ts | 3 +- .../test-runner/command-test-runner.spec.ts | 4 +- packages/core/tsconfig.src.json | 4 +- .../integration/coverage-analysis.it.spec.ts | 8 +- .../integration/jest-test-runner.it.spec.ts | 12 +-- .../test/unit/jest-test-runner.spec.ts | 8 +- .../test/integration/instrumented.it.spec.ts | 28 +++--- .../test-hooks-middleware.spec.ts | 4 +- .../sample-project-instrumented.it.spec.ts | 10 +- .../test/unit/mocha-test-runner.spec.ts | 2 +- 27 files changed, 176 insertions(+), 199 deletions(-) diff --git a/packages/core/src/reporters/html/html-reporter.ts b/packages/core/src/reporters/html/html-reporter.ts index 7c653ef0d3..a9c1474664 100644 --- a/packages/core/src/reporters/html/html-reporter.ts +++ b/packages/core/src/reporters/html/html-reporter.ts @@ -1,10 +1,10 @@ import path from 'path'; import fileUrl from 'file-url'; -import { StrykerOptions } from '@stryker-mutator/api/core'; +import { schema, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import { mutationTestReportSchema, Reporter } from '@stryker-mutator/api/report'; +import { Reporter } from '@stryker-mutator/api/report'; import * as ReporterUtil from '../reporter-util'; @@ -21,7 +21,7 @@ export class HtmlReporter implements Reporter { public static readonly inject = tokens(commonTokens.options, commonTokens.logger); - public onMutationTestReportReady(report: mutationTestReportSchema.MutationTestResult): void { + public onMutationTestReportReady(report: schema.MutationTestResult): void { this.mainPromise = this.generateReport(report); } @@ -29,7 +29,7 @@ export class HtmlReporter implements Reporter { return this.mainPromise; } - private async generateReport(report: mutationTestReportSchema.MutationTestResult) { + private async generateReport(report: schema.MutationTestResult) { const indexFileName = path.resolve(this.baseDir, 'index.html'); const singleFile = await reportTemplate(report); await this.cleanBaseFolder(); diff --git a/packages/core/src/reporters/html/report-template.ts b/packages/core/src/reporters/html/report-template.ts index b87ac12445..62f6e50cf5 100644 --- a/packages/core/src/reporters/html/report-template.ts +++ b/packages/core/src/reporters/html/report-template.ts @@ -1,11 +1,11 @@ import { readFile } from 'fs'; import { promisify } from 'util'; -import { mutationTestReportSchema } from '@stryker-mutator/api/report'; +import { schema } from '@stryker-mutator/api/core'; const promisedReadFile = promisify(readFile); -export async function reportTemplate(report: mutationTestReportSchema.MutationTestResult): Promise { +export async function reportTemplate(report: schema.MutationTestResult): Promise { const scriptContent = await promisedReadFile(require.resolve('mutation-testing-elements/dist/mutation-test-elements.js'), 'utf-8'); return ` diff --git a/packages/core/src/reporters/json-reporter.ts b/packages/core/src/reporters/json-reporter.ts index ef9a9cbd92..45a804e9e2 100644 --- a/packages/core/src/reporters/json-reporter.ts +++ b/packages/core/src/reporters/json-reporter.ts @@ -1,9 +1,9 @@ import path from 'path'; -import { StrykerOptions } from '@stryker-mutator/api/core'; +import { schema, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; -import { mutationTestReportSchema, Reporter } from '@stryker-mutator/api/report'; +import { Reporter } from '@stryker-mutator/api/report'; import fileUrl from 'file-url'; @@ -19,7 +19,7 @@ export class JsonReporter implements Reporter { public static readonly inject = tokens(commonTokens.options, commonTokens.logger); - public onMutationTestReportReady(report: mutationTestReportSchema.MutationTestResult): void { + public onMutationTestReportReady(report: schema.MutationTestResult): void { this.mainPromise = this.generateReport(report); } @@ -27,7 +27,7 @@ export class JsonReporter implements Reporter { return this.mainPromise; } - private async generateReport(report: mutationTestReportSchema.MutationTestResult) { + private async generateReport(report: schema.MutationTestResult) { const filePath = path.normalize(this.options.jsonReporter.fileName); this.log.debug(`Using relative path ${filePath}`); await ReporterUtil.writeFile(path.resolve(filePath), JSON.stringify(report, null, INDENTION_LEVEL)); diff --git a/packages/core/src/reporters/progress-append-only-reporter.ts b/packages/core/src/reporters/progress-append-only-reporter.ts index 58040a21e9..00b63d5632 100644 --- a/packages/core/src/reporters/progress-append-only-reporter.ts +++ b/packages/core/src/reporters/progress-append-only-reporter.ts @@ -1,13 +1,13 @@ import os from 'os'; -import { MatchedMutant } from '@stryker-mutator/api/report'; +import { MutantTestCoverage } from '@stryker-mutator/api/core'; import { ProgressKeeper } from './progress-keeper'; export class ProgressAppendOnlyReporter extends ProgressKeeper { private intervalReference?: NodeJS.Timer; - public onAllMutantsMatchedWithTests(matchedMutants: readonly MatchedMutant[]): void { + public onAllMutantsMatchedWithTests(matchedMutants: readonly MutantTestCoverage[]): void { super.onAllMutantsMatchedWithTests(matchedMutants); if (matchedMutants.length) { this.intervalReference = setInterval(() => this.render(), 10000); diff --git a/packages/core/src/reporters/progress-reporter.ts b/packages/core/src/reporters/progress-reporter.ts index 3e19ae1bb9..525fe67287 100644 --- a/packages/core/src/reporters/progress-reporter.ts +++ b/packages/core/src/reporters/progress-reporter.ts @@ -1,4 +1,4 @@ -import { MatchedMutant, MutantResult } from '@stryker-mutator/api/report'; +import { MutantTestCoverage, MutantResult } from '@stryker-mutator/api/core'; import { ProgressBar } from './progress-bar'; import { ProgressKeeper } from './progress-keeper'; @@ -6,7 +6,7 @@ import { ProgressKeeper } from './progress-keeper'; export class ProgressBarReporter extends ProgressKeeper { private progressBar?: ProgressBar; - public onAllMutantsMatchedWithTests(matchedMutants: readonly MatchedMutant[]): void { + public onAllMutantsMatchedWithTests(matchedMutants: MutantTestCoverage[]): void { super.onAllMutantsMatchedWithTests(matchedMutants); const progressBarContent = 'Mutation testing [:bar] :percent (elapsed: :et, remaining: :etc) :tested/:total tested (:survived survived, :timedOut timed out)'; diff --git a/packages/core/test/helpers/producers.ts b/packages/core/test/helpers/producers.ts index b4ee836ed2..01f6c6167e 100644 --- a/packages/core/test/helpers/producers.ts +++ b/packages/core/test/helpers/producers.ts @@ -1,14 +1,12 @@ import { CpuInfo } from 'os'; import { ClearTextReporterOptions } from '@stryker-mutator/api/core'; -import { factory } from '@stryker-mutator/test-helpers'; import { Logger } from 'log4js'; import sinon from 'sinon'; import { ReplaySubject } from 'rxjs'; import { TestRunner } from '@stryker-mutator/api/test-runner'; import { Checker } from '@stryker-mutator/api/check'; -import { MutantTestCoverage } from '../../src/mutants/find-mutant-test-coverage'; import { Pool, ConcurrencyTokenProvider } from '../../src/concurrent'; export type Mutable = { @@ -65,15 +63,6 @@ export function createCheckerPoolMock(): sinon.SinonStubbedInstance): MutantTestCoverage { - return { - coveredByTests: true, - mutant: factory.mutant(), - estimatedNetTime: 10, - ...overrides, - }; -} - export const logger = (): Mock => { return { _log: sinon.stub(), diff --git a/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts b/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts index b3f2fa82f1..4a8d2a951b 100644 --- a/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts +++ b/packages/core/test/integration/command-test-runner/command-test-runner.it.spec.ts @@ -54,12 +54,12 @@ describe(`${CommandTestRunner.name} integration`, () => { describe(CommandTestRunner.prototype.mutantRun.name, () => { it('should report mutant as survived if the process exits with 0', async () => { const sut = createSut({ command: 'npm run mutant' }); - const result = await sut.mutantRun({ activeMutant: factory.mutant({ id: 41 }) }); + const result = await sut.mutantRun({ activeMutant: factory.mutant({ id: '41' }) }); assertions.expectSurvived(result); }); it('should report mutant as killed if the process exits with 1', async () => { const sut = createSut({ command: 'npm run mutant' }); - const result = await sut.mutantRun({ activeMutant: factory.mutant({ id: 42 /* 42 should fail */ }) }); + const result = await sut.mutantRun({ activeMutant: factory.mutant({ id: '42' /* 42 should fail */ }) }); assertions.expectKilled(result); expect(result.killedBy).eq('all'); }); diff --git a/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts b/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts index b419da8689..15bb5729d8 100644 --- a/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts +++ b/packages/core/test/unit/child-proxy/child-process-proxy.spec.ts @@ -19,6 +19,7 @@ import { WorkerMessageKind, } from '../../../src/child-proxy/message-protocol'; import { LoggingClientContext } from '../../../src/logging'; +import * as stringUtils from '../../../src/utils/string-utils'; import * as objectUtils from '../../../src/utils/object-utils'; import { OutOfMemoryError } from '../../../src/child-proxy/out-of-memory-error'; import { currentLogMock } from '../../helpers/log-mock'; @@ -91,7 +92,7 @@ describe(ChildProcessProxy.name, () => { }); // Assert - expect(childProcessMock.send).calledWith(objectUtils.serialize(expectedMessage)); + expect(childProcessMock.send).calledWith(stringUtils.serialize(expectedMessage)); }); it('should log the exec arguments and require name', () => { @@ -225,7 +226,7 @@ describe(ChildProcessProxy.name, () => { // Assert expect(result).eq('ack'); - expect(childProcessMock.send).calledWith(objectUtils.serialize(expectedWorkerMessage)); + expect(childProcessMock.send).calledWith(stringUtils.serialize(expectedWorkerMessage)); }); }); @@ -237,7 +238,7 @@ describe(ChildProcessProxy.name, () => { it('should send a dispose message', async () => { await actDispose(); const expectedWorkerMessage: DisposeMessage = { kind: WorkerMessageKind.Dispose }; - expect(childProcessMock.send).calledWith(objectUtils.serialize(expectedWorkerMessage)); + expect(childProcessMock.send).calledWith(stringUtils.serialize(expectedWorkerMessage)); }); it('should kill the child process', async () => { @@ -280,7 +281,7 @@ describe(ChildProcessProxy.name, () => { }); function receiveMessage(workerResponse: ParentMessage) { - childProcessMock.emit('message', objectUtils.serialize(workerResponse)); + childProcessMock.emit('message', stringUtils.serialize(workerResponse)); } }); diff --git a/packages/core/test/unit/child-proxy/child-process-worker.spec.ts b/packages/core/test/unit/child-proxy/child-process-worker.spec.ts index a571b6fdd3..b70a77a70f 100644 --- a/packages/core/test/unit/child-proxy/child-process-worker.spec.ts +++ b/packages/core/test/unit/child-proxy/child-process-worker.spec.ts @@ -18,7 +18,7 @@ import { } from '../../../src/child-proxy/message-protocol'; import * as di from '../../../src/di'; import { LogConfigurator, LoggingClientContext } from '../../../src/logging'; -import { serialize } from '../../../src/utils/object-utils'; +import { serialize } from '../../../src/utils/string-utils'; import { currentLogMock } from '../../helpers/log-mock'; import { Mock } from '../../helpers/producers'; diff --git a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts index 33e486991a..a33b6a85d2 100644 --- a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts +++ b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts @@ -2,10 +2,10 @@ import sinon from 'sinon'; import { expect } from 'chai'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; -import { Mutant } from '@stryker-mutator/api/core'; -import { Reporter, MatchedMutant } from '@stryker-mutator/api/report'; +import { Mutant, MutantTestCoverage } from '@stryker-mutator/api/core'; +import { Reporter } from '@stryker-mutator/api/report'; -import { findMutantTestCoverage as sut, MutantTestCoverage } from '../../../src/mutants/find-mutant-test-coverage'; +import { findMutantTestCoverage as sut } from '../../../src/mutants/find-mutant-test-coverage'; import { coreTokens } from '../../../src/di'; describe(sut.name, () => { @@ -24,22 +24,22 @@ describe(sut.name, () => { } it('should not match ignored mutants to any tests', () => { - const mutant = factory.mutant({ id: 2, ignoreReason: 'foo should ignore' }); + const mutant = factory.mutant({ id: '2', ignoreReason: 'foo should ignore' }); const dryRunResult = factory.completeDryRunResult({ mutantCoverage: { static: {}, perTest: { '1': { 2: 2 } } } }); // Act const result = act(dryRunResult, [mutant]); // Assert - const expected: MutantTestCoverage[] = [{ mutant, estimatedNetTime: 0, coveredByTests: false }]; + const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, static: false, coveredBy: undefined }]; expect(result).deep.eq(expected); }); describe('without mutant coverage data', () => { it('should disable test filtering', () => { // Arrange - const mutant1 = factory.mutant({ id: 1 }); - const mutant2 = factory.mutant({ id: 2 }); + const mutant1 = factory.mutant({ id: '1' }); + const mutant2 = factory.mutant({ id: '2' }); const mutants = [mutant1, mutant2]; const dryRunResult = factory.completeDryRunResult({ mutantCoverage: undefined }); @@ -48,15 +48,15 @@ describe(sut.name, () => { // Assert const expected: MutantTestCoverage[] = [ - { mutant: mutant1, estimatedNetTime: 0, testFilter: undefined, coveredByTests: true }, - { mutant: mutant2, estimatedNetTime: 0, testFilter: undefined, coveredByTests: true }, + { ...mutant1, estimatedNetTime: 0, coveredBy: undefined, static: true }, + { ...mutant2, estimatedNetTime: 0, coveredBy: undefined, static: true }, ]; expect(result).deep.eq(expected); }); it('should calculate estimatedNetTime as the sum of all tests', () => { // Arrange - const mutant1 = factory.mutant({ id: 1 }); + const mutant1 = factory.mutant({ id: '1' }); const mutants = [mutant1]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ timeSpentMs: 20 }), factory.successTestResult({ timeSpentMs: 22 })], @@ -73,8 +73,8 @@ describe(sut.name, () => { it('should report onAllMutantsMatchedWithTests', () => { // Arrange const mutants = [ - factory.mutant({ id: 1, fileName: 'foo.js', mutatorName: 'fooMutator', replacement: '<=' }), - factory.mutant({ id: 2, fileName: 'bar.js', mutatorName: 'barMutator', replacement: '{}' }), + factory.mutant({ id: '1', fileName: 'foo.js', mutatorName: 'fooMutator', replacement: '<=' }), + factory.mutant({ id: '2', fileName: 'bar.js', mutatorName: 'barMutator', replacement: '{}' }), ]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ timeSpentMs: 20 }), factory.successTestResult({ timeSpentMs: 22 })], @@ -86,23 +86,21 @@ describe(sut.name, () => { // Assert expect(reporterMock.onAllMutantsMatchedWithTests).calledWithExactly([ - factory.matchedMutant({ + factory.mutantTestCoverage({ id: '1', fileName: 'foo.js', mutatorName: 'fooMutator', replacement: '<=', - runAllTests: true, - testFilter: undefined, - timeSpentScopedTests: 42, + static: true, + estimatedNetTime: 42, }), - factory.matchedMutant({ + factory.mutantTestCoverage({ id: '2', fileName: 'bar.js', mutatorName: 'barMutator', replacement: '{}', - runAllTests: true, - testFilter: undefined, - timeSpentScopedTests: 42, + static: true, + estimatedNetTime: 42, }), ]); }); @@ -111,7 +109,7 @@ describe(sut.name, () => { describe('with static coverage', () => { it('should disable test filtering', () => { // Arrange - const mutant = factory.mutant({ id: 1 }); + const mutant = factory.mutant({ id: '1' }); const mutants = [mutant]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ id: 'spec1', timeSpentMs: 0 })], @@ -122,13 +120,13 @@ describe(sut.name, () => { const result = act(dryRunResult, mutants); // Assert - const expected: MutantTestCoverage[] = [{ mutant, estimatedNetTime: 0, testFilter: undefined, coveredByTests: true }]; + const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, static: true }]; expect(result).deep.eq(expected); }); it('should calculate estimatedNetTime as the sum of all tests', () => { // Arrange - const mutant = factory.mutant({ id: 1 }); + const mutant = factory.mutant({ id: '1' }); const mutants = [mutant]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ id: 'spec1', timeSpentMs: 20 }), factory.successTestResult({ id: 'spec1', timeSpentMs: 22 })], @@ -144,7 +142,7 @@ describe(sut.name, () => { it('should report onAllMutantsMatchedWithTests with correct `runAllTests` value', () => { // Arrange - const mutants = [factory.mutant({ id: 1 }), factory.mutant({ id: 2 })]; + const mutants = [factory.mutant({ id: '1' }), factory.mutant({ id: '2' })]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult()], mutantCoverage: { static: { 1: 1 }, perTest: {} }, @@ -154,15 +152,15 @@ describe(sut.name, () => { act(dryRunResult, mutants); // Assert - const expectedFirstMatch: Partial = { + const expectedFirstMatch: Partial = { id: '1', - runAllTests: true, - testFilter: undefined, + static: true, + coveredBy: undefined, }; - const expectedSecondMatch: Partial = { + const expectedSecondMatch: Partial = { id: '2', - runAllTests: false, - testFilter: undefined, + static: false, + coveredBy: undefined, }; expect(reporterMock.onAllMutantsMatchedWithTests).calledWithMatch([sinon.match(expectedFirstMatch), sinon.match(expectedSecondMatch)]); }); @@ -171,8 +169,8 @@ describe(sut.name, () => { describe('with perTest coverage', () => { it('should enable test filtering for covered tests', () => { // Arrange - const mutant1 = factory.mutant({ id: 1 }); - const mutant2 = factory.mutant({ id: 2 }); + const mutant1 = factory.mutant({ id: '1' }); + const mutant2 = factory.mutant({ id: '2' }); const mutants = [mutant1, mutant2]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ id: 'spec1', timeSpentMs: 0 }), factory.successTestResult({ id: 'spec2', timeSpentMs: 0 })], @@ -184,16 +182,16 @@ describe(sut.name, () => { // Assert const expected: MutantTestCoverage[] = [ - { mutant: mutant1, estimatedNetTime: 0, testFilter: ['spec1'], coveredByTests: true }, - { mutant: mutant2, estimatedNetTime: 0, testFilter: ['spec2'], coveredByTests: true }, + { ...mutant1, estimatedNetTime: 0, coveredBy: ['spec1'], static: false }, + { ...mutant2, estimatedNetTime: 0, coveredBy: ['spec2'], static: false }, ]; expect(result).deep.eq(expected); }); it('should calculate estimatedNetTime as the sum of covered tests', () => { // Arrange - const mutant1 = factory.mutant({ id: 1 }); - const mutant2 = factory.mutant({ id: 2 }); + const mutant1 = factory.mutant({ id: '1' }); + const mutant2 = factory.mutant({ id: '2' }); const mutants = [mutant1, mutant2]; const dryRunResult = factory.completeDryRunResult({ tests: [ @@ -208,13 +206,13 @@ describe(sut.name, () => { const actualMatches = act(dryRunResult, mutants); // Assert - expect(actualMatches.find((mutant) => mutant.mutant.id === 1)?.estimatedNetTime).eq(42); // spec1 + spec3 - expect(actualMatches.find((mutant) => mutant.mutant.id === 2)?.estimatedNetTime).eq(10); // spec2 + expect(actualMatches.find((mutant) => mutant.id === '1')?.estimatedNetTime).eq(42); // spec1 + spec3 + expect(actualMatches.find((mutant) => mutant.id === '2')?.estimatedNetTime).eq(10); // spec2 }); it('should report onAllMutantsMatchedWithTests with correct `testFilter` value', () => { // Arrange - const mutants = [factory.mutant({ id: 1 }), factory.mutant({ id: 2 })]; + const mutants = [factory.mutant({ id: '1' }), factory.mutant({ id: '2' })]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ id: 'spec1', timeSpentMs: 0 }), factory.successTestResult({ id: 'spec2', timeSpentMs: 0 })], mutantCoverage: { static: { 1: 0 }, perTest: { spec1: { 1: 1 }, spec2: { 1: 0, 2: 1 } } }, @@ -224,23 +222,23 @@ describe(sut.name, () => { act(dryRunResult, mutants); // Assert - const expectedFirstMatch: Partial = { + const expectedFirstMatch: Partial = { id: '1', - runAllTests: false, - testFilter: ['spec1'], + static: false, + coveredBy: ['spec1'], }; - const expectedSecondMatch: Partial = { + const expectedSecondMatch: Partial = { id: '2', - runAllTests: false, - testFilter: ['spec2'], + static: false, + coveredBy: ['spec2'], }; expect(reporterMock.onAllMutantsMatchedWithTests).calledWithMatch([sinon.match(expectedFirstMatch), sinon.match(expectedSecondMatch)]); }); it('should allow for non-existing tests (#2485)', () => { // Arrange - const mutant1 = factory.mutant({ id: 1 }); - const mutant2 = factory.mutant({ id: 2 }); + const mutant1 = factory.mutant({ id: '1' }); + const mutant2 = factory.mutant({ id: '2' }); const mutants = [mutant1, mutant2]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ id: 'spec1', timeSpentMs: 20 })], // test result for spec2 is missing @@ -251,8 +249,8 @@ describe(sut.name, () => { const actualMatches = act(dryRunResult, mutants); // Assert - expect(actualMatches.find((mutant) => mutant.mutant.id === 1)?.testFilter).deep.eq(['spec1']); - expect(actualMatches.find((mutant) => mutant.mutant.id === 2)?.coveredByTests).deep.eq(false); + expect(actualMatches.find((mutant) => mutant.id === '1')?.coveredBy).deep.eq(['spec1']); + expect(actualMatches.find((mutant) => mutant.id === '2')?.coveredBy).undefined; expect(testInjector.logger.debug).calledWith( 'Found test with id "spec2" in coverage data, but not in the test results of the dry run. Not taking coverage data for this test into account' ); diff --git a/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts b/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts index db4c4cfcac..f779396e69 100644 --- a/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts +++ b/packages/core/test/unit/process/2-mutant-instrumenter-executor.spec.ts @@ -39,7 +39,7 @@ describe(MutantInstrumenterExecutor.name, () => { instrumentResult = { files: [mutatedFile], - mutants: [factory.mutant({ id: 1, replacement: 'bar' })], + mutants: [factory.mutant({ id: '1', replacement: 'bar' })], }; sandboxMock = sinon.createStubInstance(Sandbox); instrumenterMock = sinon.createStubInstance(Instrumenter); diff --git a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts index 2674a0a4a0..b6fa5a2c4f 100644 --- a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts +++ b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts @@ -6,13 +6,12 @@ import { TestRunner, MutantRunOptions, MutantRunResult, MutantRunStatus } from ' import { Checker, CheckResult, CheckStatus } from '@stryker-mutator/api/check'; import { mergeMap } from 'rxjs/operators'; import { Observable } from 'rxjs'; -import { Mutant } from '@stryker-mutator/api/core'; +import { Mutant, MutantTestCoverage } from '@stryker-mutator/api/core'; import { I, Task } from '@stryker-mutator/util'; import { MutationTestExecutor } from '../../../src/process'; import { coreTokens } from '../../../src/di'; -import { createTestRunnerPoolMock, createMutantTestCoverage, createCheckerPoolMock } from '../../helpers/producers'; -import { MutantTestCoverage } from '../../../src/mutants/find-mutant-test-coverage'; +import { createTestRunnerPoolMock, createCheckerPoolMock } from '../../helpers/producers'; import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; import { Timer } from '../../../src/utils/timer'; import { ConcurrencyTokenProvider, Pool } from '../../../src/concurrent'; @@ -73,24 +72,22 @@ describe(MutationTestExecutor.name, () => { it('should schedule mutants to be tested', async () => { // Arrange arrangeScenario(); - const mutant1 = factory.mutant({ id: 1 }); - const mutant2 = factory.mutant({ id: 2 }); - mutants.push(createMutantTestCoverage({ mutant: mutant1 })); - mutants.push(createMutantTestCoverage({ mutant: mutant2 })); + mutants.push(factory.mutantTestCoverage({ id: '1' })); + mutants.push(factory.mutantTestCoverage({ id: '2' })); // Act await sut.execute(); // Assert expect(testRunnerPoolMock.schedule).calledOnce; - expect(testRunner.mutantRun).calledWithMatch({ activeMutant: mutant1 }); - expect(testRunner.mutantRun).calledWithMatch({ activeMutant: mutant2 }); + expect(testRunner.mutantRun).calledWithMatch({ activeMutant: mutants[0] }); + expect(testRunner.mutantRun).calledWithMatch({ activeMutant: mutants[1] }); }); it('should short circuit ignored mutants (not check them or run them)', async () => { // Arrange - mutants.push(createMutantTestCoverage({ mutant: factory.mutant({ id: 1, ignoreReason: '1 is ignored' }) })); - mutants.push(createMutantTestCoverage({ mutant: factory.mutant({ id: 2, ignoreReason: '2 is ignored' }) })); + mutants.push(factory.mutantTestCoverage({ id: '1', ignoreReason: '1 is ignored' })); + mutants.push(factory.mutantTestCoverage({ id: '2', ignoreReason: '2 is ignored' })); // Act const actualResults = await sut.execute(); @@ -104,24 +101,22 @@ describe(MutationTestExecutor.name, () => { it('should check the mutants before running them', async () => { // Arrange arrangeScenario(); - const mutant1 = factory.mutant({ id: 1 }); - const mutant2 = factory.mutant({ id: 2 }); - mutants.push(createMutantTestCoverage({ mutant: mutant1 })); - mutants.push(createMutantTestCoverage({ mutant: mutant2 })); + mutants.push(factory.mutantTestCoverage({ id: '1' })); + mutants.push(factory.mutantTestCoverage({ id: '2' })); // Act await sut.execute(); // Assert expect(checker.check).calledTwice; - expect(checker.check).calledWithMatch(mutant1); - expect(checker.check).calledWithMatch(mutant2); + expect(checker.check).calledWithMatch(mutants[0]); + expect(checker.check).calledWithMatch(mutants[1]); }); it('should calculate timeout correctly', async () => { // Arrange arrangeScenario(); - mutants.push(createMutantTestCoverage({ mutant: factory.mutant({ id: 1 }), estimatedNetTime: 10 })); + mutants.push(factory.mutantTestCoverage({ id: '1', estimatedNetTime: 10 })); testInjector.options.timeoutFactor = 1.5; testInjector.options.timeoutMS = 27; @@ -137,7 +132,7 @@ describe(MutationTestExecutor.name, () => { // Arrange arrangeScenario(); const expectedTestFilter = ['spec1', 'foo', 'bar']; - mutants.push(createMutantTestCoverage({ testFilter: expectedTestFilter })); + mutants.push(factory.mutantTestCoverage({ coveredBy: expectedTestFilter })); testInjector.options.timeoutFactor = 1.5; testInjector.options.timeoutMS = 27; @@ -154,7 +149,7 @@ describe(MutationTestExecutor.name, () => { arrangeScenario(); const expectedTestFilter = ['spec1', 'foo', 'bar']; sandboxMock.sandboxFileFor.returns('.stryker-tmp/sandbox1234/src/foo.js'); - mutants.push(createMutantTestCoverage({ testFilter: expectedTestFilter, mutant: factory.mutant({ fileName: 'src/foo.js' }) })); + mutants.push(factory.mutantTestCoverage({ coveredBy: expectedTestFilter, fileName: 'src/foo.js' })); testInjector.options.timeoutFactor = 1.5; testInjector.options.timeoutMS = 27; @@ -170,8 +165,7 @@ describe(MutationTestExecutor.name, () => { it('should not run mutants that are uncovered by tests', async () => { // Arrange arrangeScenario(); - const mutant1 = factory.mutant({ id: 1 }); - mutants.push(createMutantTestCoverage({ mutant: mutant1, coveredByTests: false })); + mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined, static: false })); // Act await sut.execute(); @@ -183,35 +177,33 @@ describe(MutationTestExecutor.name, () => { it('should report an ignored mutant as `Ignored`', async () => { // Arrange arrangeScenario(); - const mutant = factory.mutant({ id: 1, ignoreReason: '1 is ignored' }); - mutants.push(createMutantTestCoverage({ mutant, coveredByTests: false })); + mutants.push(factory.mutantTestCoverage({ id: '1', ignoreReason: '1 is ignored' })); // Act await sut.execute(); // Assert - expect(mutationTestReportCalculatorMock.reportMutantIgnored).calledWithExactly(mutant); + expect(mutationTestReportCalculatorMock.reportMutantIgnored).calledWithExactly(mutants[0]); }); it('should report an uncovered mutant with `NoCoverage`', async () => { // Arrange arrangeScenario(); - const mutant = factory.mutant({ id: 1 }); - mutants.push(createMutantTestCoverage({ mutant: factory.mutant({ id: 1 }), coveredByTests: false })); + mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined })); // Act await sut.execute(); // Assert - expect(mutationTestReportCalculatorMock.reportNoCoverage).calledWithExactly(mutant); + expect(mutationTestReportCalculatorMock.reportNoCoverage).calledWithExactly(mutants[0]); }); it('should report non-passed check results as "checkFailed"', async () => { // Arrange - const mutant = factory.mutant({ id: 1 }); + const mutant = factory.mutantTestCoverage({ id: '1' }); const failedCheckResult = factory.checkResult({ reason: 'Cannot find foo() of `undefined`', status: CheckStatus.CompileError }); checker.check.resolves(failedCheckResult); - mutants.push(createMutantTestCoverage({ mutant })); + mutants.push(mutant); // Act await sut.execute(); @@ -222,7 +214,7 @@ describe(MutationTestExecutor.name, () => { it('should free checker resources after checking stage is complete', async () => { // Arrange - mutants.push(createMutantTestCoverage({ mutant: factory.mutant({ id: 1 }) })); + mutants.push(factory.mutantTestCoverage({ id: '1' })); const checkTask = new Task(); const testRunnerTask = new Task(); testRunner.mutantRun.returns(testRunnerTask.promise); @@ -240,7 +232,7 @@ describe(MutationTestExecutor.name, () => { it('should report mutant run results', async () => { // Arrange - const mutant = createMutantTestCoverage(); + const mutant = factory.mutantTestCoverage(); const mutantRunResult = factory.killedMutantRunResult({ status: MutantRunStatus.Killed }); mutants.push(mutant); arrangeScenario({ mutantRunResult }); diff --git a/packages/core/test/unit/reporters/dots-reporter.spec.ts b/packages/core/test/unit/reporters/dots-reporter.spec.ts index 7bb7f4ccb5..7a8ae65bea 100644 --- a/packages/core/test/unit/reporters/dots-reporter.spec.ts +++ b/packages/core/test/unit/reporters/dots-reporter.spec.ts @@ -1,10 +1,10 @@ import os from 'os'; -import { MutantStatus } from '@stryker-mutator/api/report'; -import { factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import sinon from 'sinon'; import chalk from 'chalk'; +import { MutantStatus } from '@stryker-mutator/api/core'; +import { factory } from '@stryker-mutator/test-helpers'; import { DotsReporter } from '../../../src/reporters/dots-reporter'; @@ -30,7 +30,7 @@ describe(DotsReporter.name, () => { }); it('should log "S" when status is Survived', () => { - sut.onMutantTested(factory.undetectedMutantResult({ status: MutantStatus.Survived })); + sut.onMutantTested(factory.mutantResult({ status: MutantStatus.Survived })); expect(process.stdout.write).to.have.been.calledWith(chalk.bold.red('S')); }); }); diff --git a/packages/core/test/unit/reporters/html/html-reporter.spec.ts b/packages/core/test/unit/reporters/html/html-reporter.spec.ts index 651bf420a6..36d693a37a 100644 --- a/packages/core/test/unit/reporters/html/html-reporter.spec.ts +++ b/packages/core/test/unit/reporters/html/html-reporter.spec.ts @@ -1,9 +1,9 @@ import path from 'path'; -import { mutationTestReportSchema } from '@stryker-mutator/api/report'; -import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import sinon from 'sinon'; +import { testInjector } from '@stryker-mutator/test-helpers'; +import { schema } from '@stryker-mutator/api/core'; import { HtmlReporter } from '../../../../src/reporters/html/html-reporter'; import * as ReporterUtil from '../../../../src/reporters/reporter-util'; @@ -49,7 +49,7 @@ describe(HtmlReporter.name, () => { }); it('should write the mutation report in the index file', async () => { - const report: mutationTestReportSchema.MutationTestResult = { + const report: schema.MutationTestResult = { files: { 'foo.js': { language: 'js', @@ -69,7 +69,7 @@ describe(HtmlReporter.name, () => { }); it('should escape HTML tags in the mutation testing report.', async () => { - const report: mutationTestReportSchema.MutationTestResult = { + const report: schema.MutationTestResult = { files: { 'index.html': { language: 'html', diff --git a/packages/core/test/unit/reporters/json-reporter.spec.ts b/packages/core/test/unit/reporters/json-reporter.spec.ts index 816ded7ccf..2a36438287 100644 --- a/packages/core/test/unit/reporters/json-reporter.spec.ts +++ b/packages/core/test/unit/reporters/json-reporter.spec.ts @@ -1,9 +1,9 @@ import path from 'path'; -import { mutationTestReportSchema } from '@stryker-mutator/api/report'; -import { testInjector } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import sinon from 'sinon'; +import { testInjector } from '@stryker-mutator/test-helpers'; +import { schema } from '@stryker-mutator/api/core'; import { JsonReporter } from '../../../src/reporters/json-reporter'; import * as JsonReporterUtil from '../../../src/reporters/reporter-util'; @@ -37,7 +37,7 @@ describe(JsonReporter.name, () => { }); it('should write the mutation report to disk', async () => { - const report: mutationTestReportSchema.MutationTestResult = { + const report: schema.MutationTestResult = { files: {}, schemaVersion: '1.0', thresholds: { diff --git a/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts b/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts index 20f61fd7cb..4b8c448487 100644 --- a/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts +++ b/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts @@ -23,11 +23,7 @@ describe(ProgressAppendOnlyReporter.name, () => { describe('onAllMutantsMatchedWithTests() with 3 mutants to test', () => { beforeEach(() => { - sut.onAllMutantsMatchedWithTests([ - factory.matchedMutant({ runAllTests: true }), - factory.matchedMutant({ runAllTests: true }), - factory.matchedMutant({ runAllTests: true }), - ]); + sut.onAllMutantsMatchedWithTests([factory.mutantTestCoverage(), factory.mutantTestCoverage(), factory.mutantTestCoverage()]); }); it('should not show show progress directly', () => { diff --git a/packages/core/test/unit/reporters/progress-reporter.spec.ts b/packages/core/test/unit/reporters/progress-reporter.spec.ts index 8a0b9ddc30..dcd597b5cd 100644 --- a/packages/core/test/unit/reporters/progress-reporter.spec.ts +++ b/packages/core/test/unit/reporters/progress-reporter.spec.ts @@ -1,8 +1,8 @@ -import { MatchedMutant, MutantStatus } from '@stryker-mutator/api/report'; import { expect } from 'chai'; import sinon from 'sinon'; import ProgressBar from 'progress'; import { factory } from '@stryker-mutator/test-helpers'; +import { MutantStatus, MutantTestCoverage } from '@stryker-mutator/api/core'; import * as progressBarModule from '../../../src/reporters/progress-bar'; import { ProgressBarReporter } from '../../../src/reporters/progress-reporter'; @@ -16,7 +16,7 @@ const ONE_HOUR = SECOND * 3600; describe(ProgressBarReporter.name, () => { let sut: ProgressBarReporter; - let matchedMutants: MatchedMutant[]; + let mutants: MutantTestCoverage[]; let progressBar: Mock; const progressBarContent = 'Mutation testing [:bar] :percent (elapsed: :et, remaining: :etc) :tested/:total tested (:survived survived, :timedOut timed out)'; @@ -31,13 +31,13 @@ describe(ProgressBarReporter.name, () => { describe('onAllMutantsMatchedWithTests()', () => { describe('when there are 3 MatchedMutants that all contain Tests', () => { beforeEach(() => { - matchedMutants = [ - factory.matchedMutant({ runAllTests: true }), - factory.matchedMutant({ runAllTests: true }), - factory.matchedMutant({ runAllTests: true }), + mutants = [ + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ static: true }), ]; - sut.onAllMutantsMatchedWithTests(matchedMutants); + sut.onAllMutantsMatchedWithTests(mutants); }); it('the total of MatchedMutants in the progress bar should be 3', () => { @@ -46,13 +46,13 @@ describe(ProgressBarReporter.name, () => { }); describe("when there are 2 MatchedMutants that all contain Tests and 1 MatchMutant that doesn't have tests", () => { beforeEach(() => { - matchedMutants = [ - factory.matchedMutant({ testFilter: undefined }), - factory.matchedMutant({ testFilter: ['spec1'] }), - factory.matchedMutant({ testFilter: ['spec2'] }), + mutants = [ + factory.mutantTestCoverage({ coveredBy: undefined }), + factory.mutantTestCoverage({ coveredBy: ['spec1'] }), + factory.mutantTestCoverage({ coveredBy: ['spec2'] }), ]; - sut.onAllMutantsMatchedWithTests(matchedMutants); + sut.onAllMutantsMatchedWithTests(mutants); }); it('the total of MatchedMutants in the progress bar should be 2', () => { @@ -61,9 +61,9 @@ describe(ProgressBarReporter.name, () => { }); describe('when mutants match to all tests', () => { beforeEach(() => { - matchedMutants = [factory.matchedMutant({ runAllTests: true }), factory.matchedMutant({ runAllTests: true })]; + mutants = [factory.mutantTestCoverage({ static: true }), factory.mutantTestCoverage({ static: true })]; - sut.onAllMutantsMatchedWithTests(matchedMutants); + sut.onAllMutantsMatchedWithTests(mutants); }); it('the total of MatchedMutants in the progress bar should be 2', () => { @@ -76,13 +76,13 @@ describe(ProgressBarReporter.name, () => { let progressBarTickTokens: any; beforeEach(() => { - matchedMutants = [ - factory.matchedMutant({ id: '0' }), // NoCoverage - factory.matchedMutant({ id: '1', testFilter: [''] }), - factory.matchedMutant({ id: '2', runAllTests: true }), - factory.matchedMutant({ id: '3', testFilter: [''] }), + mutants = [ + factory.mutantTestCoverage({ id: '0' }), // NoCoverage + factory.mutantTestCoverage({ id: '1', coveredBy: [''] }), + factory.mutantTestCoverage({ id: '2', static: true }), + factory.mutantTestCoverage({ id: '3', coveredBy: [''] }), ]; - sut.onAllMutantsMatchedWithTests(matchedMutants); + sut.onAllMutantsMatchedWithTests(mutants); }); it('should tick the ProgressBar with 1 tested mutant, 0 survived when status is not "Survived"', () => { @@ -93,13 +93,13 @@ describe(ProgressBarReporter.name, () => { it("should not tick the ProgressBar if the result was for a mutant that wasn't matched to any tests", () => { // mutant 0 isn't matched to any tests - sut.onMutantTested(factory.invalidMutantResult({ id: '0', status: MutantStatus.CompileError })); + sut.onMutantTested(factory.mutantResult({ id: '0', status: MutantStatus.CompileError })); progressBarTickTokens = { total: 3, tested: 0, survived: 0 }; expect(progressBar.tick).to.not.have.been.called; }); it('should tick the ProgressBar with 1 survived mutant when status is "Survived"', () => { - sut.onMutantTested(factory.undetectedMutantResult({ status: MutantStatus.Survived })); + sut.onMutantTested(factory.mutantResult({ status: MutantStatus.Survived })); progressBarTickTokens = { total: 3, tested: 1, survived: 1 }; expect(progressBar.tick).to.have.been.calledWithMatch(progressBarTickTokens); }); @@ -108,16 +108,16 @@ describe(ProgressBarReporter.name, () => { describe('ProgressBar estimated time for 3 mutants', () => { beforeEach(() => { sut.onAllMutantsMatchedWithTests([ - factory.matchedMutant({ id: '1', runAllTests: true }), - factory.matchedMutant({ id: '2', runAllTests: true }), - factory.matchedMutant({ id: '3', runAllTests: true }), + factory.mutantTestCoverage({ id: '1', static: true }), + factory.mutantTestCoverage({ id: '2', static: true }), + factory.mutantTestCoverage({ id: '3', static: true }), ]); }); it('should show correct time info after ten seconds and 1 mutants tested', () => { sinon.clock.tick(TEN_SECONDS); - sut.onMutantTested(factory.killedMutantResult({ id: '1' })); + sut.onMutantTested(factory.mutantResult({ id: '1' })); expect(progressBar.tick).to.have.been.calledWithMatch({ et: '<1m', etc: '<1m' }); }); @@ -125,7 +125,7 @@ describe(ProgressBarReporter.name, () => { it('should show correct time info after a hundred seconds and 1 mutants tested', () => { sinon.clock.tick(HUNDRED_SECONDS); - sut.onMutantTested(factory.killedMutantResult({ id: '1' })); + sut.onMutantTested(factory.mutantResult({ id: '1' })); expect(progressBar.tick).to.have.been.calledWithMatch({ et: '~1m', etc: '~3m' }); }); @@ -133,7 +133,7 @@ describe(ProgressBarReporter.name, () => { it('should show correct time info after ten thousand seconds and 1 mutants tested', () => { sinon.clock.tick(TEN_THOUSAND_SECONDS); - sut.onMutantTested(factory.killedMutantResult({ id: '1' })); + sut.onMutantTested(factory.mutantResult({ id: '1' })); expect(progressBar.tick).to.have.been.calledWithMatch({ et: '~2h 46m', etc: '~5h 33m' }); }); @@ -141,7 +141,7 @@ describe(ProgressBarReporter.name, () => { it('should show correct time info after an hour and 1 mutants tested', () => { sinon.clock.tick(ONE_HOUR); - sut.onMutantTested(factory.killedMutantResult({ id: '1', status: MutantStatus.Killed })); + sut.onMutantTested(factory.mutantResult({ id: '1', status: MutantStatus.Killed })); expect(progressBar.tick).to.have.been.calledWithMatch({ et: '~1h 0m', etc: '~2h 0m' }); }); diff --git a/packages/core/test/unit/stryker.spec.ts b/packages/core/test/unit/stryker.spec.ts index da6e3c2485..d8c09b3f07 100644 --- a/packages/core/test/unit/stryker.spec.ts +++ b/packages/core/test/unit/stryker.spec.ts @@ -2,8 +2,7 @@ import { factory } from '@stryker-mutator/test-helpers'; import { expect } from 'chai'; import sinon from 'sinon'; import * as typedInject from 'typed-inject'; -import { PartialStrykerOptions, LogLevel } from '@stryker-mutator/api/core'; -import { MutantResult } from '@stryker-mutator/api/report'; +import { PartialStrykerOptions, LogLevel, MutantResult } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens } from '@stryker-mutator/api/plugin'; diff --git a/packages/core/test/unit/test-runner/command-test-runner.spec.ts b/packages/core/test/unit/test-runner/command-test-runner.spec.ts index 7a723f85d0..cac29a0b8a 100644 --- a/packages/core/test/unit/test-runner/command-test-runner.spec.ts +++ b/packages/core/test/unit/test-runner/command-test-runner.spec.ts @@ -99,7 +99,7 @@ describe(CommandTestRunner.name, () => { describe(CommandTestRunner.prototype.mutantRun.name, () => { it('should run with __ACTIVE_MUTANT__ environment variable active', async () => { const sut = createSut(undefined, 'foobarDir'); - await actMutantRun(sut, { activeMutantId: 0 }); + await actMutantRun(sut, { activeMutantId: '0' }); expect(childProcess.exec).calledWith('npm test', { cwd: 'foobarDir', env: { ...process.env, __STRYKER_ACTIVE_MUTANT__: '0' } }); }); @@ -146,7 +146,7 @@ describe(CommandTestRunner.name, () => { return resultPromise; } - async function actMutantRun(sut: CommandTestRunner = createSut(), { exitCode = 0, activeMutantId = 0 }) { + async function actMutantRun(sut: CommandTestRunner = createSut(), { exitCode = 0, activeMutantId = '0' }) { const resultPromise = sut.mutantRun({ activeMutant: factory.mutant({ id: activeMutantId }) }); await actTestProcessEnds(exitCode); return resultPromise; diff --git a/packages/core/tsconfig.src.json b/packages/core/tsconfig.src.json index 348baab125..6d9cbfe26b 100644 --- a/packages/core/tsconfig.src.json +++ b/packages/core/tsconfig.src.json @@ -6,7 +6,9 @@ "noImplicitThis": true, "strictBindCallApply": true, "resolveJsonModule": true, - "types": [] // Exclude global mocha functions for the sources + "types": [ + "node" // Exclude global mocha functions for the sources + ] }, "include": [ "src" diff --git a/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts b/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts index a69c7a3e0f..c034b92743 100644 --- a/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts +++ b/packages/jest-runner/test/integration/coverage-analysis.it.spec.ts @@ -98,7 +98,7 @@ describe('JestTestRunner coverage analysis integration', () => { const result = await sut.mutantRun( factory.mutantRunOptions({ testFilter: ['Add should be able to recognize a negative number'], - activeMutant: factory.mutant({ id: 6 }), + activeMutant: factory.mutant({ id: '6' }), sandboxFileName: resolveTestCase('src', 'Add.js'), }) ); @@ -111,7 +111,7 @@ describe('JestTestRunner coverage analysis integration', () => { const result = await sut.mutantRun( factory.mutantRunOptions({ testFilter: ['Add should be able to add two numbers', 'Circle should have a circumference of 2PI when the radius is 1'], - activeMutant: factory.mutant({ id: 6 }), // mutant inside the "isNegativeNumber" function + activeMutant: factory.mutant({ id: '6' }), // mutant inside the "isNegativeNumber" function sandboxFileName: resolveTestCase('src', 'Add.js'), }) ); @@ -237,7 +237,7 @@ describe('JestTestRunner coverage analysis integration', () => { const result = await sut.mutantRun( factory.mutantRunOptions({ testFilter: ['Add should be able to recognize a negative number'], - activeMutant: factory.mutant({ id: 21 }), + activeMutant: factory.mutant({ id: '21' }), sandboxFileName: resolveTestCase('src', 'Add.js'), }) ); @@ -250,7 +250,7 @@ describe('JestTestRunner coverage analysis integration', () => { const result = await sut.mutantRun( factory.mutantRunOptions({ testFilter: ['Add should be able to add two numbers', 'Circle should have a circumference of 2PI when the radius is 1'], - activeMutant: factory.mutant({ id: 11 }), // mutant inside the "negate" function + activeMutant: factory.mutant({ id: '11' }), // mutant inside the "negate" function sandboxFileName: resolveTestCase('src', 'Add.js'), }) ); diff --git a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts index 1fc9e79471..4390ed6322 100644 --- a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts +++ b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts @@ -137,12 +137,10 @@ describe(`${JestTestRunner.name} integration test`, () => { process.chdir(exampleProjectRoot); const jestTestRunner = createSut(); const mutantRunOptions = factory.mutantRunOptions({ - activeMutant: factory.mutant({ - id: 1, - }), + activeMutant: factory.mutant({ id: '1' }), sandboxFileName: require.resolve(path.resolve(exampleProjectRoot, 'src', 'Add.js')), }); - mutantRunOptions.activeMutant.id = 1; + mutantRunOptions.activeMutant.id = '1'; const runResult = await jestTestRunner.mutantRun(mutantRunOptions); @@ -158,7 +156,7 @@ describe(`${JestTestRunner.name} integration test`, () => { const mutantRunOptions = factory.mutantRunOptions({ sandboxFileName: require.resolve(path.resolve(exampleProjectRoot, 'src', 'Circle.js')), }); - mutantRunOptions.activeMutant.id = 11; + mutantRunOptions.activeMutant.id = '1'; const runResult = await jestTestRunner.mutantRun(mutantRunOptions); @@ -173,11 +171,11 @@ describe(`${JestTestRunner.name} integration test`, () => { const mutantRunOptions = factory.mutantRunOptions({ sandboxFileName: require.resolve(path.resolve(exampleProjectRoot, 'src', 'Add.js')), }); - mutantRunOptions.activeMutant.id = 1; + mutantRunOptions.activeMutant.id = '1'; // Act const firstResult = await jestTestRunner.mutantRun(mutantRunOptions); - mutantRunOptions.activeMutant.id = 10; + mutantRunOptions.activeMutant.id = '0'; const secondResult = await jestTestRunner.mutantRun(mutantRunOptions); // Assert diff --git a/packages/jest-runner/test/unit/jest-test-runner.spec.ts b/packages/jest-runner/test/unit/jest-test-runner.spec.ts index 257022425a..ec6b7244af 100644 --- a/packages/jest-runner/test/unit/jest-test-runner.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-runner.spec.ts @@ -452,20 +452,20 @@ describe(JestTestRunner.name, () => { it('should set the active mutant in environment variable', async () => { const sut = createSut(); - const onGoingWork = sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 25 }) })); + const onGoingWork = sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '25' }) })); expect(process.env[INSTRUMENTER_CONSTANTS.ACTIVE_MUTANT_ENV_VARIABLE]).to.equal('25'); await onGoingWork; }); it('should reset the active mutant in environment variable', async () => { const sut = createSut(); - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 25 }) })); + await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '25' }) })); expect(process.env[INSTRUMENTER_CONSTANTS.ACTIVE_MUTANT_ENV_VARIABLE]).to.equal(undefined); }); it('should set the __strykerGlobalNamespace__ in globals', async () => { const sut = createSut(); - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 25 }) })); + await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '25' }) })); expect(jestTestAdapterMock.run).calledWithMatch( sinon.match({ jestConfig: { @@ -483,7 +483,7 @@ describe(JestTestRunner.name, () => { }; options.jest.config = customConfig; const sut = createSut(); - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 25 }) })); + await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '25' }) })); expect(jestTestAdapterMock.run).calledWithMatch( sinon.match({ jestConfig: { diff --git a/packages/karma-runner/test/integration/instrumented.it.spec.ts b/packages/karma-runner/test/integration/instrumented.it.spec.ts index 11f588a9eb..e8b9b8f163 100644 --- a/packages/karma-runner/test/integration/instrumented.it.spec.ts +++ b/packages/karma-runner/test/integration/instrumented.it.spec.ts @@ -108,7 +108,7 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { describe('mutantRun', () => { it('should be able to kill a mutant', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 0 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '0' }) })); assertions.expectKilled(result); expect(result.killedBy).eq('spec0'); expect(result.failureMessage.split('\n')[0]).eq('Error: Expected undefined to be 7.'); @@ -117,7 +117,7 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { it('should survive if the filtered tests do not kill the mutant', async () => { const result = await sut.mutantRun( factory.mutantRunOptions({ - activeMutant: factory.mutant({ id: 2 }), + activeMutant: factory.mutant({ id: '2' }), testFilter: [ 'spec0', //'spec1' => would kill the mutant @@ -129,8 +129,8 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { }); it('should be able to kill again after a mutant survived', async () => { - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 11 }) })); - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 2 }), testFilter: ['spec1'] })); + await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '11' }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '2' }), testFilter: ['spec1'] })); assertions.expectKilled(result); result.failureMessage = result.failureMessage.split('\n')[0]; const expected = factory.killedMutantRunResult({ @@ -143,8 +143,8 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { }); it('should be able to clear the test filter', async () => { - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 2 }), testFilter: ['spec1'] })); - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 1 }), testFilter: undefined })); + await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '2' }), testFilter: ['spec1'] })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '1' }), testFilter: undefined })); assertions.expectKilled(result); }); }); @@ -236,14 +236,14 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { describe('mutantRun', () => { it('should be able to kill a mutant', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 0 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '0' }) })); assertions.expectKilled(result); expect(result.killedBy).eq('Add should be able to add two numbers'); expect(result.failureMessage.split('\n')[0]).eq('AssertionError: expected undefined to equal 7'); }); it('should bail after first failing test', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 0 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '0' }) })); assertions.expectKilled(result); expect(result.nrOfTests).eq(1); }); @@ -251,7 +251,7 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { it('should survive if the filtered tests do not kill the mutant', async () => { const result = await sut.mutantRun( factory.mutantRunOptions({ - activeMutant: factory.mutant({ id: 2 }), + activeMutant: factory.mutant({ id: '2' }), testFilter: [ 'Add should be able to add two numbers', //'Add should be able 1 to a number' => would kill the mutant @@ -264,9 +264,9 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { }); it('should be able to kill again after a mutant survived', async () => { - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 11 }) })); + await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '11' }) })); const result = await sut.mutantRun( - factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 2 }), testFilter: ['Add should be able 1 to a number'] }) + factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '2' }), testFilter: ['Add should be able 1 to a number'] }) ); assertions.expectKilled(result); result.failureMessage = result.failureMessage.split('\n')[0]; @@ -280,8 +280,10 @@ describe(`${KarmaTestRunner.name} running on instrumented code`, () => { }); it('should be able to clear the test filter', async () => { - await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 2 }), testFilter: ['Add should be able 1 to a number'] })); - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 1 }), testFilter: undefined })); + await sut.mutantRun( + factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '2' }), testFilter: ['Add should be able 1 to a number'] }) + ); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '1' }), testFilter: undefined })); assertions.expectKilled(result); }); }); diff --git a/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts b/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts index ef376796c3..cf69068ec0 100644 --- a/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts +++ b/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts @@ -61,12 +61,12 @@ describe(TestHooksMiddleware.name, () => { }); it('should declare the __stryker__ namespace', () => { - sut.configureActiveMutant(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 42 }) })); + sut.configureActiveMutant(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '42' }) })); expect(sut.currentTestHooks).contains('window.__stryker__ = window.__stryker__ || {}'); }); it('should set the "activeMutant" id', () => { - sut.configureActiveMutant(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 42 }) })); + sut.configureActiveMutant(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '42' }) })); expect(sut.currentTestHooks).contains('window.__stryker__.activeMutant = 42'); }); diff --git a/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts b/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts index 394bc7b114..228c5934bd 100644 --- a/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts +++ b/packages/mocha-runner/test/integration/sample-project-instrumented.it.spec.ts @@ -104,26 +104,26 @@ describe('Running an instrumented project', () => { describe('mutantRun', () => { it('should be able to survive a mutant', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 0 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '0' }) })); assertions.expectSurvived(result); }); it('should be able to kill a mutant', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 3 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '3' }) })); assertions.expectKilled(result); expect(result.killedBy).eq('MyMath should be able to add two numbers'); expect(result.failureMessage).eq('expected -3 to equal 7'); }); it('should bail after the first failed test', async () => { - const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 3 }) })); + const result = await sut.mutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '3' }) })); assertions.expectKilled(result); expect(result.nrOfTests).eq(1); }); it('should be able to kill a mutant with filtered test', async () => { const result = await sut.mutantRun( - factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 3 }), testFilter: ['MyMath should be able to add two numbers'] }) + factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '3' }), testFilter: ['MyMath should be able to add two numbers'] }) ); assertions.expectKilled(result); expect(result.killedBy).eq('MyMath should be able to add two numbers'); @@ -133,7 +133,7 @@ describe('Running an instrumented project', () => { it('should be able to survive if killer test is not filtered', async () => { const result = await sut.mutantRun( factory.mutantRunOptions({ - activeMutant: factory.mutant({ id: 3 }), + activeMutant: factory.mutant({ id: '3' }), testFilter: ['MyMath should be able negate a number', 'MyMath should be able to recognize a negative number'], }) ); diff --git a/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts b/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts index 3d51bc10ad..1343c8297e 100644 --- a/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts +++ b/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts @@ -240,7 +240,7 @@ describe(MochaTestRunner.name, () => { }); it('should active the given mutant', async () => { - await actMutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: 42 }) })); + await actMutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '42' }) })); expect(global.__stryker2__?.activeMutant).eq(42); }); From e4794a4f9669e455d1b5b32d17f5d5be1bfee055 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Mon, 1 Mar 2021 08:54:55 +0100 Subject: [PATCH 07/25] Remove `ignoreReason` in favor of optional `status` --- packages/api/src/core/mutant.ts | 12 ++++----- .../src/mutants/find-mutant-test-coverage.ts | 8 ++++-- .../src/process/4-mutation-test-executor.ts | 13 +++++----- .../reporters/mutation-test-report-helper.ts | 13 ++-------- .../mutants/find-mutant-test-coverage.spec.ts | 20 ++++++++++++--- .../process/4-mutation-test-executor.spec.ts | 12 ++++----- packages/instrumenter/src/mutant.ts | 5 ++-- .../instrumenter/test/unit/mutant.spec.ts | 25 ++++++++++++++++--- 8 files changed, 67 insertions(+), 41 deletions(-) diff --git a/packages/api/src/core/mutant.ts b/packages/api/src/core/mutant.ts index 167cb09854..a79faeb1b9 100644 --- a/packages/api/src/core/mutant.ts +++ b/packages/api/src/core/mutant.ts @@ -9,7 +9,7 @@ export { MutantStatus } from 'mutation-testing-report-schema'; /** * Represents a mutant in its initial state. */ -export interface Mutant extends Pick { +export interface Mutant extends Pick { /** * The file name from which this mutant originated */ @@ -19,14 +19,14 @@ export interface Mutant extends Pick & schema.MutantResult; +export type MutantResult = Mutant & schema.MutantResult; diff --git a/packages/core/src/mutants/find-mutant-test-coverage.ts b/packages/core/src/mutants/find-mutant-test-coverage.ts index 4b5bad7c33..929088d670 100644 --- a/packages/core/src/mutants/find-mutant-test-coverage.ts +++ b/packages/core/src/mutants/find-mutant-test-coverage.ts @@ -1,5 +1,5 @@ import { CompleteDryRunResult, TestResult } from '@stryker-mutator/api/test-runner'; -import { Mutant, CoveragePerTestId, MutantTestCoverage } from '@stryker-mutator/api/core'; +import { Mutant, CoveragePerTestId, MutantTestCoverage, MutantStatus } from '@stryker-mutator/api/core'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Logger } from '@stryker-mutator/api/logging'; @@ -25,13 +25,14 @@ function mapToMutantTestCoverage(dryRunResult: CompleteDryRunResult, mutants: re const mutantCoverage = mutants.map( (mutant): MutantTestCoverage => { - if (mutant.ignoreReason !== undefined) { + if (mutant.status) { return { ...mutant, static: false, estimatedNetTime: 0, }; } else if (!dryRunResult.mutantCoverage || dryRunResult.mutantCoverage.static[mutant.id] > 0) { + // When there is static coverage for this mutant, it is a static mutant. return { ...mutant, estimatedNetTime: timeSpentAllTests, @@ -39,6 +40,7 @@ function mapToMutantTestCoverage(dryRunResult: CompleteDryRunResult, mutants: re static: true, }; } else { + // If no static coverage, but there is test coverage, it is a non-static, covered mutant const tests = testsByMutantId.get(mutant.id); if (tests && tests.size > 0) { return { @@ -48,8 +50,10 @@ function mapToMutantTestCoverage(dryRunResult: CompleteDryRunResult, mutants: re static: false, }; } else { + // Otherwise it is has no coverage return { ...mutant, + status: MutantStatus.NoCoverage, estimatedNetTime: 0, coveredBy: [], static: false, diff --git a/packages/core/src/process/4-mutation-test-executor.ts b/packages/core/src/process/4-mutation-test-executor.ts index 31d1efcb98..9d211f7916 100644 --- a/packages/core/src/process/4-mutation-test-executor.ts +++ b/packages/core/src/process/4-mutation-test-executor.ts @@ -1,7 +1,7 @@ import { from, partition, merge, Observable } from 'rxjs'; import { toArray, map, tap, shareReplay } from 'rxjs/operators'; import { tokens, commonTokens } from '@stryker-mutator/api/plugin'; -import { MutantTestCoverage, MutantResult, StrykerOptions } from '@stryker-mutator/api/core'; +import { MutantTestCoverage, MutantResult, StrykerOptions, MutantStatus } from '@stryker-mutator/api/core'; import { MutantRunOptions, TestRunner } from '@stryker-mutator/api/test-runner'; import { Logger } from '@stryker-mutator/api/logging'; import { I } from '@stryker-mutator/util'; @@ -65,17 +65,16 @@ export class MutationTestExecutor { } private executeIgnore(input$: Observable) { - const [notIgnoredMutant$, ignoredMutant$] = partition(input$.pipe(shareReplay()), (mutant) => mutant.ignoreReason === undefined); - const ignoredResult$ = ignoredMutant$.pipe(map((mutant) => this.mutationTestReportHelper.reportMutantIgnored(mutant))); + const [ignoredMutant$, notIgnoredMutant$] = partition(input$.pipe(shareReplay()), (mutant) => mutant.status === MutantStatus.Ignored); + const ignoredResult$ = ignoredMutant$.pipe(map((mutant) => this.mutationTestReportHelper.reportMutantStatus(mutant, MutantStatus.Ignored))); return { ignoredResult$, notIgnoredMutant$ }; } private executeNoCoverage(input$: Observable) { - const [coveredMutant$, noCoverageMatchedMutant$] = partition( - input$.pipe(shareReplay()), - (mutant) => !!mutant.static || mutant.coveredBy!.length > 0 + const [noCoverageMatchedMutant$, coveredMutant$] = partition(input$.pipe(shareReplay()), (mutant) => mutant.status === MutantStatus.NoCoverage); + const noCoverageResult$ = noCoverageMatchedMutant$.pipe( + map((mutant) => this.mutationTestReportHelper.reportMutantStatus(mutant, MutantStatus.NoCoverage)) ); - const noCoverageResult$ = noCoverageMatchedMutant$.pipe(map((mutant) => this.mutationTestReportHelper.reportNoCoverage(mutant))); return { noCoverageResult$, coveredMutant$ }; } diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index d93ee24e4b..717a293cb8 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -38,19 +38,10 @@ export class MutationTestReportHelper { }); } - public reportNoCoverage(mutant: MutantTestCoverage): MutantResult { + public reportMutantStatus(mutant: MutantTestCoverage, status: MutantStatus): MutantResult { return this.reportOne({ ...mutant, - status: MutantStatus.NoCoverage, - coveredBy: [], - }); - } - - public reportMutantIgnored(mutant: MutantTestCoverage): MutantResult { - return this.reportOne({ - ...mutant, - status: MutantStatus.Ignored, - statusReason: mutant.ignoreReason, + status, }); } diff --git a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts index a33b6a85d2..d731f1831c 100644 --- a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts +++ b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts @@ -2,13 +2,13 @@ import sinon from 'sinon'; import { expect } from 'chai'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; -import { Mutant, MutantTestCoverage } from '@stryker-mutator/api/core'; +import { Mutant, MutantStatus, MutantTestCoverage } from '@stryker-mutator/api/core'; import { Reporter } from '@stryker-mutator/api/report'; import { findMutantTestCoverage as sut } from '../../../src/mutants/find-mutant-test-coverage'; import { coreTokens } from '../../../src/di'; -describe(sut.name, () => { +describe.only(sut.name, () => { let reporterMock: sinon.SinonStubbedInstance>; beforeEach(() => { @@ -24,7 +24,7 @@ describe(sut.name, () => { } it('should not match ignored mutants to any tests', () => { - const mutant = factory.mutant({ id: '2', ignoreReason: 'foo should ignore' }); + const mutant = factory.mutant({ id: '2', status: MutantStatus.Ignored, statusReason: 'foo should ignore' }); const dryRunResult = factory.completeDryRunResult({ mutantCoverage: { static: {}, perTest: { '1': { 2: 2 } } } }); // Act @@ -35,8 +35,20 @@ describe(sut.name, () => { expect(result).deep.eq(expected); }); + it('should mark mutant as "NoCoverage" when there is coverage data, but none for the specific mutant', () => { + const mutant = factory.mutant({ id: '3' }); + const dryRunResult = factory.completeDryRunResult({ mutantCoverage: { static: {}, perTest: { '1': { 2: 2 } } } }); + + // Act + const result = act(dryRunResult, [mutant]); + + // Assert + const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, status: MutantStatus.NoCoverage, static: false, coveredBy: [] }]; + expect(result).deep.eq(expected); + }); + describe('without mutant coverage data', () => { - it('should disable test filtering', () => { + it('should mark mutants as "static"', () => { // Arrange const mutant1 = factory.mutant({ id: '1' }); const mutant2 = factory.mutant({ id: '2' }); diff --git a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts index b6fa5a2c4f..7851d145aa 100644 --- a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts +++ b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts @@ -6,7 +6,7 @@ import { TestRunner, MutantRunOptions, MutantRunResult, MutantRunStatus } from ' import { Checker, CheckResult, CheckStatus } from '@stryker-mutator/api/check'; import { mergeMap } from 'rxjs/operators'; import { Observable } from 'rxjs'; -import { Mutant, MutantTestCoverage } from '@stryker-mutator/api/core'; +import { Mutant, MutantStatus, MutantTestCoverage } from '@stryker-mutator/api/core'; import { I, Task } from '@stryker-mutator/util'; import { MutationTestExecutor } from '../../../src/process'; @@ -86,8 +86,8 @@ describe(MutationTestExecutor.name, () => { it('should short circuit ignored mutants (not check them or run them)', async () => { // Arrange - mutants.push(factory.mutantTestCoverage({ id: '1', ignoreReason: '1 is ignored' })); - mutants.push(factory.mutantTestCoverage({ id: '2', ignoreReason: '2 is ignored' })); + mutants.push(factory.mutantTestCoverage({ id: '1', status: MutantStatus.Ignored, statusReason: '1 is ignored' })); + mutants.push(factory.mutantTestCoverage({ id: '2', status: MutantStatus.Ignored, statusReason: '2 is ignored' })); // Act const actualResults = await sut.execute(); @@ -177,13 +177,13 @@ describe(MutationTestExecutor.name, () => { it('should report an ignored mutant as `Ignored`', async () => { // Arrange arrangeScenario(); - mutants.push(factory.mutantTestCoverage({ id: '1', ignoreReason: '1 is ignored' })); + mutants.push(factory.mutantTestCoverage({ id: '1', status: MutantStatus.Ignored, statusReason: '1 is ignored' })); // Act await sut.execute(); // Assert - expect(mutationTestReportCalculatorMock.reportMutantIgnored).calledWithExactly(mutants[0]); + expect(mutationTestReportCalculatorMock.reportMutantStatus).calledWithExactly(mutants[0], MutantStatus.Ignored); }); it('should report an uncovered mutant with `NoCoverage`', async () => { @@ -195,7 +195,7 @@ describe(MutationTestExecutor.name, () => { await sut.execute(); // Assert - expect(mutationTestReportCalculatorMock.reportNoCoverage).calledWithExactly(mutants[0]); + expect(mutationTestReportCalculatorMock.reportMutantStatus).calledWithExactly(mutants[0], MutantStatus.NoCoverage); }); it('should report non-passed check results as "checkFailed"', async () => { diff --git a/packages/instrumenter/src/mutant.ts b/packages/instrumenter/src/mutant.ts index 0ad89da572..619ed1ffb1 100644 --- a/packages/instrumenter/src/mutant.ts +++ b/packages/instrumenter/src/mutant.ts @@ -1,6 +1,6 @@ import { types } from '@babel/core'; import generate from '@babel/generator'; -import { Mutant as ApiMutant, Location, Position } from '@stryker-mutator/api/core'; +import { Mutant as ApiMutant, Location, Position, MutantStatus } from '@stryker-mutator/api/core'; export interface NodeMutation { replacement: types.Node; @@ -34,7 +34,8 @@ export class Mutant { mutatorName: this.mutatorName, range: [this.original.start!, this.original.end!], replacement: this.replacementCode, - ignoreReason: this.ignoreReason, + statusReason: this.ignoreReason, + status: this.ignoreReason ? MutantStatus.Ignored : undefined, }; } } diff --git a/packages/instrumenter/test/unit/mutant.spec.ts b/packages/instrumenter/test/unit/mutant.spec.ts index e85492386d..6ed81a3f55 100644 --- a/packages/instrumenter/test/unit/mutant.spec.ts +++ b/packages/instrumenter/test/unit/mutant.spec.ts @@ -1,6 +1,6 @@ import { types } from '@babel/core'; -import { Mutant as MutantApi } from '@stryker-mutator/api/core'; +import { Mutant as MutantApi, MutantStatus } from '@stryker-mutator/api/core'; import { expect } from 'chai'; @@ -26,7 +26,7 @@ describe(Mutant.name, () => { }); describe(Mutant.prototype.toApiMutant.name, () => { - it('should map all properties as expected', () => { + it('should map all properties as expected for an ignored mutant', () => { const mutant = new Mutant(2, 'file.js', { original: types.stringLiteral(''), replacement: types.stringLiteral('Stryker was here!'), @@ -39,7 +39,26 @@ describe(Mutant.name, () => { id: '2', mutatorName: 'fooMutator', replacement: '"Stryker was here!"', - ignoreReason: 'ignore', + statusReason: 'ignore', + status: MutantStatus.Ignored, + }; + expect(mutant.toApiMutant()).deep.include(expected); + }); + + it('should map all properties as expected for a placed mutant', () => { + const mutant = new Mutant(2, 'file.js', { + original: types.stringLiteral(''), + replacement: types.stringLiteral('Stryker was here!'), + mutatorName: 'fooMutator', + }); + mutant.original.loc = { start: { column: 0, line: 0 }, end: { column: 0, line: 0 } }; + const expected: Partial = { + fileName: 'file.js', + id: '2', + mutatorName: 'fooMutator', + replacement: '"Stryker was here!"', + statusReason: undefined, + status: undefined, }; expect(mutant.toApiMutant()).deep.include(expected); }); From 016e691763ab33c7724e641179c4925355c20ec6 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Thu, 4 Mar 2021 08:00:13 +0100 Subject: [PATCH 08/25] Fix all unit tests --- .../src/mutants/find-mutant-test-coverage.ts | 3 +- .../core/src/reporters/clear-text-reporter.ts | 7 +- .../core/src/reporters/progress-keeper.ts | 10 +- .../mutants/find-mutant-test-coverage.spec.ts | 22 ++-- .../process/4-mutation-test-executor.spec.ts | 4 +- .../reporters/clear-text-reporter.spec.ts | 82 +++++++------- .../progress-append-only-reporter.spec.ts | 6 +- .../unit/reporters/progress-reporter.spec.ts | 103 ++++++++---------- 8 files changed, 116 insertions(+), 121 deletions(-) diff --git a/packages/core/src/mutants/find-mutant-test-coverage.ts b/packages/core/src/mutants/find-mutant-test-coverage.ts index 929088d670..0f2fae51e5 100644 --- a/packages/core/src/mutants/find-mutant-test-coverage.ts +++ b/packages/core/src/mutants/find-mutant-test-coverage.ts @@ -1,5 +1,5 @@ import { CompleteDryRunResult, TestResult } from '@stryker-mutator/api/test-runner'; -import { Mutant, CoveragePerTestId, MutantTestCoverage, MutantStatus } from '@stryker-mutator/api/core'; +import { Mutant, CoveragePerTestId, MutantTestCoverage } from '@stryker-mutator/api/core'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Logger } from '@stryker-mutator/api/logging'; @@ -53,7 +53,6 @@ function mapToMutantTestCoverage(dryRunResult: CompleteDryRunResult, mutants: re // Otherwise it is has no coverage return { ...mutant, - status: MutantStatus.NoCoverage, estimatedNetTime: 0, coveredBy: [], static: false, diff --git a/packages/core/src/reporters/clear-text-reporter.ts b/packages/core/src/reporters/clear-text-reporter.ts index 7010410cfa..bb9af1ffa3 100644 --- a/packages/core/src/reporters/clear-text-reporter.ts +++ b/packages/core/src/reporters/clear-text-reporter.ts @@ -48,8 +48,7 @@ export class ClearTextReporter implements Reporter { const reportMutants = (metrics: MetricsResult[]) => { metrics.forEach((child) => { - const file = child.file; - file?.mutants.forEach((result) => { + child.file?.mutants.forEach((result) => { totalTests += result.testsCompleted ?? 0; switch (result.status) { case MutantStatus.Killed: @@ -97,8 +96,8 @@ export class ClearTextReporter implements Reporter { } else if (result.coveredByTests) { this.logExecutedTests(result.coveredByTests, logImplementation); } - } else if (result.status === MutantStatus.Killed) { - logImplementation(`Killed by: ${result.killedBy}`); + } else if (result.status === MutantStatus.Killed && result.killedByTests && result.killedByTests.length) { + logImplementation(`Killed by: ${result.killedByTests[0].name}`); } else if (result.status === MutantStatus.RuntimeError || result.status === MutantStatus.CompileError) { logImplementation(`Error message: ${result.statusReason}`); } diff --git a/packages/core/src/reporters/progress-keeper.ts b/packages/core/src/reporters/progress-keeper.ts index 2bae67b49b..d4cb0ca559 100644 --- a/packages/core/src/reporters/progress-keeper.ts +++ b/packages/core/src/reporters/progress-keeper.ts @@ -3,9 +3,12 @@ import { Reporter } from '@stryker-mutator/api/report'; import { Timer } from '../utils/timer'; +function mutantHasCoverage(mutant: Pick) { + return !!mutant.static || !!mutant.coveredBy?.length; +} + export abstract class ProgressKeeper implements Reporter { private timer!: Timer; - private mutantIdsWithoutCoverage!: string[]; protected progress = { survived: 0, timedOut: 0, @@ -15,12 +18,11 @@ export abstract class ProgressKeeper implements Reporter { public onAllMutantsMatchedWithTests(mutants: readonly MutantTestCoverage[]): void { this.timer = new Timer(); - this.mutantIdsWithoutCoverage = mutants.filter((m) => !m.static && !m.coveredBy?.length).map((m) => m.id); - this.progress.total = mutants.length - this.mutantIdsWithoutCoverage.length; + this.progress.total = mutants.filter(mutantHasCoverage).length; } public onMutantTested(result: MutantResult): void { - if (!this.mutantIdsWithoutCoverage.some((id) => result.id === id)) { + if (mutantHasCoverage(result)) { this.progress.tested++; } if (result.status === MutantStatus.Survived) { diff --git a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts index d731f1831c..5bf141a79f 100644 --- a/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts +++ b/packages/core/test/unit/mutants/find-mutant-test-coverage.spec.ts @@ -8,7 +8,7 @@ import { Reporter } from '@stryker-mutator/api/report'; import { findMutantTestCoverage as sut } from '../../../src/mutants/find-mutant-test-coverage'; import { coreTokens } from '../../../src/di'; -describe.only(sut.name, () => { +describe(sut.name, () => { let reporterMock: sinon.SinonStubbedInstance>; beforeEach(() => { @@ -31,7 +31,7 @@ describe.only(sut.name, () => { const result = act(dryRunResult, [mutant]); // Assert - const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, static: false, coveredBy: undefined }]; + const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, static: false }]; expect(result).deep.eq(expected); }); @@ -43,7 +43,7 @@ describe.only(sut.name, () => { const result = act(dryRunResult, [mutant]); // Assert - const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, status: MutantStatus.NoCoverage, static: false, coveredBy: [] }]; + const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, static: false, coveredBy: [] }]; expect(result).deep.eq(expected); }); @@ -85,8 +85,8 @@ describe.only(sut.name, () => { it('should report onAllMutantsMatchedWithTests', () => { // Arrange const mutants = [ - factory.mutant({ id: '1', fileName: 'foo.js', mutatorName: 'fooMutator', replacement: '<=' }), - factory.mutant({ id: '2', fileName: 'bar.js', mutatorName: 'barMutator', replacement: '{}' }), + factory.mutant({ id: '1', fileName: 'foo.js', mutatorName: 'fooMutator', replacement: '<=', range: [0, 1] }), + factory.mutant({ id: '2', fileName: 'bar.js', mutatorName: 'barMutator', replacement: '{}', range: [2, 3] }), ]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult({ timeSpentMs: 20 }), factory.successTestResult({ timeSpentMs: 22 })], @@ -105,6 +105,7 @@ describe.only(sut.name, () => { replacement: '<=', static: true, estimatedNetTime: 42, + range: [0, 1], }), factory.mutantTestCoverage({ id: '2', @@ -113,6 +114,7 @@ describe.only(sut.name, () => { replacement: '{}', static: true, estimatedNetTime: 42, + range: [2, 3], }), ]); }); @@ -132,7 +134,7 @@ describe.only(sut.name, () => { const result = act(dryRunResult, mutants); // Assert - const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, static: true }]; + const expected: MutantTestCoverage[] = [{ ...mutant, estimatedNetTime: 0, static: true, coveredBy: undefined }]; expect(result).deep.eq(expected); }); @@ -152,12 +154,12 @@ describe.only(sut.name, () => { expect(result[0].estimatedNetTime).eq(42); }); - it('should report onAllMutantsMatchedWithTests with correct `runAllTests` value', () => { + it('should report onAllMutantsMatchedWithTests with correct `static` value', () => { // Arrange const mutants = [factory.mutant({ id: '1' }), factory.mutant({ id: '2' })]; const dryRunResult = factory.completeDryRunResult({ tests: [factory.successTestResult()], - mutantCoverage: { static: { 1: 1 }, perTest: {} }, + mutantCoverage: { static: { 1: 1 }, perTest: {} }, // mutant 2 has no coverage }); // Act @@ -172,7 +174,7 @@ describe.only(sut.name, () => { const expectedSecondMatch: Partial = { id: '2', static: false, - coveredBy: undefined, + coveredBy: [], }; expect(reporterMock.onAllMutantsMatchedWithTests).calledWithMatch([sinon.match(expectedFirstMatch), sinon.match(expectedSecondMatch)]); }); @@ -262,7 +264,7 @@ describe.only(sut.name, () => { // Assert expect(actualMatches.find((mutant) => mutant.id === '1')?.coveredBy).deep.eq(['spec1']); - expect(actualMatches.find((mutant) => mutant.id === '2')?.coveredBy).undefined; + expect(actualMatches.find((mutant) => mutant.id === '2')?.coveredBy).lengthOf(0); expect(testInjector.logger.debug).calledWith( 'Found test with id "spec2" in coverage data, but not in the test results of the dry run. Not taking coverage data for this test into account' ); diff --git a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts index 7851d145aa..a4e75f4ef8 100644 --- a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts +++ b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts @@ -165,7 +165,7 @@ describe(MutationTestExecutor.name, () => { it('should not run mutants that are uncovered by tests', async () => { // Arrange arrangeScenario(); - mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined, static: false })); + mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined, static: false, status: MutantStatus.NoCoverage })); // Act await sut.execute(); @@ -189,7 +189,7 @@ describe(MutationTestExecutor.name, () => { it('should report an uncovered mutant with `NoCoverage`', async () => { // Arrange arrangeScenario(); - mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined })); + mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined, status: MutantStatus.NoCoverage })); // Act await sut.execute(); diff --git a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts index 365197f857..3138263615 100644 --- a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts +++ b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts @@ -18,10 +18,40 @@ describe(ClearTextReporter.name, () => { sut = testInjector.injector.injectClass(ClearTextReporter); }); - describe('onMutationTestReportReady', () => { + describe(ClearTextReporter.prototype.onMutationTestReportReady.name, () => { + let report: schema.MutationTestResult; + let mutant: schema.MutantResult; + + beforeEach(() => { + mutant = factory.mutationTestReportSchemaMutantResult({ + id: '1', + location: { start: { line: 2, column: 1 }, end: { line: 2, column: 4 } }, + replacement: 'bar', + mutatorName: 'Math', + }); + report = factory.mutationTestReportSchemaMutationTestResult({ + files: { + 'foo.js': factory.mutationTestReportSchemaFileResult({ + source: '\nfoo\n', + mutants: [mutant], + }), + }, + testFiles: { + 'foo.spec.js': factory.mutationTestReportSchemaTestFile({ + tests: [ + factory.mutationTestReportSchemaTestDefinition({ id: '1', name: 'foo should be bar' }), + factory.mutationTestReportSchemaTestDefinition({ id: '2', name: 'bar should be baz' }), + factory.mutationTestReportSchemaTestDefinition({ id: '3', name: 'baz should be qux' }), + factory.mutationTestReportSchemaTestDefinition({ id: '4', name: 'qux should be quux' }), + factory.mutationTestReportSchemaTestDefinition({ id: '5', name: 'quux should be corge' }), + ], + }), + }, + }); + }); + it('should report the clear text table with correct values', () => { testInjector.options.coverageAnalysis = 'all'; - sut = testInjector.injector.injectClass(ClearTextReporter); sut.onMutationTestReportReady({ files: { @@ -43,7 +73,7 @@ describe(ClearTextReporter.name, () => { thresholds: factory.mutationScoreThresholds({}), }); - const serializedTable: string = stdoutStub.getCall(0).args[0]; + const serializedTable: string = stdoutStub.getCalls().pop()!.args[0]; const rows = serializedTable.split(os.EOL); expect(rows).to.deep.eq([ '----------|---------|----------|-----------|------------|----------|---------|', @@ -59,8 +89,8 @@ describe(ClearTextReporter.name, () => { it('should not color score if `allowConsoleColors` config is false', () => { testInjector.options.allowConsoleColors = false; chalk.level = 1; + sut = testInjector.injector.injectClass(ClearTextReporter); // recreate, `allowConsoleColors` is read in constructor - sut = testInjector.injector.injectClass(ClearTextReporter); sut.onMutationTestReportReady({ files: {}, schemaVersion: '1.0', @@ -69,41 +99,10 @@ describe(ClearTextReporter.name, () => { expect(chalk.level).to.eq(0); }); - }); - - describe(ClearTextReporter.prototype.onMutationTestReportReady.name, () => { - let report: schema.MutationTestResult; - let mutant: schema.MutantResult; - - beforeEach(() => { - mutant = factory.mutationTestReportSchemaMutantResult({ - location: { start: { line: 2, column: 1 }, end: { line: 2, column: 4 } }, - replacement: 'bar', - mutatorName: 'Math', - }); - report = factory.mutationTestReportSchemaMutationTestResult({ - files: { - 'foo.js': factory.mutationTestReportSchemaFileResult({ - source: '\nfoo\n', - mutants: [mutant], - }), - }, - testFiles: { - 'foo.spec.js': factory.mutationTestReportSchemaTestFile({ - tests: [ - factory.mutationTestReportSchemaTestDefinition({ id: '1', name: 'foo should be bar' }), - factory.mutationTestReportSchemaTestDefinition({ id: '2', name: 'bar should be baz' }), - factory.mutationTestReportSchemaTestDefinition({ id: '3', name: 'baz should be qux' }), - factory.mutationTestReportSchemaTestDefinition({ id: '4', name: 'qux should be quux' }), - factory.mutationTestReportSchemaTestDefinition({ id: '5', name: 'quux should be corge' }), - ], - }), - }, - }); - }); it('should report a killed mutant to debug', async () => { mutant.status = MutantStatus.Killed; + mutant.killedBy = ['1']; sut.onMutationTestReportReady(report); expect(testInjector.logger.debug).calledWithMatch(sinon.match('1. [Killed] Math')); expect(testInjector.logger.debug).calledWith(`${chalk.red('- foo')}`); @@ -132,13 +131,13 @@ describe(ClearTextReporter.name, () => { it('should report a Survived mutant to stdout', async () => { mutant.status = MutantStatus.Survived; sut.onMutationTestReportReady(report); - expect(stdoutStub).calledWithMatch(sinon.match('42. [Survived] Math')); + expect(stdoutStub).calledWithMatch(sinon.match('1. [Survived] Math')); }); it('should report a Timeout mutant to stdout', async () => { mutant.status = MutantStatus.Timeout; sut.onMutationTestReportReady(report); - expect(testInjector.logger.debug).calledWithMatch(sinon.match('42. [TimedOut] Math')); + expect(testInjector.logger.debug).calledWithMatch(sinon.match('1. [Timeout] Math')); }); it('should report the tests ran for a Survived mutant to stdout for "perTest" coverage analysis', async () => { @@ -158,8 +157,8 @@ describe(ClearTextReporter.name, () => { sut.onMutationTestReportReady(report); expect(stdoutStub).calledWithExactly(`Tests ran:${os.EOL}`); expect(stdoutStub).calledWithExactly(` foo should be bar${os.EOL}`); - expect(stdoutStub).calledWithExactly(` baz should be qux${os.EOL}`); - expect(stdoutStub).not.calledWithMatch(sinon.match('quux should be corge')); + expect(stdoutStub).calledWithExactly(` bar should be baz${os.EOL}`); + expect(stdoutStub).not.calledWithMatch(sinon.match('baz should be qux')); expect(stdoutStub).calledWithExactly(` and 1 more test!${os.EOL}`); }); @@ -203,12 +202,11 @@ describe(ClearTextReporter.name, () => { testInjector.options.allowConsoleColors = false; mutant.status = MutantStatus.Survived; mutant.location.start = { line: 4, column: 6 }; - sut.onMutationTestReportReady(report); // Recreate, color setting is set in constructor sut = testInjector.injector.injectClass(ClearTextReporter); sut.onMutationTestReportReady(report); - expect(testInjector.logger.debug).calledWithMatch(sinon.match('foo.js:4:6')); + expect(stdoutStub).calledWithMatch(sinon.match('foo.js:4:6')); }); }); }); diff --git a/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts b/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts index 4b8c448487..2d7682193e 100644 --- a/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts +++ b/packages/core/test/unit/reporters/progress-append-only-reporter.spec.ts @@ -23,7 +23,11 @@ describe(ProgressAppendOnlyReporter.name, () => { describe('onAllMutantsMatchedWithTests() with 3 mutants to test', () => { beforeEach(() => { - sut.onAllMutantsMatchedWithTests([factory.mutantTestCoverage(), factory.mutantTestCoverage(), factory.mutantTestCoverage()]); + sut.onAllMutantsMatchedWithTests([ + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ coveredBy: ['1'] }), + factory.mutantTestCoverage({ static: true }), + ]); }); it('should not show show progress directly', () => { diff --git a/packages/core/test/unit/reporters/progress-reporter.spec.ts b/packages/core/test/unit/reporters/progress-reporter.spec.ts index dcd597b5cd..bc85faaa8d 100644 --- a/packages/core/test/unit/reporters/progress-reporter.spec.ts +++ b/packages/core/test/unit/reporters/progress-reporter.spec.ts @@ -29,46 +29,38 @@ describe(ProgressBarReporter.name, () => { }); describe('onAllMutantsMatchedWithTests()', () => { - describe('when there are 3 MatchedMutants that all contain Tests', () => { - beforeEach(() => { - mutants = [ - factory.mutantTestCoverage({ static: true }), - factory.mutantTestCoverage({ static: true }), - factory.mutantTestCoverage({ static: true }), - ]; - - sut.onAllMutantsMatchedWithTests(mutants); - }); - - it('the total of MatchedMutants in the progress bar should be 3', () => { - expect(progressBarModule.ProgressBar).to.have.been.calledWithMatch(progressBarContent, { total: 3 }); - }); + it('should show a progress bar for 3 mutants with 3 static mutants ', () => { + mutants = [ + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ static: true }), + ]; + + sut.onAllMutantsMatchedWithTests(mutants); + + expect(progressBarModule.ProgressBar).calledWithMatch(progressBarContent, { total: 3 }); }); - describe("when there are 2 MatchedMutants that all contain Tests and 1 MatchMutant that doesn't have tests", () => { - beforeEach(() => { - mutants = [ - factory.mutantTestCoverage({ coveredBy: undefined }), - factory.mutantTestCoverage({ coveredBy: ['spec1'] }), - factory.mutantTestCoverage({ coveredBy: ['spec2'] }), - ]; - - sut.onAllMutantsMatchedWithTests(mutants); - }); - - it('the total of MatchedMutants in the progress bar should be 2', () => { - expect(progressBarModule.ProgressBar).to.have.been.calledWithMatch(progressBarContent, { total: 2 }); - }); + + it('should show a progress bar for 2 mutants when 3 mutants are presented of which 2 have coverage', () => { + mutants = [ + factory.mutantTestCoverage({ coveredBy: undefined }), + factory.mutantTestCoverage({ coveredBy: ['spec1'] }), + factory.mutantTestCoverage({ coveredBy: ['spec2'] }), + ]; + + sut.onAllMutantsMatchedWithTests(mutants); + expect(progressBarModule.ProgressBar).calledWithMatch(progressBarContent, { total: 2 }); }); - describe('when mutants match to all tests', () => { - beforeEach(() => { - mutants = [factory.mutantTestCoverage({ static: true }), factory.mutantTestCoverage({ static: true })]; - sut.onAllMutantsMatchedWithTests(mutants); - }); + it('should show a progress bar of 2 mutants when 3 mutants are presented of which 1 is static and 1 has coverage', () => { + mutants = [ + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ coveredBy: ['spec1'] }), + factory.mutantTestCoverage({ static: false, coveredBy: undefined }), + ]; - it('the total of MatchedMutants in the progress bar should be 2', () => { - expect(progressBarModule.ProgressBar).to.have.been.calledWithMatch(progressBarContent, { total: 2 }); - }); + sut.onAllMutantsMatchedWithTests(mutants); + expect(progressBarModule.ProgressBar).calledWithMatch(progressBarContent, { total: 2 }); }); }); @@ -77,10 +69,10 @@ describe(ProgressBarReporter.name, () => { beforeEach(() => { mutants = [ - factory.mutantTestCoverage({ id: '0' }), // NoCoverage - factory.mutantTestCoverage({ id: '1', coveredBy: [''] }), - factory.mutantTestCoverage({ id: '2', static: true }), - factory.mutantTestCoverage({ id: '3', coveredBy: [''] }), + factory.mutantTestCoverage({ coveredBy: undefined, static: false }), // NoCoverage + factory.mutantTestCoverage({ coveredBy: [''] }), + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ coveredBy: [''] }), ]; sut.onAllMutantsMatchedWithTests(mutants); }); @@ -88,62 +80,61 @@ describe(ProgressBarReporter.name, () => { it('should tick the ProgressBar with 1 tested mutant, 0 survived when status is not "Survived"', () => { sut.onMutantTested(factory.killedMutantResult()); progressBarTickTokens = { total: 3, tested: 1, survived: 0 }; - expect(progressBar.tick).to.have.been.calledWithMatch(progressBarTickTokens); + expect(progressBar.tick).calledWithMatch(progressBarTickTokens); }); it("should not tick the ProgressBar if the result was for a mutant that wasn't matched to any tests", () => { - // mutant 0 isn't matched to any tests - sut.onMutantTested(factory.mutantResult({ id: '0', status: MutantStatus.CompileError })); + sut.onMutantTested(factory.mutantResult({ coveredBy: undefined, static: false })); progressBarTickTokens = { total: 3, tested: 0, survived: 0 }; expect(progressBar.tick).to.not.have.been.called; }); it('should tick the ProgressBar with 1 survived mutant when status is "Survived"', () => { - sut.onMutantTested(factory.mutantResult({ status: MutantStatus.Survived })); + sut.onMutantTested(factory.mutantResult({ static: true, status: MutantStatus.Survived })); progressBarTickTokens = { total: 3, tested: 1, survived: 1 }; - expect(progressBar.tick).to.have.been.calledWithMatch(progressBarTickTokens); + expect(progressBar.tick).calledWithMatch(progressBarTickTokens); }); }); describe('ProgressBar estimated time for 3 mutants', () => { beforeEach(() => { sut.onAllMutantsMatchedWithTests([ - factory.mutantTestCoverage({ id: '1', static: true }), - factory.mutantTestCoverage({ id: '2', static: true }), - factory.mutantTestCoverage({ id: '3', static: true }), + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ static: true }), + factory.mutantTestCoverage({ static: true }), ]); }); it('should show correct time info after ten seconds and 1 mutants tested', () => { sinon.clock.tick(TEN_SECONDS); - sut.onMutantTested(factory.mutantResult({ id: '1' })); + sut.onMutantTested(factory.mutantResult({ static: true })); - expect(progressBar.tick).to.have.been.calledWithMatch({ et: '<1m', etc: '<1m' }); + expect(progressBar.tick).calledWithMatch({ et: '<1m', etc: '<1m' }); }); it('should show correct time info after a hundred seconds and 1 mutants tested', () => { sinon.clock.tick(HUNDRED_SECONDS); - sut.onMutantTested(factory.mutantResult({ id: '1' })); + sut.onMutantTested(factory.mutantResult({ static: true })); - expect(progressBar.tick).to.have.been.calledWithMatch({ et: '~1m', etc: '~3m' }); + expect(progressBar.tick).calledWithMatch({ et: '~1m', etc: '~3m' }); }); it('should show correct time info after ten thousand seconds and 1 mutants tested', () => { sinon.clock.tick(TEN_THOUSAND_SECONDS); - sut.onMutantTested(factory.mutantResult({ id: '1' })); + sut.onMutantTested(factory.mutantResult({ static: true })); - expect(progressBar.tick).to.have.been.calledWithMatch({ et: '~2h 46m', etc: '~5h 33m' }); + expect(progressBar.tick).calledWithMatch({ et: '~2h 46m', etc: '~5h 33m' }); }); it('should show correct time info after an hour and 1 mutants tested', () => { sinon.clock.tick(ONE_HOUR); - sut.onMutantTested(factory.mutantResult({ id: '1', status: MutantStatus.Killed })); + sut.onMutantTested(factory.mutantResult({ status: MutantStatus.Killed })); - expect(progressBar.tick).to.have.been.calledWithMatch({ et: '~1h 0m', etc: '~2h 0m' }); + expect(progressBar.tick).calledWithMatch({ et: '~1h 0m', etc: '~2h 0m' }); }); }); }); From c36fc6345d74e263cc2790d654695341360fa50f Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Thu, 4 Mar 2021 08:33:04 +0100 Subject: [PATCH 09/25] Re-enable unity tests for `MutationTestReportHelper` --- .../reporters/mutation-test-report-helper.ts | 15 +- .../mutation-test-report-helper.spec.ts | 829 +++++++++--------- packages/test-helpers/src/factory.ts | 4 +- 3 files changed, 413 insertions(+), 435 deletions(-) diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index 717a293cb8..908bea38bf 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -17,7 +17,7 @@ import { setExitCode } from '../utils/object-utils'; * A helper class to convert and report mutants that survived or get killed */ export class MutationTestReportHelper { - private readonly testNamesById: Map; + public readonly testNamesById: Map; public static inject = tokens(coreTokens.reporter, commonTokens.options, coreTokens.inputFiles, commonTokens.logger, coreTokens.dryRunResult); constructor( @@ -45,29 +45,30 @@ export class MutationTestReportHelper { }); } - public reportMutantRunResult(mutantWithTestCoverage: MutantTestCoverage, result: MutantRunResult): MutantResult { + public reportMutantRunResult(mutant: MutantTestCoverage, result: MutantRunResult): MutantResult { switch (result.status) { case MutantRunStatus.Error: return this.reportOne({ - ...mutantWithTestCoverage, + ...mutant, status: MutantStatus.RuntimeError, statusReason: result.errorMessage, }); case MutantRunStatus.Killed: return this.reportOne({ - ...mutantWithTestCoverage, + ...mutant, status: MutantStatus.Killed, testsCompleted: result.nrOfTests, - killedBy: [this.testNamesById.get(result.killedBy)!], + killedBy: [result.killedBy], + statusReason: result.failureMessage, }); case MutantRunStatus.Timeout: return this.reportOne({ - ...mutantWithTestCoverage, + ...mutant, status: MutantStatus.Timeout, }); case MutantRunStatus.Survived: return this.reportOne({ - ...mutantWithTestCoverage, + ...mutant, status: MutantStatus.Survived, testsCompleted: result.nrOfTests, }); diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index c8fdb3e4e6..1155f58b98 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -1,426 +1,403 @@ -// import sinon from 'sinon'; -// import { File, Location, Range } from '@stryker-mutator/api/core'; -// import { Reporter } from '@stryker-mutator/api/report'; -// import { factory, testInjector } from '@stryker-mutator/test-helpers'; -// import { expect } from 'chai'; -// import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; -// import { CheckStatus } from '@stryker-mutator/api/check'; - -// import { coreTokens } from '../../../src/di'; -// import { InputFileCollection } from '../../../src/input/input-file-collection'; -// import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; -// import * as objectUtils from '../../../src/utils/object-utils'; - -// describe(MutationTestReportHelper.name, () => { -// let reporterMock: sinon.SinonStubbedInstance>; -// let inputFiles: InputFileCollection; -// let files: File[]; -// let setExitCodeStub: sinon.SinonStub; -// let dryRunResult: CompleteDryRunResult; - -// beforeEach(() => { -// reporterMock = factory.reporter(); -// setExitCodeStub = sinon.stub(objectUtils, 'setExitCode'); -// files = []; -// inputFiles = { -// files, -// filesToMutate: [], -// // eslint-disable-next-line @typescript-eslint/no-empty-function -// logFiles: () => {}, -// }; -// dryRunResult = factory.completeDryRunResult(); -// }); - -// function createSut() { -// return testInjector.injector -// .provideValue(coreTokens.reporter, reporterMock) -// .provideValue(coreTokens.inputFiles, inputFiles) -// .provideValue(coreTokens.dryRunResult, dryRunResult) -// .injectClass(MutationTestReportHelper); -// } - -// describe(MutationTestReportHelper.prototype.reportAll.name, () => { -// let sut: MutationTestReportHelper; - -// beforeEach(() => { -// sut = createSut(); -// }); - -// it('should report "mutationTestReportReady"', () => { -// sut.reportAll([]); -// expect(reporterMock.onMutationTestReportReady).calledOnce; -// }); - -// it('should report "onAllMutantsTested"', () => { -// sut.reportAll([]); -// expect(reporterMock.onAllMutantsTested).calledOnce; -// }); - -// it('should report "onAllMutantsTested" before mutationTestReportReady', () => { -// sut.reportAll([]); -// expect(reporterMock.onAllMutantsTested).calledBefore(reporterMock.onMutationTestReportReady); -// }); - -// it('should copy thresholds', () => { -// const actualReport = actReportAll(); -// expect(actualReport.thresholds).eq(testInjector.options.thresholds); -// }); - -// it('should set correct schema version', () => { -// const actualReport = actReportAll(); -// expect(actualReport.schemaVersion).eq('1.0'); -// }); - -// it('should correctly map file properties', () => { -// // Arrange -// files.push(new File('foo.js', 'foo content')); -// files.push(new File('bar.html', 'bar content')); -// files.push(new File('baz.vue', 'baz content')); -// files.push(new File('qux.ts', 'qux content')); -// files.push(new File('corge.tsx', 'corge content')); -// const inputMutants = files.map((file) => factory.killedMutantResult({ fileName: file.name })); - -// // Act -// const actualReport = actReportAll(inputMutants); - -// // Assert -// expect(Object.keys(actualReport.files)).lengthOf(5); -// expect(actualReport.files['foo.js']).include({ language: 'javascript', source: 'foo content' }); -// expect(actualReport.files['bar.html']).include({ language: 'html', source: 'bar content' }); -// expect(actualReport.files['baz.vue']).include({ language: 'html', source: 'baz content' }); -// expect(actualReport.files['qux.ts']).include({ language: 'typescript', source: 'qux content' }); -// expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); -// }); - -// it('should correctly map basic MutantResult properties', () => { -// // Arrange -// const inputMutants = [ -// factory.killedMutantResult({ -// id: '1', -// mutatorName: 'Foo', -// replacement: 'foo replacement', -// fileName: 'foo.js', -// status: MutantStatus.Killed, -// }), -// factory.undetectedMutantResult({ -// fileName: 'bar.js', -// status: MutantStatus.NoCoverage, -// }), -// factory.invalidMutantResult({ -// fileName: 'baz.js', -// status: MutantStatus.RuntimeError, -// }), -// factory.undetectedMutantResult({ -// fileName: 'qux.js', -// status: MutantStatus.Survived, -// }), -// factory.timeoutMutantResult({ -// fileName: '5.js', -// status: MutantStatus.TimedOut, -// }), -// factory.invalidMutantResult({ -// fileName: '6.js', -// status: MutantStatus.CompileError, -// }), -// ]; -// files.push(...inputMutants.map((m) => new File(m.fileName, ''))); - -// // Act -// const actualReport = actReportAll(inputMutants); - -// // Assert -// expect(Object.keys(actualReport.files)).lengthOf(6); -// expect(actualReport.files['foo.js'].mutants[0]).include({ -// id: '1', -// mutatorName: 'Foo', -// replacement: 'foo replacement', -// status: mutationTestReportMutantStatus.Killed, -// }); -// expect(actualReport.files['bar.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.NoCoverage }); -// expect(actualReport.files['baz.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.RuntimeError }); -// expect(actualReport.files['qux.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.Survived }); -// expect(actualReport.files['5.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.Timeout }); -// expect(actualReport.files['6.js'].mutants[0]).include({ status: mutationTestReportMutantStatus.CompileError }); -// }); - -// it('should offset location correctly', () => { -// const inputMutants = [factory.killedMutantResult({ location: { end: { line: 3, column: 4 }, start: { line: 1, column: 2 } } })]; -// files.push(...inputMutants.map((m) => new File(m.fileName, ''))); -// const actualReport = actReportAll(inputMutants); -// expect(actualReport.files['file.js'].mutants[0].location).deep.eq({ end: { line: 4, column: 5 }, start: { line: 2, column: 3 } }); -// }); - -// it('should group mutants by file name', () => { -// // Arrange -// const inputMutants = [ -// factory.killedMutantResult({ -// mutatorName: 'Foo', -// fileName: 'foo.js', -// }), -// factory.undetectedMutantResult({ -// mutatorName: 'Bar', -// fileName: 'foo.js', -// }), -// ]; -// files.push(new File('foo.js', '')); - -// // Act -// const actualReport = actReportAll(inputMutants); - -// // Assert -// expect(Object.keys(actualReport.files)).lengthOf(1); -// expect(actualReport.files['foo.js'].mutants).lengthOf(2); -// }); - -// it('should log a warning if source file could not be found', () => { -// const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; -// const actualReport = actReportAll(inputMutants); -// expect(Object.keys(actualReport.files)).lengthOf(0); -// expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); -// }); - -// describe('determineExitCode', () => { -// beforeEach(() => { -// files.push(new File('file.js', '')); -// }); - -// it('should not set exit code = 1 if `threshold.break` is not configured', () => { -// actReportAll([factory.undetectedMutantResult({ status: MutantStatus.Survived })]); - -// expect(setExitCodeStub).not.called; -// expect(testInjector.logger.debug).calledWith( -// "No breaking threshold configured. Won't fail the build no matter how low your mutation score is. Set `thresholds.break` to change this behavior." -// ); -// }); - -// it('should not set exit code = 1 if `threshold.break` === score', () => { -// testInjector.options.thresholds.break = 50; -// actReportAll([ -// factory.undetectedMutantResult({ status: MutantStatus.Survived }), -// factory.killedMutantResult({ status: MutantStatus.Killed }), -// ]); // 50 % -// expect(setExitCodeStub).not.called; -// expect(testInjector.logger.info).calledWith('Final mutation score of 50.00 is greater than or equal to break threshold 50'); -// }); - -// it('should set exit code = 1 if `threshold.break` > score', () => { -// testInjector.options.thresholds.break = 50.01; -// actReportAll([ -// factory.undetectedMutantResult({ status: MutantStatus.Survived }), -// factory.killedMutantResult({ status: MutantStatus.Killed }), -// ]); // 50 % -// expect(setExitCodeStub).calledWith(1); -// expect(testInjector.logger.error).calledWith('Final mutation score 50.00 under breaking threshold 50.01, setting exit code to 1 (failure).'); -// expect(testInjector.logger.info).calledWith('(improve mutation score or set `thresholds.break = null` to prevent this error in the future)'); -// }); -// }); - -// describe('determine description', () => { -// beforeEach(() => { -// files.push(new File('file.js', '')); -// }); - -// it('should provide the error message as description', () => { -// const mutantResult = factory.invalidMutantResult({ fileName: 'file.js', errorMessage: 'Cannot call "foo" of undefined' }); -// const actualReport = actReportAll([mutantResult]); -// expect(actualReport.files['file.js'].mutants[0].description).eq('Error message: Cannot call "foo" of undefined'); -// }); - -// it('should provide the "killedBy" as description', () => { -// const mutantResult = factory.killedMutantResult({ fileName: 'file.js', killedBy: 'Foo should be bar' }); -// const actualReport = actReportAll([mutantResult]); -// expect(actualReport.files['file.js'].mutants[0].description).eq('Killed by: Foo should be bar'); -// }); - -// it('should provide the ignore reason as description', () => { -// const mutantResult = factory.ignoredMutantResult({ fileName: 'file.js', ignoreReason: 'Ignored by "fooMutator" in excludedMutations' }); -// const actualReport = actReportAll([mutantResult]); -// expect(actualReport.files['file.js'].mutants[0].description).eq('Ignore reason: Ignored by "fooMutator" in excludedMutations'); -// }); -// }); - -// function actReportAll(input: MutantResult[] = []): mutationTestReportSchema.MutationTestResult { -// sut.reportAll(input); -// return reporterMock.onMutationTestReportReady.firstCall.args[0]; -// } -// }); - -// describe('reportOne', () => { -// beforeEach(() => { -// inputFiles = new InputFileCollection([new File('add.js', 'function add(a, b) {\n return a + b;\n}\n')], ['add.js']); -// }); - -// it('should map simple attributes to the mutant result', () => { -// // Arrange -// const sut = createSut(); -// const location: Location = Object.freeze({ start: Object.freeze({ line: 1, column: 5 }), end: Object.freeze({ line: 3, column: 1 }) }); -// const range: Range = [21, 35]; - -// // Act -// const actual = sut.reportCheckFailed( -// factory.mutant({ -// id: 32, -// fileName: 'add.js', -// location, -// replacement: '{}', -// mutatorName: 'fooMutator', -// range, -// }), -// factory.failedCheckResult() -// ); - -// // Assert -// const expected: Partial = { -// id: '32', -// location, -// mutatorName: 'fooMutator', -// range, -// fileName: 'add.js', -// replacement: '{}', -// }; -// expect(actual).include(expected); -// }); - -// it('should report failed message on reportCheckFailed', () => { -// // Arrange -// const sut = createSut(); - -// // Act -// const actual = sut.reportCheckFailed( -// factory.mutant({ fileName: 'add.js' }), -// factory.failedCheckResult({ status: CheckStatus.CompileError, reason: 'cannot call foo of undefined' }) -// ); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.CompileError, -// errorMessage: 'cannot call foo of undefined', -// }; -// expect(actual).include(expected); -// }); - -// it('should report an empty test filter on reportNoCoverage', () => { -// // Arrange -// const sut = createSut(); - -// // Act -// const actual = sut.reportNoCoverage(factory.mutant({ fileName: 'add.js' })); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.NoCoverage, -// testFilter: [], -// }; -// expect(actual).deep.include(expected); -// }); - -// it('should report a killed mutant on reportMutantRunResult with a KilledMutantRunResult', () => { -// // Arrange -// dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); -// const sut = createSut(); - -// // Act -// const actual = sut.reportMutantRunResult( -// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), -// factory.killedMutantRunResult({ killedBy: '1', nrOfTests: 42 }) -// ); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.Killed, -// killedBy: 'foo should be bar', -// nrOfTestsRan: 42, -// }; -// expect(actual).deep.include(expected); -// }); - -// it('should report a runtime error mutant on reportMutantRunResult with a ErrorMutantRunResult', () => { -// // Arrange -// const sut = createSut(); - -// // Act -// const actual = sut.reportMutantRunResult( -// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), -// factory.errorMutantRunResult({ errorMessage: 'Cannot call foo of null' }) -// ); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.RuntimeError, -// errorMessage: 'Cannot call foo of null', -// }; -// expect(actual).deep.include(expected); -// }); - -// it('should report a timeout mutant on reportMutantRunResult with a TimeoutMutantRunResult', () => { -// // Arrange -// const sut = createSut(); - -// // Act -// const actual = sut.reportMutantRunResult( -// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }) }), -// factory.timeoutMutantRunResult() -// ); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.TimedOut, -// }; -// expect(actual).deep.include(expected); -// }); - -// it('should report an ignored mutant on reportMutantRunResult with a IgnoredMutantResult', () => { -// // Arrange -// const sut = createSut(); - -// // Act -// const actual = sut.reportMutantIgnored(factory.mutant({ fileName: 'add.js', ignoreReason: 'foo is ignored' })); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.Ignored, -// ignoreReason: 'foo is ignored', -// }; -// expect(actual).deep.include(expected); -// }); - -// it('should report a survived mutant on reportMutantRunResult with a SurvivedMutantRunResult', () => { -// // Arrange -// dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); -// const sut = createSut(); - -// // Act -// const actual = sut.reportMutantRunResult( -// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }), testFilter: ['1'] }), -// factory.survivedMutantRunResult({ nrOfTests: 4 }) -// ); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.Survived, -// testFilter: ['foo should be bar'], -// nrOfTestsRan: 4, -// }; -// expect(actual).deep.include(expected); -// }); - -// it('should be able to report testFilter as `undefined` for a survived mutant', () => { -// // Arrange -// dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); -// const sut = createSut(); - -// // Act -// const actual = sut.reportMutantRunResult( -// factory.mutantTestCoverage({ mutant: factory.mutant({ fileName: 'add.js' }), testFilter: undefined }), -// factory.survivedMutantRunResult() -// ); - -// // Assert -// const expected: Partial = { -// status: MutantStatus.Survived, -// testFilter: undefined, -// }; -// expect(actual).deep.include(expected); -// }); -// }); -// }); +import sinon from 'sinon'; +import { File, Location, MutantResult, MutantStatus, Range, schema } from '@stryker-mutator/api/core'; +import { Reporter } from '@stryker-mutator/api/report'; +import { factory, testInjector } from '@stryker-mutator/test-helpers'; +import { expect } from 'chai'; +import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; +import { CheckStatus } from '@stryker-mutator/api/check'; + +import { coreTokens } from '../../../src/di'; +import { InputFileCollection } from '../../../src/input/input-file-collection'; +import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; +import * as objectUtils from '../../../src/utils/object-utils'; + +describe(MutationTestReportHelper.name, () => { + let reporterMock: sinon.SinonStubbedInstance>; + let inputFiles: InputFileCollection; + let files: File[]; + let setExitCodeStub: sinon.SinonStub; + let dryRunResult: CompleteDryRunResult; + + beforeEach(() => { + reporterMock = factory.reporter(); + setExitCodeStub = sinon.stub(objectUtils, 'setExitCode'); + files = []; + inputFiles = { + files, + filesToMutate: [], + logFiles: () => { + // idle + }, + }; + dryRunResult = factory.completeDryRunResult(); + }); + + function createSut() { + return testInjector.injector + .provideValue(coreTokens.reporter, reporterMock) + .provideValue(coreTokens.inputFiles, inputFiles) + .provideValue(coreTokens.dryRunResult, dryRunResult) + .injectClass(MutationTestReportHelper); + } + + describe(MutationTestReportHelper.prototype.reportAll.name, () => { + let sut: MutationTestReportHelper; + + beforeEach(() => { + sut = createSut(); + }); + + it('should report "mutationTestReportReady"', () => { + sut.reportAll([]); + expect(reporterMock.onMutationTestReportReady).calledOnce; + }); + + it('should report "onAllMutantsTested"', () => { + sut.reportAll([]); + expect(reporterMock.onAllMutantsTested).calledOnce; + }); + + it('should report "onAllMutantsTested" before mutationTestReportReady', () => { + sut.reportAll([]); + expect(reporterMock.onAllMutantsTested).calledBefore(reporterMock.onMutationTestReportReady); + }); + + it('should copy thresholds', () => { + const actualReport = actReportAll(); + expect(actualReport.thresholds).eq(testInjector.options.thresholds); + }); + + it('should set correct schema version', () => { + const actualReport = actReportAll(); + expect(actualReport.schemaVersion).eq('1.0'); + }); + + it('should correctly map file properties', () => { + // Arrange + files.push(new File('foo.js', 'foo content')); + files.push(new File('bar.html', 'bar content')); + files.push(new File('baz.vue', 'baz content')); + files.push(new File('qux.ts', 'qux content')); + files.push(new File('corge.tsx', 'corge content')); + const inputMutants = files.map((file) => factory.killedMutantResult({ fileName: file.name })); + + // Act + const actualReport = actReportAll(inputMutants); + + // Assert + expect(Object.keys(actualReport.files)).lengthOf(5); + expect(actualReport.files['foo.js']).include({ language: 'javascript', source: 'foo content' }); + expect(actualReport.files['bar.html']).include({ language: 'html', source: 'bar content' }); + expect(actualReport.files['baz.vue']).include({ language: 'html', source: 'baz content' }); + expect(actualReport.files['qux.ts']).include({ language: 'typescript', source: 'qux content' }); + expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); + }); + + it('should correctly map basic MutantResult properties', () => { + // Arrange + const inputMutants = [ + factory.mutantResult({ + id: '1', + mutatorName: 'Foo', + replacement: 'foo replacement', + fileName: 'foo.js', + status: MutantStatus.Killed, + }), + factory.mutantResult({ + fileName: 'bar.js', + status: MutantStatus.NoCoverage, + }), + factory.mutantResult({ + fileName: 'baz.js', + status: MutantStatus.RuntimeError, + }), + factory.mutantResult({ + fileName: 'qux.js', + status: MutantStatus.Survived, + }), + factory.mutantResult({ + fileName: '5.js', + status: MutantStatus.Timeout, + }), + factory.mutantResult({ + fileName: '6.js', + status: MutantStatus.CompileError, + }), + ]; + files.push(...inputMutants.map((m) => new File(m.fileName, ''))); + + // Act + const actualReport = actReportAll(inputMutants); + + // Assert + expect(Object.keys(actualReport.files)).lengthOf(6); + expect(actualReport.files['foo.js'].mutants[0]).include({ + id: '1', + mutatorName: 'Foo', + replacement: 'foo replacement', + status: MutantStatus.Killed, + }); + expect(actualReport.files['bar.js'].mutants[0]).include({ status: MutantStatus.NoCoverage }); + expect(actualReport.files['baz.js'].mutants[0]).include({ status: MutantStatus.RuntimeError }); + expect(actualReport.files['qux.js'].mutants[0]).include({ status: MutantStatus.Survived }); + expect(actualReport.files['5.js'].mutants[0]).include({ status: MutantStatus.Timeout }); + expect(actualReport.files['6.js'].mutants[0]).include({ status: MutantStatus.CompileError }); + }); + + it('should offset location correctly', () => { + const inputMutants = [factory.mutantResult({ location: { end: { line: 3, column: 4 }, start: { line: 1, column: 2 } } })]; + files.push(...inputMutants.map((m) => new File(m.fileName, ''))); + const actualReport = actReportAll(inputMutants); + expect(actualReport.files['file.js'].mutants[0].location).deep.eq({ end: { line: 4, column: 5 }, start: { line: 2, column: 3 } }); + }); + + it('should group mutants by file name', () => { + // Arrange + const inputMutants = [ + factory.mutantResult({ + mutatorName: 'Foo', + fileName: 'foo.js', + }), + factory.mutantResult({ + mutatorName: 'Bar', + fileName: 'foo.js', + }), + ]; + files.push(new File('foo.js', '')); + + // Act + const actualReport = actReportAll(inputMutants); + + // Assert + expect(Object.keys(actualReport.files)).lengthOf(1); + expect(actualReport.files['foo.js'].mutants).lengthOf(2); + }); + + it('should log a warning if source file could not be found', () => { + const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; + const actualReport = actReportAll(inputMutants); + expect(Object.keys(actualReport.files)).lengthOf(0); + expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); + }); + + describe('determineExitCode', () => { + beforeEach(() => { + files.push(new File('file.js', '')); + }); + + it('should not set exit code = 1 if `threshold.break` is not configured', () => { + actReportAll([factory.mutantResult({ status: MutantStatus.Survived })]); + + expect(setExitCodeStub).not.called; + expect(testInjector.logger.debug).calledWith( + "No breaking threshold configured. Won't fail the build no matter how low your mutation score is. Set `thresholds.break` to change this behavior." + ); + }); + + it('should not set exit code = 1 if `threshold.break` === score', () => { + testInjector.options.thresholds.break = 50; + actReportAll([factory.mutantResult({ status: MutantStatus.Survived }), factory.mutantResult({ status: MutantStatus.Killed })]); // 50 % + expect(setExitCodeStub).not.called; + expect(testInjector.logger.info).calledWith('Final mutation score of 50.00 is greater than or equal to break threshold 50'); + }); + + it('should set exit code = 1 if `threshold.break` > score', () => { + testInjector.options.thresholds.break = 50.01; + actReportAll([factory.mutantResult({ status: MutantStatus.Survived }), factory.mutantResult({ status: MutantStatus.Killed })]); // 50 % + expect(setExitCodeStub).calledWith(1); + expect(testInjector.logger.error).calledWith('Final mutation score 50.00 under breaking threshold 50.01, setting exit code to 1 (failure).'); + expect(testInjector.logger.info).calledWith('(improve mutation score or set `thresholds.break = null` to prevent this error in the future)'); + }); + }); + + function actReportAll(input: MutantResult[] = []): schema.MutationTestResult { + sut.reportAll(input); + return reporterMock.onMutationTestReportReady.firstCall.args[0]; + } + }); + + describe('reportOne', () => { + beforeEach(() => { + inputFiles = new InputFileCollection([new File('add.js', 'function add(a, b) {\n return a + b;\n}\n')], ['add.js']); + }); + + describe(MutationTestReportHelper.prototype.reportCheckFailed.name, () => { + it('should map simple attributes to the mutant result', () => { + // Arrange + const sut = createSut(); + const location: Location = Object.freeze({ start: Object.freeze({ line: 1, column: 5 }), end: Object.freeze({ line: 3, column: 1 }) }); + const range: Range = [21, 35]; + + // Act + const actual = sut.reportCheckFailed( + factory.mutant({ + id: '32', + fileName: 'add.js', + location, + replacement: '{}', + mutatorName: 'fooMutator', + range, + }), + factory.failedCheckResult() + ); + + // Assert + const expected: Partial = { + id: '32', + location, + mutatorName: 'fooMutator', + range, + fileName: 'add.js', + replacement: '{}', + }; + expect(actual).include(expected); + }); + + it('should report statusReason', () => { + // Arrange + const sut = createSut(); + + // Act + const actual = sut.reportCheckFailed( + factory.mutant({ fileName: 'add.js' }), + factory.failedCheckResult({ status: CheckStatus.CompileError, reason: 'cannot call foo of undefined' }) + ); + + // Assert + const expected: Partial = { + status: MutantStatus.CompileError, + statusReason: 'cannot call foo of undefined', + }; + expect(actual).include(expected); + }); + }); + + describe(MutationTestReportHelper.prototype.reportMutantStatus.name, () => { + it('should correctly map all properties', () => { + // Arrange + const input = factory.mutantTestCoverage({ + fileName: 'add.js', + id: '3', + location: factory.location(), + mutatorName: 'fooMutator', + range: [1, 3], + replacement: '"bar"', + coveredBy: ['1'], + static: false, + }); + const sut = createSut(); + + // Act + const actual = sut.reportMutantStatus(input, MutantStatus.NoCoverage); + + // Assert + const expected: MutantResult = { + status: MutantStatus.NoCoverage, + fileName: 'add.js', + id: '3', + location: factory.location(), + mutatorName: 'fooMutator', + range: [1, 3], + replacement: '"bar"', + coveredBy: ['1'], + static: false, + }; + expect(actual).deep.include(expected); + }); + }); + + describe(MutationTestReportHelper.prototype.reportMutantRunResult.name, () => { + it('should report a killed mutant when called with a KilledMutantRunResult', () => { + // Arrange + dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); + const sut = createSut(); + + // Act + const actual = sut.reportMutantRunResult( + factory.mutantTestCoverage({ fileName: 'add.js' }), + factory.killedMutantRunResult({ killedBy: '1', nrOfTests: 42, failureMessage: 'foo should have been bar at line 1' }) + ); + + // Assert + const expected: Partial = { + status: MutantStatus.Killed, + killedBy: ['1'], + testsCompleted: 42, + statusReason: 'foo should have been bar at line 1', + }; + expect(actual).deep.include(expected); + }); + + it('should report a runtime error when called with an ErrorMutantRunResult', () => { + // Arrange + const sut = createSut(); + + // Act + const actual = sut.reportMutantRunResult( + factory.mutantTestCoverage({ fileName: 'add.js' }), + factory.errorMutantRunResult({ errorMessage: 'Cannot call foo of null' }) + ); + + // Assert + const expected: Partial = { + status: MutantStatus.RuntimeError, + statusReason: 'Cannot call foo of null', + }; + expect(actual).deep.include(expected); + }); + + it('should report a timeout mutant when called with a TimeoutMutantRunResult', () => { + // Arrange + const sut = createSut(); + + // Act + const actual = sut.reportMutantRunResult(factory.mutantTestCoverage({ fileName: 'add.js' }), factory.timeoutMutantRunResult()); + + // Assert + const expected: Partial = { + status: MutantStatus.Timeout, + }; + expect(actual).deep.include(expected); + }); + + it('should report a survived mutant when called with a SurvivedMutantRunResult', () => { + // Arrange + dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); + const sut = createSut(); + + // Act + const actual = sut.reportMutantRunResult( + factory.mutantTestCoverage({ fileName: 'add.js', coveredBy: ['1'] }), + factory.survivedMutantRunResult({ nrOfTests: 4 }) + ); + + // Assert + const expected: Partial = { + status: MutantStatus.Survived, + coveredBy: ['1'], + testsCompleted: 4, + }; + expect(actual).deep.include(expected); + }); + + it('should be able to report coveredBy as `undefined` for a survived mutant', () => { + // Arrange + dryRunResult.tests.push(factory.failedTestResult({ id: '1', name: 'foo should be bar' })); + const sut = createSut(); + + // Act + const actual = sut.reportMutantRunResult( + factory.mutantTestCoverage({ fileName: 'add.js', coveredBy: undefined }), + factory.survivedMutantRunResult() + ); + + // Assert + const expected: Partial = { + status: MutantStatus.Survived, + coveredBy: undefined, + }; + expect(actual).deep.include(expected); + }); + }); + }); +}); diff --git a/packages/test-helpers/src/factory.ts b/packages/test-helpers/src/factory.ts index d98fdc4beb..5ea436a98a 100644 --- a/packages/test-helpers/src/factory.ts +++ b/packages/test-helpers/src/factory.ts @@ -85,11 +85,11 @@ export const killedMutantResult = (overrides?: Partial>): MutantResult => mutantResult({ ...overrides, status: MutantStatus.Timeout, statusReason: 'expected error' }); -export const invalidMutantResult = (overrides?: Partial>): MutantResult => +export const runtimeErrorMutantResult = (overrides?: Partial>): MutantResult => mutantResult({ ...overrides, status: MutantStatus.RuntimeError, statusReason: 'expected error' }); export const ignoredMutantResult = (overrides?: Partial>): MutantResult => mutantResult({ ...overrides, status: MutantStatus.Ignored, statusReason: 'Ignored by "fooMutator" in excludedMutations' }); -export const undetectedMutantResult = (overrides?: Partial>): MutantResult => +export const noCoverageMutantResult = (overrides?: Partial>): MutantResult => mutantResult({ ...overrides, status: MutantStatus.NoCoverage }); export const mutantResult = factoryMethod(() => ({ From 4d72423dba3e38532d29d8e5543d85a42ea8b86b Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Thu, 4 Mar 2021 09:12:58 +0100 Subject: [PATCH 10/25] Implement mutant id as string in instrumenter and test runners --- packages/instrumenter/src/mutant.ts | 4 +- .../src/transformers/mutant-collector.ts | 2 +- .../instrumenter/src/util/syntax-helpers.ts | 8 +- .../instrumenter/test/helpers/factories.ts | 2 +- .../integration/transformers.it.spec.ts.snap | 2511 ++++++++--------- .../expression-mutant-placer.spec.ts | 14 +- .../statement-mutant-placer.spec.ts | 16 +- .../switch-case-mutant-placer.spec.ts | 20 +- .../instrumenter/test/unit/mutant.spec.ts | 8 +- .../transformers/mutant-collector.spec.ts | 4 +- .../instrumenter/app.component.ts.out.snap | 4 +- .../instrumenter/html-sample.html.out.snap | 8 +- .../instrumenter/ignore.js.out.snap | 6 +- .../instrumenter/js-sample.js.out.snap | 8 +- .../instrumenter/lit-html-sample.ts.out.snap | 114 +- .../instrumenter/shebang.js.out.snap | 4 +- .../instrumenter/super-call.ts.out.snap | 4 +- .../instrumenter/switch-case.js.out.snap | 18 +- .../instrumenter/ts-sample.ts.out.snap | 22 +- .../instrumenter/vue-sample.vue.out.snap | 30 +- .../test/unit/jasmine-test-runner.spec.ts | 2 +- .../lib/jasmine_examples/Player.js | 36 +- .../lib/jasmine_examples/Song.js | 8 +- .../integration/jest-test-runner.it.spec.ts | 6 +- .../src/Add.js | 44 +- .../src/Circle.js | 16 +- .../jasmine2-node-instrumented/src/Add.js | 34 +- .../jasmine2-node-instrumented/src/Circle.js | 14 +- .../testResources/instrumented/src/Add.js | 34 +- .../testResources/instrumented/src/Circle.js | 14 +- .../test/unit/mocha-test-runner.spec.ts | 2 +- .../sample-project-instrumented/MyMath.js | 40 +- 32 files changed, 1458 insertions(+), 1599 deletions(-) diff --git a/packages/instrumenter/src/mutant.ts b/packages/instrumenter/src/mutant.ts index 619ed1ffb1..eee6fe683c 100644 --- a/packages/instrumenter/src/mutant.ts +++ b/packages/instrumenter/src/mutant.ts @@ -18,7 +18,7 @@ export class Mutant { public readonly mutatorName: string; public readonly ignoreReason: string | undefined; - constructor(public readonly id: number, public readonly fileName: string, specs: NamedNodeMutation) { + constructor(public readonly id: string, public readonly fileName: string, specs: NamedNodeMutation) { this.original = specs.original; this.replacement = specs.replacement; this.mutatorName = specs.mutatorName; @@ -29,7 +29,7 @@ export class Mutant { public toApiMutant(): ApiMutant { return { fileName: this.fileName, - id: this.id.toString(), + id: this.id, location: toApiLocation(this.original.loc!), mutatorName: this.mutatorName, range: [this.original.start!, this.original.end!], diff --git a/packages/instrumenter/src/transformers/mutant-collector.ts b/packages/instrumenter/src/transformers/mutant-collector.ts index 6c7727f9b2..865365a7ec 100644 --- a/packages/instrumenter/src/transformers/mutant-collector.ts +++ b/packages/instrumenter/src/transformers/mutant-collector.ts @@ -20,7 +20,7 @@ export class MutantCollector { mutationSpecs.replacement.end = mutationSpecs.original.end; mutationSpecs.replacement.start = mutationSpecs.original.start; mutationSpecs.replacement.loc = mutationSpecs.original.loc; - const mutant = new Mutant(this._mutants.length, fileName, mutationSpecs); + const mutant = new Mutant(this._mutants.length.toString(), fileName, mutationSpecs); this._mutants.push(mutant); if (mutant.ignoreReason === undefined) { // Only place mutants that are not ignored diff --git a/packages/instrumenter/src/util/syntax-helpers.ts b/packages/instrumenter/src/util/syntax-helpers.ts index 2c59bc0505..239ea94c0b 100644 --- a/packages/instrumenter/src/util/syntax-helpers.ts +++ b/packages/instrumenter/src/util/syntax-helpers.ts @@ -18,7 +18,7 @@ export const instrumentationBabelHeader = parse(`function ${STRYKER_NAMESPACE_HE var g = new Function("return this")(); var ns = g.${ID.NAMESPACE} || (g.${ID.NAMESPACE} = {}); if (ns.${ID.ACTIVE_MUTANT} === undefined && g.process && g.process.env && g.process.env.${ID.ACTIVE_MUTANT_ENV_VARIABLE}) { - ns.${ID.ACTIVE_MUTANT} = Number(g.process.env.${ID.ACTIVE_MUTANT_ENV_VARIABLE}); + ns.${ID.ACTIVE_MUTANT} = g.process.env.${ID.ACTIVE_MUTANT_ENV_VARIABLE}; } function retrieveNS(){ return ns; @@ -57,8 +57,8 @@ function ${IS_MUTANT_ACTIVE_HELPER}(id) { * returns syntax for `global.activeMutant === $mutantId` * @param mutantId The id of the mutant to switch */ -export function mutantTestExpression(mutantId: number): types.CallExpression { - return types.callExpression(types.identifier(IS_MUTANT_ACTIVE_HELPER), [types.numericLiteral(mutantId)]); +export function mutantTestExpression(mutantId: string): types.CallExpression { + return types.callExpression(types.identifier(IS_MUTANT_ACTIVE_HELPER), [types.stringLiteral(mutantId)]); } interface Position { @@ -140,7 +140,7 @@ export function mutationCoverageSequenceExpression(mutants: Mutant[], targetExpr const sequence: types.Expression[] = [ types.callExpression( types.identifier(COVER_MUTANT_HELPER), - mutants.map((mutant) => types.numericLiteral(mutant.id)) + mutants.map((mutant) => types.stringLiteral(mutant.id)) ), ]; if (targetExpression) { diff --git a/packages/instrumenter/test/helpers/factories.ts b/packages/instrumenter/test/helpers/factories.ts index 4e4f2c8ae7..7ad5441eda 100644 --- a/packages/instrumenter/test/helpers/factories.ts +++ b/packages/instrumenter/test/helpers/factories.ts @@ -66,7 +66,7 @@ export function createTSAst(overrides?: Partial): TSAst { } export function createMutant(overrides?: Partial): Mutant { - return new Mutant(overrides?.id ?? 1, overrides?.fileName ?? 'example.js', { + return new Mutant(overrides?.id ?? '1', overrides?.fileName ?? 'example.js', { mutatorName: overrides?.mutatorName ?? 'fooMutator', original: overrides?.original ?? types.identifier('foo'), replacement: overrides?.replacement ?? types.identifier('bar'), diff --git a/packages/instrumenter/test/integration/transformers.it.spec.ts.snap b/packages/instrumenter/test/integration/transformers.it.spec.ts.snap index ccf57806a4..ac3874dfec 100644 --- a/packages/instrumenter/test/integration/transformers.it.spec.ts.snap +++ b/packages/instrumenter/test/integration/transformers.it.spec.ts.snap @@ -481,9 +481,9 @@ Object { "consequent": Node { "body": Array [ Node { - "end": 298, + "end": 290, "expression": Node { - "end": 297, + "end": 289, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -558,7 +558,7 @@ Object { }, "loc": SourceLocation { "end": Position { - "column": 69, + "column": 61, "line": 5, }, "filename": undefined, @@ -571,212 +571,165 @@ Object { "operator": "=", "range": undefined, "right": Node { - "arguments": Array [ - Node { + "computed": false, + "end": 289, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 61, + "line": 5, + }, + "filename": undefined, + "identifierName": undefined, + "start": Position { + "column": 22, + "line": 5, + }, + }, + "object": Node { + "computed": false, + "end": 263, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 35, + "line": 5, + }, + "filename": undefined, + "identifierName": undefined, + "start": Position { + "column": 22, + "line": 5, + }, + }, + "object": Node { "computed": false, - "end": 296, + "end": 259, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 68, + "column": 31, "line": 5, }, "filename": undefined, "identifierName": undefined, "start": Position { - "column": 29, + "column": 22, "line": 5, }, }, "object": Node { - "computed": false, - "end": 270, + "end": 251, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 42, + "column": 23, "line": 5, }, "filename": undefined, - "identifierName": undefined, + "identifierName": "g", "start": Position { - "column": 29, + "column": 22, "line": 5, }, }, - "object": Node { - "computed": false, - "end": 266, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 38, - "line": 5, - }, - "filename": undefined, - "identifierName": undefined, - "start": Position { - "column": 29, - "line": 5, - }, - }, - "object": Node { - "end": 258, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 5, - }, - "filename": undefined, - "identifierName": "g", - "start": Position { - "column": 29, - "line": 5, - }, - }, - "name": "g", - "range": undefined, - "start": 257, - "trailingComments": undefined, - "type": "Identifier", - }, - "property": Node { - "end": 266, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 38, - "line": 5, - }, - "filename": undefined, - "identifierName": "process", - "start": Position { - "column": 31, - "line": 5, - }, - }, - "name": "process", - "range": undefined, - "start": 259, - "trailingComments": undefined, - "type": "Identifier", - }, - "range": undefined, - "start": 257, - "trailingComments": undefined, - "type": "MemberExpression", - }, - "property": Node { - "end": 270, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 42, - "line": 5, - }, - "filename": undefined, - "identifierName": "env", - "start": Position { - "column": 39, - "line": 5, - }, - }, - "name": "env", - "range": undefined, - "start": 267, - "trailingComments": undefined, - "type": "Identifier", - }, + "name": "g", "range": undefined, - "start": 257, + "start": 250, "trailingComments": undefined, - "type": "MemberExpression", + "type": "Identifier", }, "property": Node { - "end": 296, + "end": 259, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 68, + "column": 31, "line": 5, }, "filename": undefined, - "identifierName": "__STRYKER_ACTIVE_MUTANT__", + "identifierName": "process", "start": Position { - "column": 43, + "column": 24, "line": 5, }, }, - "name": "__STRYKER_ACTIVE_MUTANT__", + "name": "process", "range": undefined, - "start": 271, + "start": 252, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 257, + "start": 250, "trailingComments": undefined, "type": "MemberExpression", }, - ], - "callee": Node { - "end": 256, + "property": Node { + "end": 263, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 35, + "line": 5, + }, + "filename": undefined, + "identifierName": "env", + "start": Position { + "column": 32, + "line": 5, + }, + }, + "name": "env", + "range": undefined, + "start": 260, + "trailingComments": undefined, + "type": "Identifier", + }, + "range": undefined, + "start": 250, + "trailingComments": undefined, + "type": "MemberExpression", + }, + "property": Node { + "end": 289, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 28, + "column": 61, "line": 5, }, "filename": undefined, - "identifierName": "Number", + "identifierName": "__STRYKER_ACTIVE_MUTANT__", "start": Position { - "column": 22, + "column": 36, "line": 5, }, }, - "name": "Number", + "name": "__STRYKER_ACTIVE_MUTANT__", "range": undefined, - "start": 250, + "start": 264, "trailingComments": undefined, "type": "Identifier", }, - "end": 297, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 69, - "line": 5, - }, - "filename": undefined, - "identifierName": undefined, - "start": Position { - "column": 22, - "line": 5, - }, - }, "range": undefined, "start": 250, "trailingComments": undefined, - "type": "CallExpression", + "type": "MemberExpression", }, "start": 232, "trailingComments": undefined, @@ -787,7 +740,7 @@ Object { "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 70, + "column": 62, "line": 5, }, "filename": undefined, @@ -804,7 +757,7 @@ Object { }, ], "directives": Array [], - "end": 302, + "end": 294, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -825,7 +778,7 @@ Object { "trailingComments": undefined, "type": "BlockStatement", }, - "end": 302, + "end": 294, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1381,7 +1334,7 @@ Object { "body": Array [ Node { "argument": Node { - "end": 341, + "end": 333, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1399,11 +1352,11 @@ Object { }, "name": "ns", "range": undefined, - "start": 339, + "start": 331, "trailingComments": undefined, "type": "Identifier", }, - "end": 342, + "end": 334, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1420,13 +1373,13 @@ Object { }, }, "range": undefined, - "start": 332, + "start": 324, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 346, + "end": 338, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1443,15 +1396,15 @@ Object { }, }, "range": undefined, - "start": 326, + "start": 318, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 346, + "end": 338, "extra": undefined, "generator": false, "id": Node { - "end": 324, + "end": 316, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1469,7 +1422,7 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 314, + "start": 306, "trailingComments": undefined, "type": "Identifier", }, @@ -1489,19 +1442,19 @@ Object { }, "params": Array [], "range": undefined, - "start": 305, + "start": 297, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 375, + "end": 367, "expression": Node { - "end": 374, + "end": 366, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 361, + "end": 353, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1519,7 +1472,7 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "Identifier", }, @@ -1538,7 +1491,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 374, + "end": 366, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1556,11 +1509,11 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 364, + "start": 356, "trailingComments": undefined, "type": "Identifier", }, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -1580,7 +1533,7 @@ Object { }, }, "range": undefined, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -1588,7 +1541,7 @@ Object { "argument": Node { "arguments": Array [], "callee": Node { - "end": 395, + "end": 387, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1606,11 +1559,11 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 385, + "start": 377, "trailingComments": undefined, "type": "Identifier", }, - "end": 397, + "end": 389, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1627,11 +1580,11 @@ Object { }, }, "range": undefined, - "start": 385, + "start": 377, "trailingComments": undefined, "type": "CallExpression", }, - "end": 398, + "end": 390, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1648,13 +1601,13 @@ Object { }, }, "range": undefined, - "start": 378, + "start": 370, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 400, + "end": 392, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1675,7 +1628,7 @@ Object { "trailingComments": undefined, "type": "BlockStatement", }, - "end": 400, + "end": 392, "extra": undefined, "generator": false, "id": Node { @@ -1722,11 +1675,11 @@ Object { "type": "FunctionDeclaration", }, Node { - "end": 416, + "end": 408, "expression": Node { "arguments": Array [], "callee": Node { - "end": 413, + "end": 405, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1744,11 +1697,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "Identifier", }, - "end": 415, + "end": 407, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1765,7 +1718,7 @@ Object { }, }, "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "CallExpression", }, @@ -1785,7 +1738,7 @@ Object { }, }, "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -1796,10 +1749,10 @@ Object { Node { "declarations": Array [ Node { - "end": 470, + "end": 462, "extra": undefined, "id": Node { - "end": 453, + "end": 445, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1817,14 +1770,14 @@ Object { }, "name": "ns", "range": undefined, - "start": 451, + "start": 443, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "arguments": Array [], "callee": Node { - "end": 468, + "end": 460, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1842,11 +1795,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 456, + "start": 448, "trailingComments": undefined, "type": "Identifier", }, - "end": 470, + "end": 462, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1863,7 +1816,7 @@ Object { }, }, "range": undefined, - "start": 456, + "start": 448, "trailingComments": undefined, "type": "CallExpression", }, @@ -1882,12 +1835,12 @@ Object { }, }, "range": undefined, - "start": 451, + "start": 443, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 471, + "end": 463, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -1905,17 +1858,17 @@ Object { }, }, "range": undefined, - "start": 447, + "start": 439, "trailingComments": undefined, "type": "VariableDeclaration", }, Node { "declarations": Array [ Node { - "end": 554, + "end": 546, "extra": undefined, "id": Node { - "end": 481, + "end": 473, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1933,18 +1886,18 @@ Object { }, "name": "cov", "range": undefined, - "start": 478, + "start": 470, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 554, + "end": 546, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 501, + "end": 493, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1961,7 +1914,7 @@ Object { }, }, "object": Node { - "end": 486, + "end": 478, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -1979,12 +1932,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 501, + "end": 493, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2002,12 +1955,12 @@ Object { }, "name": "mutantCoverage", "range": undefined, - "start": 487, + "start": 479, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "MemberExpression", }, @@ -2026,16 +1979,16 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 553, + "end": 545, "extra": Object { - "parenStart": 505, + "parenStart": 497, "parenthesized": true, }, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 523, + "end": 515, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2052,7 +2005,7 @@ Object { }, }, "object": Node { - "end": 508, + "end": 500, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2070,12 +2023,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 523, + "end": 515, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2093,12 +2046,12 @@ Object { }, "name": "mutantCoverage", "range": undefined, - "start": 509, + "start": 501, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "MemberExpression", }, @@ -2117,7 +2070,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 553, + "end": 545, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2136,11 +2089,11 @@ Object { "properties": Array [ Node { "computed": false, - "end": 538, + "end": 530, "extra": undefined, "innerComments": undefined, "key": Node { - "end": 534, + "end": 526, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2158,7 +2111,7 @@ Object { }, "name": "static", "range": undefined, - "start": 528, + "start": 520, "trailingComments": undefined, "type": "Identifier", }, @@ -2178,11 +2131,11 @@ Object { "method": false, "range": undefined, "shorthand": false, - "start": 528, + "start": 520, "trailingComments": undefined, "type": "ObjectProperty", "value": Node { - "end": 538, + "end": 530, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2200,18 +2153,18 @@ Object { }, "properties": Array [], "range": undefined, - "start": 536, + "start": 528, "trailingComments": undefined, "type": "ObjectExpression", }, }, Node { "computed": false, - "end": 551, + "end": 543, "extra": undefined, "innerComments": undefined, "key": Node { - "end": 547, + "end": 539, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2229,7 +2182,7 @@ Object { }, "name": "perTest", "range": undefined, - "start": 540, + "start": 532, "trailingComments": undefined, "type": "Identifier", }, @@ -2249,11 +2202,11 @@ Object { "method": false, "range": undefined, "shorthand": false, - "start": 540, + "start": 532, "trailingComments": undefined, "type": "ObjectProperty", "value": Node { - "end": 551, + "end": 543, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2271,22 +2224,22 @@ Object { }, "properties": Array [], "range": undefined, - "start": 549, + "start": 541, "trailingComments": undefined, "type": "ObjectExpression", }, }, ], "range": undefined, - "start": 526, + "start": 518, "trailingComments": undefined, "type": "ObjectExpression", }, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "AssignmentExpression", }, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "LogicalExpression", }, @@ -2305,12 +2258,12 @@ Object { }, }, "range": undefined, - "start": 478, + "start": 470, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 555, + "end": 547, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -2328,7 +2281,7 @@ Object { }, }, "range": undefined, - "start": 474, + "start": 466, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -2339,10 +2292,10 @@ Object { Node { "declarations": Array [ Node { - "end": 599, + "end": 591, "extra": undefined, "id": Node { - "end": 586, + "end": 578, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2360,13 +2313,13 @@ Object { }, "name": "c", "range": undefined, - "start": 585, + "start": 577, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "computed": false, - "end": 599, + "end": 591, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2383,7 +2336,7 @@ Object { }, }, "object": Node { - "end": 592, + "end": 584, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2401,12 +2354,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 589, + "start": 581, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 599, + "end": 591, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2424,12 +2377,12 @@ Object { }, "name": "static", "range": undefined, - "start": 593, + "start": 585, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 589, + "start": 581, "trailingComments": undefined, "type": "MemberExpression", }, @@ -2448,12 +2401,12 @@ Object { }, }, "range": undefined, - "start": 585, + "start": 577, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 600, + "end": 592, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -2471,7 +2424,7 @@ Object { }, }, "range": undefined, - "start": 581, + "start": 573, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -2480,14 +2433,14 @@ Object { "consequent": Node { "body": Array [ Node { - "end": 707, + "end": 699, "expression": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 636, + "end": 628, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2505,7 +2458,7 @@ Object { }, "name": "c", "range": undefined, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "Identifier", }, @@ -2524,13 +2477,13 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 668, + "end": 660, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2548,7 +2501,7 @@ Object { }, "object": Node { "computed": false, - "end": 650, + "end": 642, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2565,7 +2518,7 @@ Object { }, }, "object": Node { - "end": 642, + "end": 634, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2583,12 +2536,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 650, + "end": 642, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2606,18 +2559,18 @@ Object { }, "name": "perTest", "range": undefined, - "start": 643, + "start": 635, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "MemberExpression", }, "property": Node { "computed": false, - "end": 667, + "end": 659, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2634,7 +2587,7 @@ Object { }, }, "object": Node { - "end": 653, + "end": 645, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2652,12 +2605,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 651, + "start": 643, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 667, + "end": 659, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2675,17 +2628,17 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 654, + "start": 646, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 651, + "start": 643, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "MemberExpression", }, @@ -2704,13 +2657,13 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 700, + "end": 692, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2728,7 +2681,7 @@ Object { }, "object": Node { "computed": false, - "end": 682, + "end": 674, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2745,7 +2698,7 @@ Object { }, }, "object": Node { - "end": 674, + "end": 666, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2763,12 +2716,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 682, + "end": 674, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2786,18 +2739,18 @@ Object { }, "name": "perTest", "range": undefined, - "start": 675, + "start": 667, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "MemberExpression", }, "property": Node { "computed": false, - "end": 699, + "end": 691, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2814,7 +2767,7 @@ Object { }, }, "object": Node { - "end": 685, + "end": 677, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2832,12 +2785,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 683, + "start": 675, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 699, + "end": 691, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2855,17 +2808,17 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 686, + "start": 678, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 683, + "start": 675, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "MemberExpression", }, @@ -2884,7 +2837,7 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2902,19 +2855,19 @@ Object { }, "properties": Array [], "range": undefined, - "start": 704, + "start": 696, "trailingComments": undefined, "type": "ObjectExpression", }, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "LogicalExpression", }, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "AssignmentExpression", }, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -2934,13 +2887,13 @@ Object { }, }, "range": undefined, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 713, + "end": 705, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2957,11 +2910,11 @@ Object { }, }, "range": undefined, - "start": 627, + "start": 619, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 713, + "end": 705, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2978,10 +2931,10 @@ Object { }, }, "range": undefined, - "start": 605, + "start": 597, "test": Node { "computed": false, - "end": 625, + "end": 617, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -2998,7 +2951,7 @@ Object { }, }, "object": Node { - "end": 611, + "end": 603, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3016,12 +2969,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 609, + "start": 601, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 625, + "end": 617, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3039,12 +2992,12 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 612, + "start": 604, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 609, + "start": 601, "trailingComments": undefined, "type": "MemberExpression", }, @@ -3054,10 +3007,10 @@ Object { Node { "declarations": Array [ Node { - "end": 735, + "end": 727, "extra": undefined, "id": Node { - "end": 723, + "end": 715, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3075,12 +3028,12 @@ Object { }, "name": "a", "range": undefined, - "start": 722, + "start": 714, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 735, + "end": 727, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3098,7 +3051,7 @@ Object { }, "name": "arguments", "range": undefined, - "start": 726, + "start": 718, "trailingComments": undefined, "type": "Identifier", }, @@ -3117,12 +3070,12 @@ Object { }, }, "range": undefined, - "start": 722, + "start": 714, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 736, + "end": 728, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -3140,7 +3093,7 @@ Object { }, }, "range": undefined, - "start": 718, + "start": 710, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -3148,15 +3101,15 @@ Object { "body": Node { "body": Array [ Node { - "end": 809, + "end": 801, "expression": Node { - "end": 808, + "end": 800, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 787, + "end": 779, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3173,7 +3126,7 @@ Object { }, }, "object": Node { - "end": 781, + "end": 773, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3191,13 +3144,13 @@ Object { }, "name": "c", "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "Identifier", }, "property": Node { "computed": true, - "end": 786, + "end": 778, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3214,7 +3167,7 @@ Object { }, }, "object": Node { - "end": 783, + "end": 775, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3232,12 +3185,12 @@ Object { }, "name": "a", "range": undefined, - "start": 782, + "start": 774, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 785, + "end": 777, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3255,17 +3208,17 @@ Object { }, "name": "i", "range": undefined, - "start": 784, + "start": 776, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 782, + "start": 774, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "MemberExpression", }, @@ -3284,21 +3237,21 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 808, + "end": 800, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 803, + "end": 795, "extra": Object { - "parenStart": 790, + "parenStart": 782, "parenthesized": true, }, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 798, + "end": 790, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3315,7 +3268,7 @@ Object { }, }, "object": Node { - "end": 792, + "end": 784, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3333,13 +3286,13 @@ Object { }, "name": "c", "range": undefined, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "Identifier", }, "property": Node { "computed": true, - "end": 797, + "end": 789, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3356,7 +3309,7 @@ Object { }, }, "object": Node { - "end": 794, + "end": 786, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3374,12 +3327,12 @@ Object { }, "name": "a", "range": undefined, - "start": 793, + "start": 785, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 796, + "end": 788, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3397,17 +3350,17 @@ Object { }, "name": "i", "range": undefined, - "start": 795, + "start": 787, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 793, + "start": 785, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "MemberExpression", }, @@ -3426,7 +3379,7 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 803, + "end": 795, "extra": Object { "raw": "0", "rawValue": 0, @@ -3446,12 +3399,12 @@ Object { }, }, "range": undefined, - "start": 802, + "start": 794, "trailingComments": undefined, "type": "NumericLiteral", "value": 0, }, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "LogicalExpression", }, @@ -3470,7 +3423,7 @@ Object { "operator": "+", "range": undefined, "right": Node { - "end": 808, + "end": 800, "extra": Object { "raw": "1", "rawValue": 1, @@ -3490,16 +3443,16 @@ Object { }, }, "range": undefined, - "start": 807, + "start": 799, "trailingComments": undefined, "type": "NumericLiteral", "value": 1, }, - "start": 790, + "start": 782, "trailingComments": undefined, "type": "BinaryExpression", }, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -3519,13 +3472,13 @@ Object { }, }, "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 815, + "end": 807, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3542,19 +3495,19 @@ Object { }, }, "range": undefined, - "start": 772, + "start": 764, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 815, + "end": 807, "extra": undefined, "init": Node { "declarations": Array [ Node { - "end": 752, + "end": 744, "extra": undefined, "id": Node { - "end": 750, + "end": 742, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3572,12 +3525,12 @@ Object { }, "name": "i", "range": undefined, - "start": 749, + "start": 741, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 752, + "end": 744, "extra": Object { "raw": "0", "rawValue": 0, @@ -3597,7 +3550,7 @@ Object { }, }, "range": undefined, - "start": 751, + "start": 743, "trailingComments": undefined, "type": "NumericLiteral", "value": 0, @@ -3617,12 +3570,12 @@ Object { }, }, "range": undefined, - "start": 749, + "start": 741, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 752, + "end": 744, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -3640,7 +3593,7 @@ Object { }, }, "range": undefined, - "start": 745, + "start": 737, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -3659,14 +3612,14 @@ Object { }, }, "range": undefined, - "start": 741, + "start": 733, "test": Node { - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 755, + "end": 747, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3684,7 +3637,7 @@ Object { }, "name": "i", "range": undefined, - "start": 754, + "start": 746, "trailingComments": undefined, "type": "Identifier", }, @@ -3704,7 +3657,7 @@ Object { "range": undefined, "right": Node { "computed": false, - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3721,7 +3674,7 @@ Object { }, }, "object": Node { - "end": 759, + "end": 751, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3739,12 +3692,12 @@ Object { }, "name": "a", "range": undefined, - "start": 758, + "start": 750, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3762,16 +3715,16 @@ Object { }, "name": "length", "range": undefined, - "start": 760, + "start": 752, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 758, + "start": 750, "trailingComments": undefined, "type": "MemberExpression", }, - "start": 754, + "start": 746, "trailingComments": undefined, "type": "BinaryExpression", }, @@ -3779,7 +3732,7 @@ Object { "type": "ForStatement", "update": Node { "argument": Node { - "end": 769, + "end": 761, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3797,11 +3750,11 @@ Object { }, "name": "i", "range": undefined, - "start": 768, + "start": 760, "trailingComments": undefined, "type": "Identifier", }, - "end": 771, + "end": 763, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3820,14 +3773,14 @@ Object { "operator": "++", "prefix": false, "range": undefined, - "start": 768, + "start": 760, "trailingComments": undefined, "type": "UpdateExpression", }, }, ], "directives": Array [], - "end": 819, + "end": 811, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3844,15 +3797,15 @@ Object { }, }, "range": undefined, - "start": 575, + "start": 567, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 819, + "end": 811, "extra": undefined, "generator": false, "id": Node { - "end": 572, + "end": 564, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3870,7 +3823,7 @@ Object { }, "name": "cover", "range": undefined, - "start": 567, + "start": 559, "trailingComments": undefined, "type": "Identifier", }, @@ -3890,19 +3843,19 @@ Object { }, "params": Array [], "range": undefined, - "start": 558, + "start": 550, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 844, + "end": 836, "expression": Node { - "end": 843, + "end": 835, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 835, + "end": 827, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3920,7 +3873,7 @@ Object { }, "name": "stryCov_9fa48", "range": undefined, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "Identifier", }, @@ -3939,7 +3892,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 843, + "end": 835, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -3957,11 +3910,11 @@ Object { }, "name": "cover", "range": undefined, - "start": 838, + "start": 830, "trailingComments": undefined, "type": "Identifier", }, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -3981,16 +3934,16 @@ Object { }, }, "range": undefined, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "ExpressionStatement", }, Node { - "end": 876, + "end": 868, "expression": Node { "arguments": Array [ Node { - "end": 863, + "end": 855, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4007,12 +3960,12 @@ Object { }, }, "range": undefined, - "start": 859, + "start": 851, "trailingComments": undefined, "type": "NullLiteral", }, Node { - "end": 874, + "end": 866, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4030,14 +3983,14 @@ Object { }, "name": "arguments", "range": undefined, - "start": 865, + "start": 857, "trailingComments": undefined, "type": "Identifier", }, ], "callee": Node { "computed": false, - "end": 858, + "end": 850, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4054,7 +4007,7 @@ Object { }, }, "object": Node { - "end": 852, + "end": 844, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4072,12 +4025,12 @@ Object { }, "name": "cover", "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 858, + "end": 850, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4095,16 +4048,16 @@ Object { }, "name": "apply", "range": undefined, - "start": 853, + "start": 845, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "MemberExpression", }, - "end": 875, + "end": 867, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4121,7 +4074,7 @@ Object { }, }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "CallExpression", }, @@ -4141,13 +4094,13 @@ Object { }, }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 878, + "end": 870, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4164,15 +4117,15 @@ Object { }, }, "range": undefined, - "start": 443, + "start": 435, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 878, + "end": 870, "extra": undefined, "generator": false, "id": Node { - "end": 440, + "end": 432, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4190,7 +4143,7 @@ Object { }, "name": "stryCov_9fa48", "range": undefined, - "start": 427, + "start": 419, "trailingComments": undefined, "type": "Identifier", }, @@ -4210,7 +4163,7 @@ Object { }, "params": Array [], "range": undefined, - "start": 418, + "start": 410, "trailingComments": undefined, "type": "FunctionDeclaration", }, @@ -4221,10 +4174,10 @@ Object { Node { "declarations": Array [ Node { - "end": 936, + "end": 928, "extra": undefined, "id": Node { - "end": 919, + "end": 911, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4242,14 +4195,14 @@ Object { }, "name": "ns", "range": undefined, - "start": 917, + "start": 909, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "arguments": Array [], "callee": Node { - "end": 934, + "end": 926, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4267,11 +4220,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 922, + "start": 914, "trailingComments": undefined, "type": "Identifier", }, - "end": 936, + "end": 928, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4288,7 +4241,7 @@ Object { }, }, "range": undefined, - "start": 922, + "start": 914, "trailingComments": undefined, "type": "CallExpression", }, @@ -4307,12 +4260,12 @@ Object { }, }, "range": undefined, - "start": 917, + "start": 909, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 937, + "end": 929, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -4330,7 +4283,7 @@ Object { }, }, "range": undefined, - "start": 913, + "start": 905, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -4340,13 +4293,13 @@ Object { "body": Array [ Node { "argument": Node { - "end": 997, + "end": 989, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 990, + "end": 982, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4363,7 +4316,7 @@ Object { }, }, "object": Node { - "end": 977, + "end": 969, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4381,12 +4334,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 990, + "end": 982, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4404,12 +4357,12 @@ Object { }, "name": "activeMutant", "range": undefined, - "start": 978, + "start": 970, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "MemberExpression", }, @@ -4428,7 +4381,7 @@ Object { "operator": "===", "range": undefined, "right": Node { - "end": 997, + "end": 989, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4446,15 +4399,15 @@ Object { }, "name": "id", "range": undefined, - "start": 995, + "start": 987, "trailingComments": undefined, "type": "Identifier", }, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "BinaryExpression", }, - "end": 998, + "end": 990, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4471,13 +4424,13 @@ Object { }, }, "range": undefined, - "start": 968, + "start": 960, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 1002, + "end": 994, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4494,15 +4447,15 @@ Object { }, }, "range": undefined, - "start": 962, + "start": 954, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 1002, + "end": 994, "extra": undefined, "generator": false, "id": Node { - "end": 957, + "end": 949, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4520,7 +4473,7 @@ Object { }, "name": "isActive", "range": undefined, - "start": 949, + "start": 941, "trailingComments": undefined, "type": "Identifier", }, @@ -4540,7 +4493,7 @@ Object { }, "params": Array [ Node { - "end": 960, + "end": 952, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4558,25 +4511,25 @@ Object { }, "name": "id", "range": undefined, - "start": 958, + "start": 950, "trailingComments": undefined, "type": "Identifier", }, ], "range": undefined, - "start": 940, + "start": 932, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 1033, + "end": 1025, "expression": Node { - "end": 1032, + "end": 1024, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 1021, + "end": 1013, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4594,7 +4547,7 @@ Object { }, "name": "stryMutAct_9fa48", "range": undefined, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "Identifier", }, @@ -4613,7 +4566,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 1032, + "end": 1024, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4631,11 +4584,11 @@ Object { }, "name": "isActive", "range": undefined, - "start": 1024, + "start": 1016, "trailingComments": undefined, "type": "Identifier", }, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -4655,7 +4608,7 @@ Object { }, }, "range": undefined, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -4663,7 +4616,7 @@ Object { "argument": Node { "arguments": Array [ Node { - "end": 1054, + "end": 1046, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4681,13 +4634,13 @@ Object { }, "name": "id", "range": undefined, - "start": 1052, + "start": 1044, "trailingComments": undefined, "type": "Identifier", }, ], "callee": Node { - "end": 1051, + "end": 1043, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4705,11 +4658,11 @@ Object { }, "name": "isActive", "range": undefined, - "start": 1043, + "start": 1035, "trailingComments": undefined, "type": "Identifier", }, - "end": 1055, + "end": 1047, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4726,11 +4679,11 @@ Object { }, }, "range": undefined, - "start": 1043, + "start": 1035, "trailingComments": undefined, "type": "CallExpression", }, - "end": 1056, + "end": 1048, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4747,13 +4700,13 @@ Object { }, }, "range": undefined, - "start": 1036, + "start": 1028, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 1058, + "end": 1050, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4770,15 +4723,15 @@ Object { }, }, "range": undefined, - "start": 909, + "start": 901, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 1058, + "end": 1050, "extra": undefined, "generator": false, "id": Node { - "end": 904, + "end": 896, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4796,7 +4749,7 @@ Object { }, "name": "stryMutAct_9fa48", "range": undefined, - "start": 888, + "start": 880, "trailingComments": undefined, "type": "Identifier", }, @@ -4816,7 +4769,7 @@ Object { }, "params": Array [ Node { - "end": 907, + "end": 899, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -4834,13 +4787,13 @@ Object { }, "name": "id", "range": undefined, - "start": 905, + "start": 897, "trailingComments": undefined, "type": "Identifier", }, ], "range": undefined, - "start": 879, + "start": 871, "trailingComments": undefined, "type": "FunctionDeclaration", }, @@ -4878,8 +4831,8 @@ Object { Object { "arguments": Array [ Object { - "type": "NumericLiteral", - "value": 0, + "type": "StringLiteral", + "value": "0", }, ], "callee": Object { @@ -5048,8 +5001,8 @@ Object { "test": Object { "arguments": Array [ Object { - "type": "NumericLiteral", - "value": 0, + "type": "StringLiteral", + "value": "0", }, ], "callee": Object { @@ -5617,9 +5570,9 @@ Object { "consequent": Node { "body": Array [ Node { - "end": 298, + "end": 290, "expression": Node { - "end": 297, + "end": 289, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -5694,7 +5647,7 @@ Object { }, "loc": SourceLocation { "end": Position { - "column": 69, + "column": 61, "line": 5, }, "filename": undefined, @@ -5707,212 +5660,165 @@ Object { "operator": "=", "range": undefined, "right": Node { - "arguments": Array [ - Node { + "computed": false, + "end": 289, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 61, + "line": 5, + }, + "filename": undefined, + "identifierName": undefined, + "start": Position { + "column": 22, + "line": 5, + }, + }, + "object": Node { + "computed": false, + "end": 263, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 35, + "line": 5, + }, + "filename": undefined, + "identifierName": undefined, + "start": Position { + "column": 22, + "line": 5, + }, + }, + "object": Node { "computed": false, - "end": 296, + "end": 259, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 68, + "column": 31, "line": 5, }, "filename": undefined, "identifierName": undefined, "start": Position { - "column": 29, + "column": 22, "line": 5, }, }, "object": Node { - "computed": false, - "end": 270, + "end": 251, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 42, + "column": 23, "line": 5, }, "filename": undefined, - "identifierName": undefined, + "identifierName": "g", "start": Position { - "column": 29, + "column": 22, "line": 5, }, }, - "object": Node { - "computed": false, - "end": 266, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 38, - "line": 5, - }, - "filename": undefined, - "identifierName": undefined, - "start": Position { - "column": 29, - "line": 5, - }, - }, - "object": Node { - "end": 258, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 5, - }, - "filename": undefined, - "identifierName": "g", - "start": Position { - "column": 29, - "line": 5, - }, - }, - "name": "g", - "range": undefined, - "start": 257, - "trailingComments": undefined, - "type": "Identifier", - }, - "property": Node { - "end": 266, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 38, - "line": 5, - }, - "filename": undefined, - "identifierName": "process", - "start": Position { - "column": 31, - "line": 5, - }, - }, - "name": "process", - "range": undefined, - "start": 259, - "trailingComments": undefined, - "type": "Identifier", - }, - "range": undefined, - "start": 257, - "trailingComments": undefined, - "type": "MemberExpression", - }, - "property": Node { - "end": 270, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 42, - "line": 5, - }, - "filename": undefined, - "identifierName": "env", - "start": Position { - "column": 39, - "line": 5, - }, - }, - "name": "env", - "range": undefined, - "start": 267, - "trailingComments": undefined, - "type": "Identifier", - }, + "name": "g", "range": undefined, - "start": 257, + "start": 250, "trailingComments": undefined, - "type": "MemberExpression", + "type": "Identifier", }, "property": Node { - "end": 296, + "end": 259, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 68, + "column": 31, "line": 5, }, "filename": undefined, - "identifierName": "__STRYKER_ACTIVE_MUTANT__", + "identifierName": "process", "start": Position { - "column": 43, + "column": 24, "line": 5, }, }, - "name": "__STRYKER_ACTIVE_MUTANT__", + "name": "process", "range": undefined, - "start": 271, + "start": 252, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 257, + "start": 250, "trailingComments": undefined, "type": "MemberExpression", }, - ], - "callee": Node { - "end": 256, + "property": Node { + "end": 263, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 35, + "line": 5, + }, + "filename": undefined, + "identifierName": "env", + "start": Position { + "column": 32, + "line": 5, + }, + }, + "name": "env", + "range": undefined, + "start": 260, + "trailingComments": undefined, + "type": "Identifier", + }, + "range": undefined, + "start": 250, + "trailingComments": undefined, + "type": "MemberExpression", + }, + "property": Node { + "end": 289, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 28, + "column": 61, "line": 5, }, "filename": undefined, - "identifierName": "Number", + "identifierName": "__STRYKER_ACTIVE_MUTANT__", "start": Position { - "column": 22, + "column": 36, "line": 5, }, }, - "name": "Number", + "name": "__STRYKER_ACTIVE_MUTANT__", "range": undefined, - "start": 250, + "start": 264, "trailingComments": undefined, "type": "Identifier", }, - "end": 297, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 69, - "line": 5, - }, - "filename": undefined, - "identifierName": undefined, - "start": Position { - "column": 22, - "line": 5, - }, - }, "range": undefined, "start": 250, "trailingComments": undefined, - "type": "CallExpression", + "type": "MemberExpression", }, "start": 232, "trailingComments": undefined, @@ -5923,7 +5829,7 @@ Object { "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 70, + "column": 62, "line": 5, }, "filename": undefined, @@ -5940,7 +5846,7 @@ Object { }, ], "directives": Array [], - "end": 302, + "end": 294, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -5961,7 +5867,7 @@ Object { "trailingComments": undefined, "type": "BlockStatement", }, - "end": 302, + "end": 294, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6517,7 +6423,7 @@ Object { "body": Array [ Node { "argument": Node { - "end": 341, + "end": 333, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6535,11 +6441,11 @@ Object { }, "name": "ns", "range": undefined, - "start": 339, + "start": 331, "trailingComments": undefined, "type": "Identifier", }, - "end": 342, + "end": 334, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6556,13 +6462,13 @@ Object { }, }, "range": undefined, - "start": 332, + "start": 324, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 346, + "end": 338, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6579,15 +6485,15 @@ Object { }, }, "range": undefined, - "start": 326, + "start": 318, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 346, + "end": 338, "extra": undefined, "generator": false, "id": Node { - "end": 324, + "end": 316, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6605,7 +6511,7 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 314, + "start": 306, "trailingComments": undefined, "type": "Identifier", }, @@ -6625,19 +6531,19 @@ Object { }, "params": Array [], "range": undefined, - "start": 305, + "start": 297, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 375, + "end": 367, "expression": Node { - "end": 374, + "end": 366, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 361, + "end": 353, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6655,7 +6561,7 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "Identifier", }, @@ -6674,7 +6580,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 374, + "end": 366, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6692,11 +6598,11 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 364, + "start": 356, "trailingComments": undefined, "type": "Identifier", }, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -6716,7 +6622,7 @@ Object { }, }, "range": undefined, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -6724,7 +6630,7 @@ Object { "argument": Node { "arguments": Array [], "callee": Node { - "end": 395, + "end": 387, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6742,11 +6648,11 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 385, + "start": 377, "trailingComments": undefined, "type": "Identifier", }, - "end": 397, + "end": 389, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6763,11 +6669,11 @@ Object { }, }, "range": undefined, - "start": 385, + "start": 377, "trailingComments": undefined, "type": "CallExpression", }, - "end": 398, + "end": 390, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6784,13 +6690,13 @@ Object { }, }, "range": undefined, - "start": 378, + "start": 370, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 400, + "end": 392, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6811,7 +6717,7 @@ Object { "trailingComments": undefined, "type": "BlockStatement", }, - "end": 400, + "end": 392, "extra": undefined, "generator": false, "id": Node { @@ -6858,11 +6764,11 @@ Object { "type": "FunctionDeclaration", }, Node { - "end": 416, + "end": 408, "expression": Node { "arguments": Array [], "callee": Node { - "end": 413, + "end": 405, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6880,11 +6786,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "Identifier", }, - "end": 415, + "end": 407, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6901,7 +6807,7 @@ Object { }, }, "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "CallExpression", }, @@ -6921,7 +6827,7 @@ Object { }, }, "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -6932,10 +6838,10 @@ Object { Node { "declarations": Array [ Node { - "end": 470, + "end": 462, "extra": undefined, "id": Node { - "end": 453, + "end": 445, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6953,14 +6859,14 @@ Object { }, "name": "ns", "range": undefined, - "start": 451, + "start": 443, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "arguments": Array [], "callee": Node { - "end": 468, + "end": 460, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6978,11 +6884,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 456, + "start": 448, "trailingComments": undefined, "type": "Identifier", }, - "end": 470, + "end": 462, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -6999,7 +6905,7 @@ Object { }, }, "range": undefined, - "start": 456, + "start": 448, "trailingComments": undefined, "type": "CallExpression", }, @@ -7018,12 +6924,12 @@ Object { }, }, "range": undefined, - "start": 451, + "start": 443, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 471, + "end": 463, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -7041,17 +6947,17 @@ Object { }, }, "range": undefined, - "start": 447, + "start": 439, "trailingComments": undefined, "type": "VariableDeclaration", }, Node { "declarations": Array [ Node { - "end": 554, + "end": 546, "extra": undefined, "id": Node { - "end": 481, + "end": 473, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7069,18 +6975,18 @@ Object { }, "name": "cov", "range": undefined, - "start": 478, + "start": 470, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 554, + "end": 546, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 501, + "end": 493, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7097,7 +7003,7 @@ Object { }, }, "object": Node { - "end": 486, + "end": 478, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7115,12 +7021,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 501, + "end": 493, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7138,12 +7044,12 @@ Object { }, "name": "mutantCoverage", "range": undefined, - "start": 487, + "start": 479, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "MemberExpression", }, @@ -7162,16 +7068,16 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 553, + "end": 545, "extra": Object { - "parenStart": 505, + "parenStart": 497, "parenthesized": true, }, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 523, + "end": 515, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7188,7 +7094,7 @@ Object { }, }, "object": Node { - "end": 508, + "end": 500, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7206,12 +7112,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 523, + "end": 515, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7229,12 +7135,12 @@ Object { }, "name": "mutantCoverage", "range": undefined, - "start": 509, + "start": 501, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "MemberExpression", }, @@ -7253,7 +7159,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 553, + "end": 545, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7272,11 +7178,11 @@ Object { "properties": Array [ Node { "computed": false, - "end": 538, + "end": 530, "extra": undefined, "innerComments": undefined, "key": Node { - "end": 534, + "end": 526, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7294,7 +7200,7 @@ Object { }, "name": "static", "range": undefined, - "start": 528, + "start": 520, "trailingComments": undefined, "type": "Identifier", }, @@ -7314,11 +7220,11 @@ Object { "method": false, "range": undefined, "shorthand": false, - "start": 528, + "start": 520, "trailingComments": undefined, "type": "ObjectProperty", "value": Node { - "end": 538, + "end": 530, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7336,18 +7242,18 @@ Object { }, "properties": Array [], "range": undefined, - "start": 536, + "start": 528, "trailingComments": undefined, "type": "ObjectExpression", }, }, Node { "computed": false, - "end": 551, + "end": 543, "extra": undefined, "innerComments": undefined, "key": Node { - "end": 547, + "end": 539, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7365,7 +7271,7 @@ Object { }, "name": "perTest", "range": undefined, - "start": 540, + "start": 532, "trailingComments": undefined, "type": "Identifier", }, @@ -7385,11 +7291,11 @@ Object { "method": false, "range": undefined, "shorthand": false, - "start": 540, + "start": 532, "trailingComments": undefined, "type": "ObjectProperty", "value": Node { - "end": 551, + "end": 543, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7407,22 +7313,22 @@ Object { }, "properties": Array [], "range": undefined, - "start": 549, + "start": 541, "trailingComments": undefined, "type": "ObjectExpression", }, }, ], "range": undefined, - "start": 526, + "start": 518, "trailingComments": undefined, "type": "ObjectExpression", }, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "AssignmentExpression", }, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "LogicalExpression", }, @@ -7441,12 +7347,12 @@ Object { }, }, "range": undefined, - "start": 478, + "start": 470, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 555, + "end": 547, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -7464,7 +7370,7 @@ Object { }, }, "range": undefined, - "start": 474, + "start": 466, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -7475,10 +7381,10 @@ Object { Node { "declarations": Array [ Node { - "end": 599, + "end": 591, "extra": undefined, "id": Node { - "end": 586, + "end": 578, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7496,13 +7402,13 @@ Object { }, "name": "c", "range": undefined, - "start": 585, + "start": 577, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "computed": false, - "end": 599, + "end": 591, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7519,7 +7425,7 @@ Object { }, }, "object": Node { - "end": 592, + "end": 584, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7537,12 +7443,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 589, + "start": 581, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 599, + "end": 591, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7560,12 +7466,12 @@ Object { }, "name": "static", "range": undefined, - "start": 593, + "start": 585, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 589, + "start": 581, "trailingComments": undefined, "type": "MemberExpression", }, @@ -7584,12 +7490,12 @@ Object { }, }, "range": undefined, - "start": 585, + "start": 577, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 600, + "end": 592, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -7607,7 +7513,7 @@ Object { }, }, "range": undefined, - "start": 581, + "start": 573, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -7616,14 +7522,14 @@ Object { "consequent": Node { "body": Array [ Node { - "end": 707, + "end": 699, "expression": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 636, + "end": 628, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7641,7 +7547,7 @@ Object { }, "name": "c", "range": undefined, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "Identifier", }, @@ -7660,13 +7566,13 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 668, + "end": 660, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7684,7 +7590,7 @@ Object { }, "object": Node { "computed": false, - "end": 650, + "end": 642, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7701,7 +7607,7 @@ Object { }, }, "object": Node { - "end": 642, + "end": 634, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7719,12 +7625,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 650, + "end": 642, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7742,18 +7648,18 @@ Object { }, "name": "perTest", "range": undefined, - "start": 643, + "start": 635, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "MemberExpression", }, "property": Node { "computed": false, - "end": 667, + "end": 659, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7770,7 +7676,7 @@ Object { }, }, "object": Node { - "end": 653, + "end": 645, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7788,12 +7694,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 651, + "start": 643, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 667, + "end": 659, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7811,17 +7717,17 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 654, + "start": 646, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 651, + "start": 643, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "MemberExpression", }, @@ -7840,13 +7746,13 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 700, + "end": 692, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7864,7 +7770,7 @@ Object { }, "object": Node { "computed": false, - "end": 682, + "end": 674, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7881,7 +7787,7 @@ Object { }, }, "object": Node { - "end": 674, + "end": 666, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7899,12 +7805,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 682, + "end": 674, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7922,18 +7828,18 @@ Object { }, "name": "perTest", "range": undefined, - "start": 675, + "start": 667, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "MemberExpression", }, "property": Node { "computed": false, - "end": 699, + "end": 691, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7950,7 +7856,7 @@ Object { }, }, "object": Node { - "end": 685, + "end": 677, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7968,12 +7874,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 683, + "start": 675, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 699, + "end": 691, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -7991,17 +7897,17 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 686, + "start": 678, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 683, + "start": 675, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "MemberExpression", }, @@ -8020,7 +7926,7 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8038,19 +7944,19 @@ Object { }, "properties": Array [], "range": undefined, - "start": 704, + "start": 696, "trailingComments": undefined, "type": "ObjectExpression", }, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "LogicalExpression", }, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "AssignmentExpression", }, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -8070,13 +7976,13 @@ Object { }, }, "range": undefined, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 713, + "end": 705, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8093,11 +7999,11 @@ Object { }, }, "range": undefined, - "start": 627, + "start": 619, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 713, + "end": 705, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8114,10 +8020,10 @@ Object { }, }, "range": undefined, - "start": 605, + "start": 597, "test": Node { "computed": false, - "end": 625, + "end": 617, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8134,7 +8040,7 @@ Object { }, }, "object": Node { - "end": 611, + "end": 603, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8152,12 +8058,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 609, + "start": 601, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 625, + "end": 617, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8175,12 +8081,12 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 612, + "start": 604, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 609, + "start": 601, "trailingComments": undefined, "type": "MemberExpression", }, @@ -8190,10 +8096,10 @@ Object { Node { "declarations": Array [ Node { - "end": 735, + "end": 727, "extra": undefined, "id": Node { - "end": 723, + "end": 715, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8211,12 +8117,12 @@ Object { }, "name": "a", "range": undefined, - "start": 722, + "start": 714, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 735, + "end": 727, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8234,7 +8140,7 @@ Object { }, "name": "arguments", "range": undefined, - "start": 726, + "start": 718, "trailingComments": undefined, "type": "Identifier", }, @@ -8253,12 +8159,12 @@ Object { }, }, "range": undefined, - "start": 722, + "start": 714, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 736, + "end": 728, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -8276,7 +8182,7 @@ Object { }, }, "range": undefined, - "start": 718, + "start": 710, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -8284,15 +8190,15 @@ Object { "body": Node { "body": Array [ Node { - "end": 809, + "end": 801, "expression": Node { - "end": 808, + "end": 800, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 787, + "end": 779, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8309,7 +8215,7 @@ Object { }, }, "object": Node { - "end": 781, + "end": 773, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8327,13 +8233,13 @@ Object { }, "name": "c", "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "Identifier", }, "property": Node { "computed": true, - "end": 786, + "end": 778, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8350,7 +8256,7 @@ Object { }, }, "object": Node { - "end": 783, + "end": 775, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8368,12 +8274,12 @@ Object { }, "name": "a", "range": undefined, - "start": 782, + "start": 774, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 785, + "end": 777, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8391,17 +8297,17 @@ Object { }, "name": "i", "range": undefined, - "start": 784, + "start": 776, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 782, + "start": 774, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "MemberExpression", }, @@ -8420,21 +8326,21 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 808, + "end": 800, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 803, + "end": 795, "extra": Object { - "parenStart": 790, + "parenStart": 782, "parenthesized": true, }, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 798, + "end": 790, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8451,7 +8357,7 @@ Object { }, }, "object": Node { - "end": 792, + "end": 784, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8469,13 +8375,13 @@ Object { }, "name": "c", "range": undefined, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "Identifier", }, "property": Node { "computed": true, - "end": 797, + "end": 789, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8492,7 +8398,7 @@ Object { }, }, "object": Node { - "end": 794, + "end": 786, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8510,12 +8416,12 @@ Object { }, "name": "a", "range": undefined, - "start": 793, + "start": 785, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 796, + "end": 788, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8533,17 +8439,17 @@ Object { }, "name": "i", "range": undefined, - "start": 795, + "start": 787, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 793, + "start": 785, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "MemberExpression", }, @@ -8562,7 +8468,7 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 803, + "end": 795, "extra": Object { "raw": "0", "rawValue": 0, @@ -8582,12 +8488,12 @@ Object { }, }, "range": undefined, - "start": 802, + "start": 794, "trailingComments": undefined, "type": "NumericLiteral", "value": 0, }, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "LogicalExpression", }, @@ -8606,7 +8512,7 @@ Object { "operator": "+", "range": undefined, "right": Node { - "end": 808, + "end": 800, "extra": Object { "raw": "1", "rawValue": 1, @@ -8626,16 +8532,16 @@ Object { }, }, "range": undefined, - "start": 807, + "start": 799, "trailingComments": undefined, "type": "NumericLiteral", "value": 1, }, - "start": 790, + "start": 782, "trailingComments": undefined, "type": "BinaryExpression", }, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -8655,13 +8561,13 @@ Object { }, }, "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 815, + "end": 807, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8678,19 +8584,19 @@ Object { }, }, "range": undefined, - "start": 772, + "start": 764, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 815, + "end": 807, "extra": undefined, "init": Node { "declarations": Array [ Node { - "end": 752, + "end": 744, "extra": undefined, "id": Node { - "end": 750, + "end": 742, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8708,12 +8614,12 @@ Object { }, "name": "i", "range": undefined, - "start": 749, + "start": 741, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 752, + "end": 744, "extra": Object { "raw": "0", "rawValue": 0, @@ -8733,7 +8639,7 @@ Object { }, }, "range": undefined, - "start": 751, + "start": 743, "trailingComments": undefined, "type": "NumericLiteral", "value": 0, @@ -8753,12 +8659,12 @@ Object { }, }, "range": undefined, - "start": 749, + "start": 741, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 752, + "end": 744, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -8776,7 +8682,7 @@ Object { }, }, "range": undefined, - "start": 745, + "start": 737, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -8795,14 +8701,14 @@ Object { }, }, "range": undefined, - "start": 741, + "start": 733, "test": Node { - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 755, + "end": 747, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8820,7 +8726,7 @@ Object { }, "name": "i", "range": undefined, - "start": 754, + "start": 746, "trailingComments": undefined, "type": "Identifier", }, @@ -8840,7 +8746,7 @@ Object { "range": undefined, "right": Node { "computed": false, - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8857,7 +8763,7 @@ Object { }, }, "object": Node { - "end": 759, + "end": 751, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8875,12 +8781,12 @@ Object { }, "name": "a", "range": undefined, - "start": 758, + "start": 750, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8898,16 +8804,16 @@ Object { }, "name": "length", "range": undefined, - "start": 760, + "start": 752, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 758, + "start": 750, "trailingComments": undefined, "type": "MemberExpression", }, - "start": 754, + "start": 746, "trailingComments": undefined, "type": "BinaryExpression", }, @@ -8915,7 +8821,7 @@ Object { "type": "ForStatement", "update": Node { "argument": Node { - "end": 769, + "end": 761, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8933,11 +8839,11 @@ Object { }, "name": "i", "range": undefined, - "start": 768, + "start": 760, "trailingComments": undefined, "type": "Identifier", }, - "end": 771, + "end": 763, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8956,14 +8862,14 @@ Object { "operator": "++", "prefix": false, "range": undefined, - "start": 768, + "start": 760, "trailingComments": undefined, "type": "UpdateExpression", }, }, ], "directives": Array [], - "end": 819, + "end": 811, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -8980,15 +8886,15 @@ Object { }, }, "range": undefined, - "start": 575, + "start": 567, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 819, + "end": 811, "extra": undefined, "generator": false, "id": Node { - "end": 572, + "end": 564, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9006,7 +8912,7 @@ Object { }, "name": "cover", "range": undefined, - "start": 567, + "start": 559, "trailingComments": undefined, "type": "Identifier", }, @@ -9026,19 +8932,19 @@ Object { }, "params": Array [], "range": undefined, - "start": 558, + "start": 550, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 844, + "end": 836, "expression": Node { - "end": 843, + "end": 835, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 835, + "end": 827, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9056,7 +8962,7 @@ Object { }, "name": "stryCov_9fa48", "range": undefined, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "Identifier", }, @@ -9075,7 +8981,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 843, + "end": 835, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9093,11 +8999,11 @@ Object { }, "name": "cover", "range": undefined, - "start": 838, + "start": 830, "trailingComments": undefined, "type": "Identifier", }, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -9117,16 +9023,16 @@ Object { }, }, "range": undefined, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "ExpressionStatement", }, Node { - "end": 876, + "end": 868, "expression": Node { "arguments": Array [ Node { - "end": 863, + "end": 855, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9143,12 +9049,12 @@ Object { }, }, "range": undefined, - "start": 859, + "start": 851, "trailingComments": undefined, "type": "NullLiteral", }, Node { - "end": 874, + "end": 866, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9166,14 +9072,14 @@ Object { }, "name": "arguments", "range": undefined, - "start": 865, + "start": 857, "trailingComments": undefined, "type": "Identifier", }, ], "callee": Node { "computed": false, - "end": 858, + "end": 850, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9190,7 +9096,7 @@ Object { }, }, "object": Node { - "end": 852, + "end": 844, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9208,12 +9114,12 @@ Object { }, "name": "cover", "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 858, + "end": 850, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9231,16 +9137,16 @@ Object { }, "name": "apply", "range": undefined, - "start": 853, + "start": 845, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "MemberExpression", }, - "end": 875, + "end": 867, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9257,7 +9163,7 @@ Object { }, }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "CallExpression", }, @@ -9277,13 +9183,13 @@ Object { }, }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 878, + "end": 870, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9300,15 +9206,15 @@ Object { }, }, "range": undefined, - "start": 443, + "start": 435, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 878, + "end": 870, "extra": undefined, "generator": false, "id": Node { - "end": 440, + "end": 432, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9326,7 +9232,7 @@ Object { }, "name": "stryCov_9fa48", "range": undefined, - "start": 427, + "start": 419, "trailingComments": undefined, "type": "Identifier", }, @@ -9346,7 +9252,7 @@ Object { }, "params": Array [], "range": undefined, - "start": 418, + "start": 410, "trailingComments": undefined, "type": "FunctionDeclaration", }, @@ -9357,10 +9263,10 @@ Object { Node { "declarations": Array [ Node { - "end": 936, + "end": 928, "extra": undefined, "id": Node { - "end": 919, + "end": 911, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9378,14 +9284,14 @@ Object { }, "name": "ns", "range": undefined, - "start": 917, + "start": 909, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "arguments": Array [], "callee": Node { - "end": 934, + "end": 926, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9403,11 +9309,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 922, + "start": 914, "trailingComments": undefined, "type": "Identifier", }, - "end": 936, + "end": 928, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9424,7 +9330,7 @@ Object { }, }, "range": undefined, - "start": 922, + "start": 914, "trailingComments": undefined, "type": "CallExpression", }, @@ -9443,12 +9349,12 @@ Object { }, }, "range": undefined, - "start": 917, + "start": 909, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 937, + "end": 929, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -9466,7 +9372,7 @@ Object { }, }, "range": undefined, - "start": 913, + "start": 905, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -9476,13 +9382,13 @@ Object { "body": Array [ Node { "argument": Node { - "end": 997, + "end": 989, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 990, + "end": 982, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9499,7 +9405,7 @@ Object { }, }, "object": Node { - "end": 977, + "end": 969, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9517,12 +9423,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 990, + "end": 982, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9540,12 +9446,12 @@ Object { }, "name": "activeMutant", "range": undefined, - "start": 978, + "start": 970, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "MemberExpression", }, @@ -9564,7 +9470,7 @@ Object { "operator": "===", "range": undefined, "right": Node { - "end": 997, + "end": 989, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9582,15 +9488,15 @@ Object { }, "name": "id", "range": undefined, - "start": 995, + "start": 987, "trailingComments": undefined, "type": "Identifier", }, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "BinaryExpression", }, - "end": 998, + "end": 990, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9607,13 +9513,13 @@ Object { }, }, "range": undefined, - "start": 968, + "start": 960, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 1002, + "end": 994, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9630,15 +9536,15 @@ Object { }, }, "range": undefined, - "start": 962, + "start": 954, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 1002, + "end": 994, "extra": undefined, "generator": false, "id": Node { - "end": 957, + "end": 949, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9656,7 +9562,7 @@ Object { }, "name": "isActive", "range": undefined, - "start": 949, + "start": 941, "trailingComments": undefined, "type": "Identifier", }, @@ -9676,7 +9582,7 @@ Object { }, "params": Array [ Node { - "end": 960, + "end": 952, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9694,25 +9600,25 @@ Object { }, "name": "id", "range": undefined, - "start": 958, + "start": 950, "trailingComments": undefined, "type": "Identifier", }, ], "range": undefined, - "start": 940, + "start": 932, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 1033, + "end": 1025, "expression": Node { - "end": 1032, + "end": 1024, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 1021, + "end": 1013, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9730,7 +9636,7 @@ Object { }, "name": "stryMutAct_9fa48", "range": undefined, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "Identifier", }, @@ -9749,7 +9655,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 1032, + "end": 1024, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9767,11 +9673,11 @@ Object { }, "name": "isActive", "range": undefined, - "start": 1024, + "start": 1016, "trailingComments": undefined, "type": "Identifier", }, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -9791,7 +9697,7 @@ Object { }, }, "range": undefined, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -9799,7 +9705,7 @@ Object { "argument": Node { "arguments": Array [ Node { - "end": 1054, + "end": 1046, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9817,13 +9723,13 @@ Object { }, "name": "id", "range": undefined, - "start": 1052, + "start": 1044, "trailingComments": undefined, "type": "Identifier", }, ], "callee": Node { - "end": 1051, + "end": 1043, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9841,11 +9747,11 @@ Object { }, "name": "isActive", "range": undefined, - "start": 1043, + "start": 1035, "trailingComments": undefined, "type": "Identifier", }, - "end": 1055, + "end": 1047, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9862,11 +9768,11 @@ Object { }, }, "range": undefined, - "start": 1043, + "start": 1035, "trailingComments": undefined, "type": "CallExpression", }, - "end": 1056, + "end": 1048, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9883,13 +9789,13 @@ Object { }, }, "range": undefined, - "start": 1036, + "start": 1028, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 1058, + "end": 1050, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9906,15 +9812,15 @@ Object { }, }, "range": undefined, - "start": 909, + "start": 901, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 1058, + "end": 1050, "extra": undefined, "generator": false, "id": Node { - "end": 904, + "end": 896, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9932,7 +9838,7 @@ Object { }, "name": "stryMutAct_9fa48", "range": undefined, - "start": 888, + "start": 880, "trailingComments": undefined, "type": "Identifier", }, @@ -9952,7 +9858,7 @@ Object { }, "params": Array [ Node { - "end": 907, + "end": 899, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -9970,13 +9876,13 @@ Object { }, "name": "id", "range": undefined, - "start": 905, + "start": 897, "trailingComments": undefined, "type": "Identifier", }, ], "range": undefined, - "start": 879, + "start": 871, "trailingComments": undefined, "type": "FunctionDeclaration", }, @@ -10058,8 +9964,8 @@ Object { Object { "arguments": Array [ Object { - "type": "NumericLiteral", - "value": 0, + "type": "StringLiteral", + "value": "0", }, ], "callee": Object { @@ -10228,8 +10134,8 @@ Object { "test": Object { "arguments": Array [ Object { - "type": "NumericLiteral", - "value": 0, + "type": "StringLiteral", + "value": "0", }, ], "callee": Object { @@ -10803,9 +10709,9 @@ Object { "consequent": Node { "body": Array [ Node { - "end": 298, + "end": 290, "expression": Node { - "end": 297, + "end": 289, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -10880,7 +10786,7 @@ Object { }, "loc": SourceLocation { "end": Position { - "column": 69, + "column": 61, "line": 5, }, "filename": undefined, @@ -10893,212 +10799,165 @@ Object { "operator": "=", "range": undefined, "right": Node { - "arguments": Array [ - Node { + "computed": false, + "end": 289, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 61, + "line": 5, + }, + "filename": undefined, + "identifierName": undefined, + "start": Position { + "column": 22, + "line": 5, + }, + }, + "object": Node { + "computed": false, + "end": 263, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 35, + "line": 5, + }, + "filename": undefined, + "identifierName": undefined, + "start": Position { + "column": 22, + "line": 5, + }, + }, + "object": Node { "computed": false, - "end": 296, + "end": 259, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 68, + "column": 31, "line": 5, }, "filename": undefined, "identifierName": undefined, "start": Position { - "column": 29, + "column": 22, "line": 5, }, }, "object": Node { - "computed": false, - "end": 270, + "end": 251, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 42, + "column": 23, "line": 5, }, "filename": undefined, - "identifierName": undefined, + "identifierName": "g", "start": Position { - "column": 29, + "column": 22, "line": 5, }, }, - "object": Node { - "computed": false, - "end": 266, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 38, - "line": 5, - }, - "filename": undefined, - "identifierName": undefined, - "start": Position { - "column": 29, - "line": 5, - }, - }, - "object": Node { - "end": 258, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 30, - "line": 5, - }, - "filename": undefined, - "identifierName": "g", - "start": Position { - "column": 29, - "line": 5, - }, - }, - "name": "g", - "range": undefined, - "start": 257, - "trailingComments": undefined, - "type": "Identifier", - }, - "property": Node { - "end": 266, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 38, - "line": 5, - }, - "filename": undefined, - "identifierName": "process", - "start": Position { - "column": 31, - "line": 5, - }, - }, - "name": "process", - "range": undefined, - "start": 259, - "trailingComments": undefined, - "type": "Identifier", - }, - "range": undefined, - "start": 257, - "trailingComments": undefined, - "type": "MemberExpression", - }, - "property": Node { - "end": 270, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 42, - "line": 5, - }, - "filename": undefined, - "identifierName": "env", - "start": Position { - "column": 39, - "line": 5, - }, - }, - "name": "env", - "range": undefined, - "start": 267, - "trailingComments": undefined, - "type": "Identifier", - }, + "name": "g", "range": undefined, - "start": 257, + "start": 250, "trailingComments": undefined, - "type": "MemberExpression", + "type": "Identifier", }, "property": Node { - "end": 296, + "end": 259, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 68, + "column": 31, "line": 5, }, "filename": undefined, - "identifierName": "__STRYKER_ACTIVE_MUTANT__", + "identifierName": "process", "start": Position { - "column": 43, + "column": 24, "line": 5, }, }, - "name": "__STRYKER_ACTIVE_MUTANT__", + "name": "process", "range": undefined, - "start": 271, + "start": 252, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 257, + "start": 250, "trailingComments": undefined, "type": "MemberExpression", }, - ], - "callee": Node { - "end": 256, + "property": Node { + "end": 263, + "extra": undefined, + "innerComments": undefined, + "leadingComments": undefined, + "loc": SourceLocation { + "end": Position { + "column": 35, + "line": 5, + }, + "filename": undefined, + "identifierName": "env", + "start": Position { + "column": 32, + "line": 5, + }, + }, + "name": "env", + "range": undefined, + "start": 260, + "trailingComments": undefined, + "type": "Identifier", + }, + "range": undefined, + "start": 250, + "trailingComments": undefined, + "type": "MemberExpression", + }, + "property": Node { + "end": 289, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 28, + "column": 61, "line": 5, }, "filename": undefined, - "identifierName": "Number", + "identifierName": "__STRYKER_ACTIVE_MUTANT__", "start": Position { - "column": 22, + "column": 36, "line": 5, }, }, - "name": "Number", + "name": "__STRYKER_ACTIVE_MUTANT__", "range": undefined, - "start": 250, + "start": 264, "trailingComments": undefined, "type": "Identifier", }, - "end": 297, - "extra": undefined, - "innerComments": undefined, - "leadingComments": undefined, - "loc": SourceLocation { - "end": Position { - "column": 69, - "line": 5, - }, - "filename": undefined, - "identifierName": undefined, - "start": Position { - "column": 22, - "line": 5, - }, - }, "range": undefined, "start": 250, "trailingComments": undefined, - "type": "CallExpression", + "type": "MemberExpression", }, "start": 232, "trailingComments": undefined, @@ -11109,7 +10968,7 @@ Object { "leadingComments": undefined, "loc": SourceLocation { "end": Position { - "column": 70, + "column": 62, "line": 5, }, "filename": undefined, @@ -11126,7 +10985,7 @@ Object { }, ], "directives": Array [], - "end": 302, + "end": 294, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11147,7 +11006,7 @@ Object { "trailingComments": undefined, "type": "BlockStatement", }, - "end": 302, + "end": 294, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11703,7 +11562,7 @@ Object { "body": Array [ Node { "argument": Node { - "end": 341, + "end": 333, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11721,11 +11580,11 @@ Object { }, "name": "ns", "range": undefined, - "start": 339, + "start": 331, "trailingComments": undefined, "type": "Identifier", }, - "end": 342, + "end": 334, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11742,13 +11601,13 @@ Object { }, }, "range": undefined, - "start": 332, + "start": 324, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 346, + "end": 338, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11765,15 +11624,15 @@ Object { }, }, "range": undefined, - "start": 326, + "start": 318, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 346, + "end": 338, "extra": undefined, "generator": false, "id": Node { - "end": 324, + "end": 316, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11791,7 +11650,7 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 314, + "start": 306, "trailingComments": undefined, "type": "Identifier", }, @@ -11811,19 +11670,19 @@ Object { }, "params": Array [], "range": undefined, - "start": 305, + "start": 297, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 375, + "end": 367, "expression": Node { - "end": 374, + "end": 366, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 361, + "end": 353, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11841,7 +11700,7 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "Identifier", }, @@ -11860,7 +11719,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 374, + "end": 366, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11878,11 +11737,11 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 364, + "start": 356, "trailingComments": undefined, "type": "Identifier", }, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -11902,7 +11761,7 @@ Object { }, }, "range": undefined, - "start": 349, + "start": 341, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -11910,7 +11769,7 @@ Object { "argument": Node { "arguments": Array [], "callee": Node { - "end": 395, + "end": 387, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11928,11 +11787,11 @@ Object { }, "name": "retrieveNS", "range": undefined, - "start": 385, + "start": 377, "trailingComments": undefined, "type": "Identifier", }, - "end": 397, + "end": 389, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11949,11 +11808,11 @@ Object { }, }, "range": undefined, - "start": 385, + "start": 377, "trailingComments": undefined, "type": "CallExpression", }, - "end": 398, + "end": 390, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11970,13 +11829,13 @@ Object { }, }, "range": undefined, - "start": 378, + "start": 370, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 400, + "end": 392, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -11997,7 +11856,7 @@ Object { "trailingComments": undefined, "type": "BlockStatement", }, - "end": 400, + "end": 392, "extra": undefined, "generator": false, "id": Node { @@ -12044,11 +11903,11 @@ Object { "type": "FunctionDeclaration", }, Node { - "end": 416, + "end": 408, "expression": Node { "arguments": Array [], "callee": Node { - "end": 413, + "end": 405, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12066,11 +11925,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "Identifier", }, - "end": 415, + "end": 407, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12087,7 +11946,7 @@ Object { }, }, "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "CallExpression", }, @@ -12107,7 +11966,7 @@ Object { }, }, "range": undefined, - "start": 401, + "start": 393, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -12118,10 +11977,10 @@ Object { Node { "declarations": Array [ Node { - "end": 470, + "end": 462, "extra": undefined, "id": Node { - "end": 453, + "end": 445, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12139,14 +11998,14 @@ Object { }, "name": "ns", "range": undefined, - "start": 451, + "start": 443, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "arguments": Array [], "callee": Node { - "end": 468, + "end": 460, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12164,11 +12023,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 456, + "start": 448, "trailingComments": undefined, "type": "Identifier", }, - "end": 470, + "end": 462, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12185,7 +12044,7 @@ Object { }, }, "range": undefined, - "start": 456, + "start": 448, "trailingComments": undefined, "type": "CallExpression", }, @@ -12204,12 +12063,12 @@ Object { }, }, "range": undefined, - "start": 451, + "start": 443, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 471, + "end": 463, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -12227,17 +12086,17 @@ Object { }, }, "range": undefined, - "start": 447, + "start": 439, "trailingComments": undefined, "type": "VariableDeclaration", }, Node { "declarations": Array [ Node { - "end": 554, + "end": 546, "extra": undefined, "id": Node { - "end": 481, + "end": 473, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12255,18 +12114,18 @@ Object { }, "name": "cov", "range": undefined, - "start": 478, + "start": 470, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 554, + "end": 546, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 501, + "end": 493, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12283,7 +12142,7 @@ Object { }, }, "object": Node { - "end": 486, + "end": 478, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12301,12 +12160,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 501, + "end": 493, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12324,12 +12183,12 @@ Object { }, "name": "mutantCoverage", "range": undefined, - "start": 487, + "start": 479, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "MemberExpression", }, @@ -12348,16 +12207,16 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 553, + "end": 545, "extra": Object { - "parenStart": 505, + "parenStart": 497, "parenthesized": true, }, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 523, + "end": 515, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12374,7 +12233,7 @@ Object { }, }, "object": Node { - "end": 508, + "end": 500, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12392,12 +12251,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 523, + "end": 515, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12415,12 +12274,12 @@ Object { }, "name": "mutantCoverage", "range": undefined, - "start": 509, + "start": 501, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "MemberExpression", }, @@ -12439,7 +12298,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 553, + "end": 545, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12458,11 +12317,11 @@ Object { "properties": Array [ Node { "computed": false, - "end": 538, + "end": 530, "extra": undefined, "innerComments": undefined, "key": Node { - "end": 534, + "end": 526, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12480,7 +12339,7 @@ Object { }, "name": "static", "range": undefined, - "start": 528, + "start": 520, "trailingComments": undefined, "type": "Identifier", }, @@ -12500,11 +12359,11 @@ Object { "method": false, "range": undefined, "shorthand": false, - "start": 528, + "start": 520, "trailingComments": undefined, "type": "ObjectProperty", "value": Node { - "end": 538, + "end": 530, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12522,18 +12381,18 @@ Object { }, "properties": Array [], "range": undefined, - "start": 536, + "start": 528, "trailingComments": undefined, "type": "ObjectExpression", }, }, Node { "computed": false, - "end": 551, + "end": 543, "extra": undefined, "innerComments": undefined, "key": Node { - "end": 547, + "end": 539, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12551,7 +12410,7 @@ Object { }, "name": "perTest", "range": undefined, - "start": 540, + "start": 532, "trailingComments": undefined, "type": "Identifier", }, @@ -12571,11 +12430,11 @@ Object { "method": false, "range": undefined, "shorthand": false, - "start": 540, + "start": 532, "trailingComments": undefined, "type": "ObjectProperty", "value": Node { - "end": 551, + "end": 543, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12593,22 +12452,22 @@ Object { }, "properties": Array [], "range": undefined, - "start": 549, + "start": 541, "trailingComments": undefined, "type": "ObjectExpression", }, }, ], "range": undefined, - "start": 526, + "start": 518, "trailingComments": undefined, "type": "ObjectExpression", }, - "start": 506, + "start": 498, "trailingComments": undefined, "type": "AssignmentExpression", }, - "start": 484, + "start": 476, "trailingComments": undefined, "type": "LogicalExpression", }, @@ -12627,12 +12486,12 @@ Object { }, }, "range": undefined, - "start": 478, + "start": 470, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 555, + "end": 547, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -12650,7 +12509,7 @@ Object { }, }, "range": undefined, - "start": 474, + "start": 466, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -12661,10 +12520,10 @@ Object { Node { "declarations": Array [ Node { - "end": 599, + "end": 591, "extra": undefined, "id": Node { - "end": 586, + "end": 578, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12682,13 +12541,13 @@ Object { }, "name": "c", "range": undefined, - "start": 585, + "start": 577, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "computed": false, - "end": 599, + "end": 591, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12705,7 +12564,7 @@ Object { }, }, "object": Node { - "end": 592, + "end": 584, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12723,12 +12582,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 589, + "start": 581, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 599, + "end": 591, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12746,12 +12605,12 @@ Object { }, "name": "static", "range": undefined, - "start": 593, + "start": 585, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 589, + "start": 581, "trailingComments": undefined, "type": "MemberExpression", }, @@ -12770,12 +12629,12 @@ Object { }, }, "range": undefined, - "start": 585, + "start": 577, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 600, + "end": 592, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -12793,7 +12652,7 @@ Object { }, }, "range": undefined, - "start": 581, + "start": 573, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -12802,14 +12661,14 @@ Object { "consequent": Node { "body": Array [ Node { - "end": 707, + "end": 699, "expression": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 636, + "end": 628, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12827,7 +12686,7 @@ Object { }, "name": "c", "range": undefined, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "Identifier", }, @@ -12846,13 +12705,13 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 668, + "end": 660, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12870,7 +12729,7 @@ Object { }, "object": Node { "computed": false, - "end": 650, + "end": 642, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12887,7 +12746,7 @@ Object { }, }, "object": Node { - "end": 642, + "end": 634, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12905,12 +12764,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 650, + "end": 642, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12928,18 +12787,18 @@ Object { }, "name": "perTest", "range": undefined, - "start": 643, + "start": 635, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "MemberExpression", }, "property": Node { "computed": false, - "end": 667, + "end": 659, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12956,7 +12815,7 @@ Object { }, }, "object": Node { - "end": 653, + "end": 645, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12974,12 +12833,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 651, + "start": 643, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 667, + "end": 659, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -12997,17 +12856,17 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 654, + "start": 646, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 651, + "start": 643, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "MemberExpression", }, @@ -13026,13 +12885,13 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 700, + "end": 692, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13050,7 +12909,7 @@ Object { }, "object": Node { "computed": false, - "end": 682, + "end": 674, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13067,7 +12926,7 @@ Object { }, }, "object": Node { - "end": 674, + "end": 666, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13085,12 +12944,12 @@ Object { }, "name": "cov", "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 682, + "end": 674, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13108,18 +12967,18 @@ Object { }, "name": "perTest", "range": undefined, - "start": 675, + "start": 667, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "MemberExpression", }, "property": Node { "computed": false, - "end": 699, + "end": 691, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13136,7 +12995,7 @@ Object { }, }, "object": Node { - "end": 685, + "end": 677, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13154,12 +13013,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 683, + "start": 675, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 699, + "end": 691, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13177,17 +13036,17 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 686, + "start": 678, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 683, + "start": 675, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "MemberExpression", }, @@ -13206,7 +13065,7 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 706, + "end": 698, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13224,19 +13083,19 @@ Object { }, "properties": Array [], "range": undefined, - "start": 704, + "start": 696, "trailingComments": undefined, "type": "ObjectExpression", }, - "start": 671, + "start": 663, "trailingComments": undefined, "type": "LogicalExpression", }, - "start": 639, + "start": 631, "trailingComments": undefined, "type": "AssignmentExpression", }, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -13256,13 +13115,13 @@ Object { }, }, "range": undefined, - "start": 635, + "start": 627, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 713, + "end": 705, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13279,11 +13138,11 @@ Object { }, }, "range": undefined, - "start": 627, + "start": 619, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 713, + "end": 705, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13300,10 +13159,10 @@ Object { }, }, "range": undefined, - "start": 605, + "start": 597, "test": Node { "computed": false, - "end": 625, + "end": 617, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13320,7 +13179,7 @@ Object { }, }, "object": Node { - "end": 611, + "end": 603, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13338,12 +13197,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 609, + "start": 601, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 625, + "end": 617, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13361,12 +13220,12 @@ Object { }, "name": "currentTestId", "range": undefined, - "start": 612, + "start": 604, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 609, + "start": 601, "trailingComments": undefined, "type": "MemberExpression", }, @@ -13376,10 +13235,10 @@ Object { Node { "declarations": Array [ Node { - "end": 735, + "end": 727, "extra": undefined, "id": Node { - "end": 723, + "end": 715, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13397,12 +13256,12 @@ Object { }, "name": "a", "range": undefined, - "start": 722, + "start": 714, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 735, + "end": 727, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13420,7 +13279,7 @@ Object { }, "name": "arguments", "range": undefined, - "start": 726, + "start": 718, "trailingComments": undefined, "type": "Identifier", }, @@ -13439,12 +13298,12 @@ Object { }, }, "range": undefined, - "start": 722, + "start": 714, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 736, + "end": 728, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -13462,7 +13321,7 @@ Object { }, }, "range": undefined, - "start": 718, + "start": 710, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -13470,15 +13329,15 @@ Object { "body": Node { "body": Array [ Node { - "end": 809, + "end": 801, "expression": Node { - "end": 808, + "end": 800, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 787, + "end": 779, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13495,7 +13354,7 @@ Object { }, }, "object": Node { - "end": 781, + "end": 773, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13513,13 +13372,13 @@ Object { }, "name": "c", "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "Identifier", }, "property": Node { "computed": true, - "end": 786, + "end": 778, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13536,7 +13395,7 @@ Object { }, }, "object": Node { - "end": 783, + "end": 775, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13554,12 +13413,12 @@ Object { }, "name": "a", "range": undefined, - "start": 782, + "start": 774, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 785, + "end": 777, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13577,17 +13436,17 @@ Object { }, "name": "i", "range": undefined, - "start": 784, + "start": 776, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 782, + "start": 774, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "MemberExpression", }, @@ -13606,21 +13465,21 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 808, + "end": 800, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 803, + "end": 795, "extra": Object { - "parenStart": 790, + "parenStart": 782, "parenthesized": true, }, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": true, - "end": 798, + "end": 790, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13637,7 +13496,7 @@ Object { }, }, "object": Node { - "end": 792, + "end": 784, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13655,13 +13514,13 @@ Object { }, "name": "c", "range": undefined, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "Identifier", }, "property": Node { "computed": true, - "end": 797, + "end": 789, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13678,7 +13537,7 @@ Object { }, }, "object": Node { - "end": 794, + "end": 786, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13696,12 +13555,12 @@ Object { }, "name": "a", "range": undefined, - "start": 793, + "start": 785, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 796, + "end": 788, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13719,17 +13578,17 @@ Object { }, "name": "i", "range": undefined, - "start": 795, + "start": 787, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 793, + "start": 785, "trailingComments": undefined, "type": "MemberExpression", }, "range": undefined, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "MemberExpression", }, @@ -13748,7 +13607,7 @@ Object { "operator": "||", "range": undefined, "right": Node { - "end": 803, + "end": 795, "extra": Object { "raw": "0", "rawValue": 0, @@ -13768,12 +13627,12 @@ Object { }, }, "range": undefined, - "start": 802, + "start": 794, "trailingComments": undefined, "type": "NumericLiteral", "value": 0, }, - "start": 791, + "start": 783, "trailingComments": undefined, "type": "LogicalExpression", }, @@ -13792,7 +13651,7 @@ Object { "operator": "+", "range": undefined, "right": Node { - "end": 808, + "end": 800, "extra": Object { "raw": "1", "rawValue": 1, @@ -13812,16 +13671,16 @@ Object { }, }, "range": undefined, - "start": 807, + "start": 799, "trailingComments": undefined, "type": "NumericLiteral", "value": 1, }, - "start": 790, + "start": 782, "trailingComments": undefined, "type": "BinaryExpression", }, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -13841,13 +13700,13 @@ Object { }, }, "range": undefined, - "start": 780, + "start": 772, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 815, + "end": 807, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13864,19 +13723,19 @@ Object { }, }, "range": undefined, - "start": 772, + "start": 764, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 815, + "end": 807, "extra": undefined, "init": Node { "declarations": Array [ Node { - "end": 752, + "end": 744, "extra": undefined, "id": Node { - "end": 750, + "end": 742, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -13894,12 +13753,12 @@ Object { }, "name": "i", "range": undefined, - "start": 749, + "start": 741, "trailingComments": undefined, "type": "Identifier", }, "init": Node { - "end": 752, + "end": 744, "extra": Object { "raw": "0", "rawValue": 0, @@ -13919,7 +13778,7 @@ Object { }, }, "range": undefined, - "start": 751, + "start": 743, "trailingComments": undefined, "type": "NumericLiteral", "value": 0, @@ -13939,12 +13798,12 @@ Object { }, }, "range": undefined, - "start": 749, + "start": 741, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 752, + "end": 744, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -13962,7 +13821,7 @@ Object { }, }, "range": undefined, - "start": 745, + "start": 737, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -13981,14 +13840,14 @@ Object { }, }, "range": undefined, - "start": 741, + "start": 733, "test": Node { - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 755, + "end": 747, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14006,7 +13865,7 @@ Object { }, "name": "i", "range": undefined, - "start": 754, + "start": 746, "trailingComments": undefined, "type": "Identifier", }, @@ -14026,7 +13885,7 @@ Object { "range": undefined, "right": Node { "computed": false, - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14043,7 +13902,7 @@ Object { }, }, "object": Node { - "end": 759, + "end": 751, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14061,12 +13920,12 @@ Object { }, "name": "a", "range": undefined, - "start": 758, + "start": 750, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 766, + "end": 758, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14084,16 +13943,16 @@ Object { }, "name": "length", "range": undefined, - "start": 760, + "start": 752, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 758, + "start": 750, "trailingComments": undefined, "type": "MemberExpression", }, - "start": 754, + "start": 746, "trailingComments": undefined, "type": "BinaryExpression", }, @@ -14101,7 +13960,7 @@ Object { "type": "ForStatement", "update": Node { "argument": Node { - "end": 769, + "end": 761, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14119,11 +13978,11 @@ Object { }, "name": "i", "range": undefined, - "start": 768, + "start": 760, "trailingComments": undefined, "type": "Identifier", }, - "end": 771, + "end": 763, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14142,14 +14001,14 @@ Object { "operator": "++", "prefix": false, "range": undefined, - "start": 768, + "start": 760, "trailingComments": undefined, "type": "UpdateExpression", }, }, ], "directives": Array [], - "end": 819, + "end": 811, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14166,15 +14025,15 @@ Object { }, }, "range": undefined, - "start": 575, + "start": 567, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 819, + "end": 811, "extra": undefined, "generator": false, "id": Node { - "end": 572, + "end": 564, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14192,7 +14051,7 @@ Object { }, "name": "cover", "range": undefined, - "start": 567, + "start": 559, "trailingComments": undefined, "type": "Identifier", }, @@ -14212,19 +14071,19 @@ Object { }, "params": Array [], "range": undefined, - "start": 558, + "start": 550, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 844, + "end": 836, "expression": Node { - "end": 843, + "end": 835, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 835, + "end": 827, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14242,7 +14101,7 @@ Object { }, "name": "stryCov_9fa48", "range": undefined, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "Identifier", }, @@ -14261,7 +14120,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 843, + "end": 835, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14279,11 +14138,11 @@ Object { }, "name": "cover", "range": undefined, - "start": 838, + "start": 830, "trailingComments": undefined, "type": "Identifier", }, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -14303,16 +14162,16 @@ Object { }, }, "range": undefined, - "start": 822, + "start": 814, "trailingComments": undefined, "type": "ExpressionStatement", }, Node { - "end": 876, + "end": 868, "expression": Node { "arguments": Array [ Node { - "end": 863, + "end": 855, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14329,12 +14188,12 @@ Object { }, }, "range": undefined, - "start": 859, + "start": 851, "trailingComments": undefined, "type": "NullLiteral", }, Node { - "end": 874, + "end": 866, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14352,14 +14211,14 @@ Object { }, "name": "arguments", "range": undefined, - "start": 865, + "start": 857, "trailingComments": undefined, "type": "Identifier", }, ], "callee": Node { "computed": false, - "end": 858, + "end": 850, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14376,7 +14235,7 @@ Object { }, }, "object": Node { - "end": 852, + "end": 844, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14394,12 +14253,12 @@ Object { }, "name": "cover", "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 858, + "end": 850, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14417,16 +14276,16 @@ Object { }, "name": "apply", "range": undefined, - "start": 853, + "start": 845, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "MemberExpression", }, - "end": 875, + "end": 867, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14443,7 +14302,7 @@ Object { }, }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "CallExpression", }, @@ -14463,13 +14322,13 @@ Object { }, }, "range": undefined, - "start": 847, + "start": 839, "trailingComments": undefined, "type": "ExpressionStatement", }, ], "directives": Array [], - "end": 878, + "end": 870, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14486,15 +14345,15 @@ Object { }, }, "range": undefined, - "start": 443, + "start": 435, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 878, + "end": 870, "extra": undefined, "generator": false, "id": Node { - "end": 440, + "end": 432, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14512,7 +14371,7 @@ Object { }, "name": "stryCov_9fa48", "range": undefined, - "start": 427, + "start": 419, "trailingComments": undefined, "type": "Identifier", }, @@ -14532,7 +14391,7 @@ Object { }, "params": Array [], "range": undefined, - "start": 418, + "start": 410, "trailingComments": undefined, "type": "FunctionDeclaration", }, @@ -14543,10 +14402,10 @@ Object { Node { "declarations": Array [ Node { - "end": 936, + "end": 928, "extra": undefined, "id": Node { - "end": 919, + "end": 911, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14564,14 +14423,14 @@ Object { }, "name": "ns", "range": undefined, - "start": 917, + "start": 909, "trailingComments": undefined, "type": "Identifier", }, "init": Node { "arguments": Array [], "callee": Node { - "end": 934, + "end": 926, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14589,11 +14448,11 @@ Object { }, "name": "stryNS_9fa48", "range": undefined, - "start": 922, + "start": 914, "trailingComments": undefined, "type": "Identifier", }, - "end": 936, + "end": 928, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14610,7 +14469,7 @@ Object { }, }, "range": undefined, - "start": 922, + "start": 914, "trailingComments": undefined, "type": "CallExpression", }, @@ -14629,12 +14488,12 @@ Object { }, }, "range": undefined, - "start": 917, + "start": 909, "trailingComments": undefined, "type": "VariableDeclarator", }, ], - "end": 937, + "end": 929, "extra": undefined, "innerComments": undefined, "kind": "var", @@ -14652,7 +14511,7 @@ Object { }, }, "range": undefined, - "start": 913, + "start": 905, "trailingComments": undefined, "type": "VariableDeclaration", }, @@ -14662,13 +14521,13 @@ Object { "body": Array [ Node { "argument": Node { - "end": 997, + "end": 989, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { "computed": false, - "end": 990, + "end": 982, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14685,7 +14544,7 @@ Object { }, }, "object": Node { - "end": 977, + "end": 969, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14703,12 +14562,12 @@ Object { }, "name": "ns", "range": undefined, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "Identifier", }, "property": Node { - "end": 990, + "end": 982, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14726,12 +14585,12 @@ Object { }, "name": "activeMutant", "range": undefined, - "start": 978, + "start": 970, "trailingComments": undefined, "type": "Identifier", }, "range": undefined, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "MemberExpression", }, @@ -14750,7 +14609,7 @@ Object { "operator": "===", "range": undefined, "right": Node { - "end": 997, + "end": 989, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14768,15 +14627,15 @@ Object { }, "name": "id", "range": undefined, - "start": 995, + "start": 987, "trailingComments": undefined, "type": "Identifier", }, - "start": 975, + "start": 967, "trailingComments": undefined, "type": "BinaryExpression", }, - "end": 998, + "end": 990, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14793,13 +14652,13 @@ Object { }, }, "range": undefined, - "start": 968, + "start": 960, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 1002, + "end": 994, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14816,15 +14675,15 @@ Object { }, }, "range": undefined, - "start": 962, + "start": 954, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 1002, + "end": 994, "extra": undefined, "generator": false, "id": Node { - "end": 957, + "end": 949, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14842,7 +14701,7 @@ Object { }, "name": "isActive", "range": undefined, - "start": 949, + "start": 941, "trailingComments": undefined, "type": "Identifier", }, @@ -14862,7 +14721,7 @@ Object { }, "params": Array [ Node { - "end": 960, + "end": 952, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14880,25 +14739,25 @@ Object { }, "name": "id", "range": undefined, - "start": 958, + "start": 950, "trailingComments": undefined, "type": "Identifier", }, ], "range": undefined, - "start": 940, + "start": 932, "trailingComments": undefined, "type": "FunctionDeclaration", }, Node { - "end": 1033, + "end": 1025, "expression": Node { - "end": 1032, + "end": 1024, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, "left": Node { - "end": 1021, + "end": 1013, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14916,7 +14775,7 @@ Object { }, "name": "stryMutAct_9fa48", "range": undefined, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "Identifier", }, @@ -14935,7 +14794,7 @@ Object { "operator": "=", "range": undefined, "right": Node { - "end": 1032, + "end": 1024, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -14953,11 +14812,11 @@ Object { }, "name": "isActive", "range": undefined, - "start": 1024, + "start": 1016, "trailingComments": undefined, "type": "Identifier", }, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "AssignmentExpression", }, @@ -14977,7 +14836,7 @@ Object { }, }, "range": undefined, - "start": 1005, + "start": 997, "trailingComments": undefined, "type": "ExpressionStatement", }, @@ -14985,7 +14844,7 @@ Object { "argument": Node { "arguments": Array [ Node { - "end": 1054, + "end": 1046, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -15003,13 +14862,13 @@ Object { }, "name": "id", "range": undefined, - "start": 1052, + "start": 1044, "trailingComments": undefined, "type": "Identifier", }, ], "callee": Node { - "end": 1051, + "end": 1043, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -15027,11 +14886,11 @@ Object { }, "name": "isActive", "range": undefined, - "start": 1043, + "start": 1035, "trailingComments": undefined, "type": "Identifier", }, - "end": 1055, + "end": 1047, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -15048,11 +14907,11 @@ Object { }, }, "range": undefined, - "start": 1043, + "start": 1035, "trailingComments": undefined, "type": "CallExpression", }, - "end": 1056, + "end": 1048, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -15069,13 +14928,13 @@ Object { }, }, "range": undefined, - "start": 1036, + "start": 1028, "trailingComments": undefined, "type": "ReturnStatement", }, ], "directives": Array [], - "end": 1058, + "end": 1050, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -15092,15 +14951,15 @@ Object { }, }, "range": undefined, - "start": 909, + "start": 901, "trailingComments": undefined, "type": "BlockStatement", }, - "end": 1058, + "end": 1050, "extra": undefined, "generator": false, "id": Node { - "end": 904, + "end": 896, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -15118,7 +14977,7 @@ Object { }, "name": "stryMutAct_9fa48", "range": undefined, - "start": 888, + "start": 880, "trailingComments": undefined, "type": "Identifier", }, @@ -15138,7 +14997,7 @@ Object { }, "params": Array [ Node { - "end": 907, + "end": 899, "extra": undefined, "innerComments": undefined, "leadingComments": undefined, @@ -15156,13 +15015,13 @@ Object { }, "name": "id", "range": undefined, - "start": 905, + "start": 897, "trailingComments": undefined, "type": "Identifier", }, ], "range": undefined, - "start": 879, + "start": 871, "trailingComments": undefined, "type": "FunctionDeclaration", }, @@ -15200,8 +15059,8 @@ Object { Object { "arguments": Array [ Object { - "type": "NumericLiteral", - "value": 0, + "type": "StringLiteral", + "value": "0", }, ], "callee": Object { @@ -15370,8 +15229,8 @@ Object { "test": Object { "arguments": Array [ Object { - "type": "NumericLiteral", - "value": 0, + "type": "StringLiteral", + "value": "0", }, ], "callee": Object { diff --git a/packages/instrumenter/test/unit/mutant-placers/expression-mutant-placer.spec.ts b/packages/instrumenter/test/unit/mutant-placers/expression-mutant-placer.spec.ts index 3322f445f3..57e08c9b67 100644 --- a/packages/instrumenter/test/unit/mutant-placers/expression-mutant-placer.spec.ts +++ b/packages/instrumenter/test/unit/mutant-placers/expression-mutant-placer.spec.ts @@ -22,7 +22,7 @@ describe(expressionMutantPlacer.name, () => { function arrangeSingleMutant() { const ast = parseJS('const foo = a + b'); const binaryExpression = findNodePath(ast, (p) => p.isBinaryExpression()); - const mutant = new Mutant(1, 'file.js', { + const mutant = new Mutant('1', 'file.js', { original: binaryExpression.node, replacement: types.binaryExpression('>>>', types.identifier('bar'), types.identifier('baz')), mutatorName: 'fooMutator', @@ -40,7 +40,7 @@ describe(expressionMutantPlacer.name, () => { // Assert expect(actual).true; - expect(actualCode).contains('const foo = stryMutAct_9fa48(1) ? bar >>> baz'); + expect(actualCode).contains('const foo = stryMutAct_9fa48("1") ? bar >>> baz'); }); it('should place the original code as the alternative', () => { @@ -56,7 +56,7 @@ describe(expressionMutantPlacer.name, () => { expressionMutantPlacer(binaryExpression, [mutant]); const actualAlternative = findNodePath(ast, (p) => p.isConditionalExpression()).node.alternate; const actualAlternativeCode = generate(actualAlternative).code; - const expected = 'stryCov_9fa48(1), a + b'; + const expected = 'stryCov_9fa48("1"), a + b'; expect(actualAlternativeCode.startsWith(expected), `${actualAlternativeCode} did not start with "${expected}"`).true; }); @@ -66,12 +66,12 @@ describe(expressionMutantPlacer.name, () => { const binaryExpression = findNodePath(ast, (p) => p.isBinaryExpression()); const mutants = [ createMutant({ - id: 52, + id: '52', original: binaryExpression.node, replacement: types.binaryExpression('-', types.identifier('bar'), types.identifier('baz')), }), createMutant({ - id: 659, + id: '659', original: binaryExpression.node, replacement: types.identifier('bar'), }), @@ -82,7 +82,7 @@ describe(expressionMutantPlacer.name, () => { const actualCode = normalizeWhitespaces(generate(ast).code); // Assert - expect(actualCode).contains('const foo = stryMutAct_9fa48(659) ? bar : stryMutAct_9fa48(52) ? bar - baz'); + expect(actualCode).contains('const foo = stryMutAct_9fa48("659") ? bar : stryMutAct_9fa48("52") ? bar - baz'); }); describe('object literals', () => { @@ -107,7 +107,7 @@ describe(expressionMutantPlacer.name, () => { function arrangeActAssert(ast: types.File, expression: NodePath, expectedMatch: RegExp) { const mutants = [ createMutant({ - id: 4, + id: '4', original: expression.node, replacement: types.identifier('bar'), }), diff --git a/packages/instrumenter/test/unit/mutant-placers/statement-mutant-placer.spec.ts b/packages/instrumenter/test/unit/mutant-placers/statement-mutant-placer.spec.ts index af90c1b02c..b434abc9e6 100644 --- a/packages/instrumenter/test/unit/mutant-placers/statement-mutant-placer.spec.ts +++ b/packages/instrumenter/test/unit/mutant-placers/statement-mutant-placer.spec.ts @@ -27,7 +27,7 @@ describe(statementMutantPlacer.name, () => { const ast = parseJS('const foo = a + b'); const statement = findNodePath(ast, (p) => p.isVariableDeclaration()); const nodeToMutate = findNodePath(ast, (p) => p.isBinaryExpression()); - const mutant = new Mutant(1, 'file.js', { + const mutant = new Mutant('1', 'file.js', { original: nodeToMutate.node, replacement: types.binaryExpression('>>>', types.identifier('bar'), types.identifier('baz')), mutatorName: 'fooMutator', @@ -45,7 +45,7 @@ describe(statementMutantPlacer.name, () => { // Assert expect(actual).true; - expect(actualCode).contains(normalizeWhitespaces('if (stryMutAct_9fa48(1)) { const foo = bar >>> baz; } else ')); + expect(actualCode).contains(normalizeWhitespaces('if (stryMutAct_9fa48("1")) { const foo = bar >>> baz; } else ')); }); it('should keep block statements in tact', () => { @@ -78,7 +78,7 @@ describe(statementMutantPlacer.name, () => { const { ast, mutant, statement } = arrangeSingleMutant(); statementMutantPlacer(statement, [mutant]); const actualCode = normalizeWhitespaces(generate(ast).code); - expect(actualCode).matches(/else\s*{\s*stryCov_9fa48\(1\)/); + expect(actualCode).matches(/else\s*{\s*stryCov_9fa48\("1"\)/); }); it('should be able to place multiple mutants', () => { @@ -88,12 +88,12 @@ describe(statementMutantPlacer.name, () => { const binaryExpression = findNodePath(ast, (p) => p.isBinaryExpression()); const fooIdentifier = findNodePath(ast, (p) => p.isIdentifier()); const mutants = [ - new Mutant(52, 'file.js', { + new Mutant('52', 'file.js', { original: binaryExpression.node, replacement: types.binaryExpression('>>>', types.identifier('bar'), types.identifier('baz')), mutatorName: 'fooMutator', }), - new Mutant(659, 'file.js', { + new Mutant('659', 'file.js', { original: fooIdentifier.node, replacement: types.identifier('bar'), mutatorName: 'fooMutator', @@ -106,12 +106,12 @@ describe(statementMutantPlacer.name, () => { // Assert expect(actualCode).contains( - normalizeWhitespaces(`if (stryMutAct_9fa48(659)) { + normalizeWhitespaces(`if (stryMutAct_9fa48("659")) { const bar = a + b; - } else if (stryMutAct_9fa48(52)) { + } else if (stryMutAct_9fa48("52")) { const foo = bar >>> baz; } else { - stryCov_9fa48(52, 659)`) + stryCov_9fa48("52", "659")`) ); }); }); diff --git a/packages/instrumenter/test/unit/mutant-placers/switch-case-mutant-placer.spec.ts b/packages/instrumenter/test/unit/mutant-placers/switch-case-mutant-placer.spec.ts index 013d88ef60..0407c5e852 100644 --- a/packages/instrumenter/test/unit/mutant-placers/switch-case-mutant-placer.spec.ts +++ b/packages/instrumenter/test/unit/mutant-placers/switch-case-mutant-placer.spec.ts @@ -38,7 +38,7 @@ describe(sut.name, () => { it('should place a mutant in the "consequent" part of a switch-case', () => { // Arrange - const mutant = createMutant({ id: 42, original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }); + const mutant = createMutant({ id: '42', original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }); // Act const actual = sut(switchCase, [mutant]); @@ -46,12 +46,12 @@ describe(sut.name, () => { // Assert expect(actual).true; - expect(actualCode).contains(normalizeWhitespaces('switch (foo) { case "bar": if (stryMutAct_9fa48(42))')); + expect(actualCode).contains(normalizeWhitespaces('switch (foo) { case "bar": if (stryMutAct_9fa48("42"))')); }); it('should place the original code as alternative (inside `else`)', () => { // Arrange - const mutant = createMutant({ id: 42, original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }); + const mutant = createMutant({ id: '42', original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }); // Act const actual = sut(switchCase, [mutant]); @@ -64,7 +64,7 @@ describe(sut.name, () => { it('should add mutant coverage syntax', () => { // Arrange - const mutant = createMutant({ id: 42, original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }); + const mutant = createMutant({ id: '42', original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }); // Act const actual = sut(switchCase, [mutant]); @@ -72,15 +72,15 @@ describe(sut.name, () => { // Assert expect(actual).true; - expect(actualCode).matches(/else\s*{\s*stryCov_9fa48\(42\)/); + expect(actualCode).matches(/else\s*{\s*stryCov_9fa48\("42"\)/); }); it('should be able to place multiple mutants', () => { // Arrange const mutants = [ - createMutant({ id: 42, original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }), + createMutant({ id: '42', original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), []) }), createMutant({ - id: 156, + id: '156', original: switchCase.node, replacement: types.switchCase(types.stringLiteral('bar'), [types.expressionStatement(types.callExpression(types.identifier('foo'), []))]), }), @@ -92,11 +92,11 @@ describe(sut.name, () => { // Assert expect(actualCode).contains( - normalizeWhitespaces(`if (stryMutAct_9fa48(156)) { + normalizeWhitespaces(`if (stryMutAct_9fa48("156")) { foo(); - } else if (stryMutAct_9fa48(42)) {} + } else if (stryMutAct_9fa48("42")) {} else { - stryCov_9fa48(42, 156)`) + stryCov_9fa48("42", "156")`) ); }); }); diff --git a/packages/instrumenter/test/unit/mutant.spec.ts b/packages/instrumenter/test/unit/mutant.spec.ts index 6ed81a3f55..7f919d1143 100644 --- a/packages/instrumenter/test/unit/mutant.spec.ts +++ b/packages/instrumenter/test/unit/mutant.spec.ts @@ -15,7 +15,7 @@ describe(Mutant.name, () => { // Arrange const original = types.binaryExpression('+', types.numericLiteral(40), types.numericLiteral(2)); const replacement = types.binaryExpression('-', types.numericLiteral(40), types.numericLiteral(2)); - const mutant = new Mutant(2, 'file.js', { original, replacement, mutatorName: 'fooMutator' }); + const mutant = new Mutant('2', 'file.js', { original, replacement, mutatorName: 'fooMutator' }); // Act replacement.operator = '%'; @@ -27,7 +27,7 @@ describe(Mutant.name, () => { describe(Mutant.prototype.toApiMutant.name, () => { it('should map all properties as expected for an ignored mutant', () => { - const mutant = new Mutant(2, 'file.js', { + const mutant = new Mutant('2', 'file.js', { original: types.stringLiteral(''), replacement: types.stringLiteral('Stryker was here!'), mutatorName: 'fooMutator', @@ -46,7 +46,7 @@ describe(Mutant.name, () => { }); it('should map all properties as expected for a placed mutant', () => { - const mutant = new Mutant(2, 'file.js', { + const mutant = new Mutant('2', 'file.js', { original: types.stringLiteral(''), replacement: types.stringLiteral('Stryker was here!'), mutatorName: 'fooMutator', @@ -67,7 +67,7 @@ describe(Mutant.name, () => { // Arrange const lt = findNodePath(parseJS('if(a < b) { console.log("hello world"); }'), (p) => p.isBinaryExpression()).node; const lte = types.binaryExpression('<=', lt.left, lt.right); - const mutant = new Mutant(1, 'bar.js', { original: lt, replacement: lte, mutatorName: 'barMutator' }); + const mutant = new Mutant('1', 'bar.js', { original: lt, replacement: lte, mutatorName: 'barMutator' }); // Act const actual = mutant.toApiMutant(); diff --git a/packages/instrumenter/test/unit/transformers/mutant-collector.spec.ts b/packages/instrumenter/test/unit/transformers/mutant-collector.spec.ts index 5724613be5..9fc1f34515 100644 --- a/packages/instrumenter/test/unit/transformers/mutant-collector.spec.ts +++ b/packages/instrumenter/test/unit/transformers/mutant-collector.spec.ts @@ -24,7 +24,7 @@ describe(MutantCollector.name, () => { expect(sut.mutants).deep.eq([ createMutant({ fileName, - id: 0, + id: '0', original, replacement, }), @@ -41,7 +41,7 @@ describe(MutantCollector.name, () => { expect(sut.mutants[1]).deep.eq( createMutant({ fileName, - id: 1, + id: '1', original, replacement, }) diff --git a/packages/instrumenter/testResources/instrumenter/app.component.ts.out.snap b/packages/instrumenter/testResources/instrumenter/app.component.ts.out.snap index dd3e7e79b5..a8a716b134 100644 --- a/packages/instrumenter/testResources/instrumenter/app.component.ts.out.snap +++ b/packages/instrumenter/testResources/instrumenter/app.component.ts.out.snap @@ -6,7 +6,7 @@ exports[`instrumenter integration should be able to instrument an angular compon var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -62,6 +62,6 @@ import { Component } from '@angular/core'; styleUrls: ['./app.component.scss'] }) export class AppComponent { - title = stryMutAct_9fa48(0) ? \\"\\" : (stryCov_9fa48(0), 'angular-app'); + title = stryMutAct_9fa48(\\"0\\") ? \\"\\" : (stryCov_9fa48(\\"0\\"), 'angular-app'); }" `; diff --git a/packages/instrumenter/testResources/instrumenter/html-sample.html.out.snap b/packages/instrumenter/testResources/instrumenter/html-sample.html.out.snap index 6b663eb18b..8cbb80f078 100644 --- a/packages/instrumenter/testResources/instrumenter/html-sample.html.out.snap +++ b/packages/instrumenter/testResources/instrumenter/html-sample.html.out.snap @@ -17,7 +17,7 @@ function stryNS_9fa48() { var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -67,11 +67,11 @@ function stryMutAct_9fa48(id) { } function add(a, b) { - if (stryMutAct_9fa48(0)) { + if (stryMutAct_9fa48(\\"0\\")) { {} } else { - stryCov_9fa48(0); - return stryMutAct_9fa48(1) ? a - b : (stryCov_9fa48(1), a + b); + stryCov_9fa48(\\"0\\"); + return stryMutAct_9fa48(\\"1\\") ? a - b : (stryCov_9fa48(\\"1\\"), a + b); } } diff --git a/packages/instrumenter/testResources/instrumenter/ignore.js.out.snap b/packages/instrumenter/testResources/instrumenter/ignore.js.out.snap index b060f79dfe..3f72e94779 100644 --- a/packages/instrumenter/testResources/instrumenter/ignore.js.out.snap +++ b/packages/instrumenter/testResources/instrumenter/ignore.js.out.snap @@ -6,7 +6,7 @@ exports[`instrumenter integration should not place ignored mutants 1`] = ` var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -56,10 +56,10 @@ function stryMutAct_9fa48(id) { } function add(a, b) { - if (stryMutAct_9fa48(0)) { + if (stryMutAct_9fa48(\\"0\\")) { {} } else { - stryCov_9fa48(0); + stryCov_9fa48(\\"0\\"); return a + b; } }" diff --git a/packages/instrumenter/testResources/instrumenter/js-sample.js.out.snap b/packages/instrumenter/testResources/instrumenter/js-sample.js.out.snap index 3e464ff6ac..92c0a0f4af 100644 --- a/packages/instrumenter/testResources/instrumenter/js-sample.js.out.snap +++ b/packages/instrumenter/testResources/instrumenter/js-sample.js.out.snap @@ -6,7 +6,7 @@ exports[`instrumenter integration should be able to instrument a simple js file var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -56,11 +56,11 @@ function stryMutAct_9fa48(id) { } function add(a, b) { - if (stryMutAct_9fa48(0)) { + if (stryMutAct_9fa48(\\"0\\")) { {} } else { - stryCov_9fa48(0); - return stryMutAct_9fa48(1) ? a - b : (stryCov_9fa48(1), a + b); + stryCov_9fa48(\\"0\\"); + return stryMutAct_9fa48(\\"1\\") ? a - b : (stryCov_9fa48(\\"1\\"), a + b); } } diff --git a/packages/instrumenter/testResources/instrumenter/lit-html-sample.ts.out.snap b/packages/instrumenter/testResources/instrumenter/lit-html-sample.ts.out.snap index cee223251a..e64a1310e3 100644 --- a/packages/instrumenter/testResources/instrumenter/lit-html-sample.ts.out.snap +++ b/packages/instrumenter/testResources/instrumenter/lit-html-sample.ts.out.snap @@ -6,7 +6,7 @@ exports[`instrumenter integration should be able to instrument a lit-html file 1 var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -67,32 +67,32 @@ export class MutationTestReportTotalsComponent extends LitElement { @property() public thresholds: Thresholds | undefined; @property() - public currentPath: string[] = stryMutAct_9fa48(0) ? [\\"Stryker was here\\"] : (stryCov_9fa48(0), []); - private readonly fileIcon = stryMutAct_9fa48(1) ? svg\`\` : (stryCov_9fa48(1), svg\`\`); - private readonly directoryIcon = stryMutAct_9fa48(2) ? svg\`\` : (stryCov_9fa48(2), svg\`\`); + public currentPath: string[] = stryMutAct_9fa48(\\"0\\") ? [\\"Stryker was here\\"] : (stryCov_9fa48(\\"0\\"), []); + private readonly fileIcon = stryMutAct_9fa48(\\"1\\") ? svg\`\` : (stryCov_9fa48(\\"1\\"), svg\`\`); + private readonly directoryIcon = stryMutAct_9fa48(\\"2\\") ? svg\`\` : (stryCov_9fa48(\\"2\\"), svg\`\`); public render() { - if (stryMutAct_9fa48(3)) { + if (stryMutAct_9fa48(\\"3\\")) { {} } else { - stryCov_9fa48(3); + stryCov_9fa48(\\"3\\"); - if (stryMutAct_9fa48(5) ? false : stryMutAct_9fa48(4) ? true : (stryCov_9fa48(4, 5), this.model)) { - if (stryMutAct_9fa48(6)) { + if (stryMutAct_9fa48(\\"5\\") ? false : stryMutAct_9fa48(\\"4\\") ? true : (stryCov_9fa48(\\"4\\", \\"5\\"), this.model)) { + if (stryMutAct_9fa48(\\"6\\")) { {} } else { - stryCov_9fa48(6); - return stryMutAct_9fa48(7) ? html\`\` : (stryCov_9fa48(7), html\` + stryCov_9fa48(\\"6\\"); + return stryMutAct_9fa48(\\"7\\") ? html\`\` : (stryCov_9fa48(\\"7\\"), html\` \${this.renderHead()} \${this.renderTableBody(this.model)}
\`); } } else { - if (stryMutAct_9fa48(8)) { + if (stryMutAct_9fa48(\\"8\\")) { {} } else { - stryCov_9fa48(8); + stryCov_9fa48(\\"8\\"); return undefined; } } @@ -100,11 +100,11 @@ export class MutationTestReportTotalsComponent extends LitElement { } private renderHead() { - if (stryMutAct_9fa48(9)) { + if (stryMutAct_9fa48(\\"9\\")) { {} } else { - stryCov_9fa48(9); - return stryMutAct_9fa48(10) ? html\`\` : (stryCov_9fa48(10), html\` + stryCov_9fa48(\\"9\\"); + return stryMutAct_9fa48(\\"10\\") ? html\`\` : (stryCov_9fa48(\\"10\\"), html\`
File / Directory
@@ -148,41 +148,41 @@ export class MutationTestReportTotalsComponent extends LitElement { } private renderTableBody(model: MetricsResult) { - if (stryMutAct_9fa48(11)) { + if (stryMutAct_9fa48(\\"11\\")) { {} } else { - stryCov_9fa48(11); + stryCov_9fa48(\\"11\\"); const renderChildren = () => { - if (stryMutAct_9fa48(12)) { + if (stryMutAct_9fa48(\\"12\\")) { {} } else { - stryCov_9fa48(12); + stryCov_9fa48(\\"12\\"); - if (stryMutAct_9fa48(14) ? false : stryMutAct_9fa48(13) ? true : (stryCov_9fa48(13, 14), model.file)) { - if (stryMutAct_9fa48(15)) { + if (stryMutAct_9fa48(\\"14\\") ? false : stryMutAct_9fa48(\\"13\\") ? true : (stryCov_9fa48(\\"13\\", \\"14\\"), model.file)) { + if (stryMutAct_9fa48(\\"15\\")) { {} } else { - stryCov_9fa48(15); + stryCov_9fa48(\\"15\\"); return undefined; } } else { - if (stryMutAct_9fa48(16)) { + if (stryMutAct_9fa48(\\"16\\")) { {} } else { - stryCov_9fa48(16); + stryCov_9fa48(\\"16\\"); return model.childResults.map(childResult => { - if (stryMutAct_9fa48(17)) { + if (stryMutAct_9fa48(\\"17\\")) { {} } else { - stryCov_9fa48(17); + stryCov_9fa48(\\"17\\"); let fullName: string = childResult.name; - while (stryMutAct_9fa48(19) ? !childResult.file || childResult.childResults.length === 1 : stryMutAct_9fa48(18) ? false : (stryCov_9fa48(18, 19), (stryMutAct_9fa48(20) ? childResult.file : (stryCov_9fa48(20), !childResult.file)) && (stryMutAct_9fa48(23) ? childResult.childResults.length !== 1 : stryMutAct_9fa48(22) ? false : stryMutAct_9fa48(21) ? true : (stryCov_9fa48(21, 22, 23), childResult.childResults.length === 1)))) { - if (stryMutAct_9fa48(24)) { + while (stryMutAct_9fa48(\\"19\\") ? !childResult.file || childResult.childResults.length === 1 : stryMutAct_9fa48(\\"18\\") ? false : (stryCov_9fa48(\\"18\\", \\"19\\"), (stryMutAct_9fa48(\\"20\\") ? childResult.file : (stryCov_9fa48(\\"20\\"), !childResult.file)) && (stryMutAct_9fa48(\\"23\\") ? childResult.childResults.length !== 1 : stryMutAct_9fa48(\\"22\\") ? false : stryMutAct_9fa48(\\"21\\") ? true : (stryCov_9fa48(\\"21\\", \\"22\\", \\"23\\"), childResult.childResults.length === 1)))) { + if (stryMutAct_9fa48(\\"24\\")) { {} } else { - stryCov_9fa48(24); + stryCov_9fa48(\\"24\\"); childResult = childResult.childResults[0]; fullName = pathJoin(fullName, childResult.name); } @@ -196,7 +196,7 @@ export class MutationTestReportTotalsComponent extends LitElement { } }; - return stryMutAct_9fa48(25) ? html\`\` : (stryCov_9fa48(25), html\` + return stryMutAct_9fa48(\\"25\\") ? html\`\` : (stryCov_9fa48(\\"25\\"), html\` \${this.renderRow(model.name, model, undefined)} \${renderChildren()} @@ -205,26 +205,26 @@ export class MutationTestReportTotalsComponent extends LitElement { } private renderRow(name: string, row: MetricsResult, path: string | undefined) { - if (stryMutAct_9fa48(26)) { + if (stryMutAct_9fa48(\\"26\\")) { {} } else { - stryCov_9fa48(26); + stryCov_9fa48(\\"26\\"); const { mutationScore } = row.metrics; - const scoreIsPresent = stryMutAct_9fa48(27) ? isNaN(mutationScore) : (stryCov_9fa48(27), !isNaN(mutationScore)); + const scoreIsPresent = stryMutAct_9fa48(\\"27\\") ? isNaN(mutationScore) : (stryCov_9fa48(\\"27\\"), !isNaN(mutationScore)); const coloringClass = this.determineColoringClass(mutationScore); const mutationScoreRounded = mutationScore.toFixed(2); - const progressBarStyle = stryMutAct_9fa48(28) ? \`\` : (stryCov_9fa48(28), \`width: \${mutationScore}%\`); - return stryMutAct_9fa48(29) ? html\`\` : (stryCov_9fa48(29), html\` + const progressBarStyle = stryMutAct_9fa48(\\"28\\") ? \`\` : (stryCov_9fa48(\\"28\\"), \`width: \${mutationScore}%\`); + return stryMutAct_9fa48(\\"29\\") ? html\`\` : (stryCov_9fa48(\\"29\\"), html\` \${row.file ? this.fileIcon : this.directoryIcon} \${(stryMutAct_9fa48(32) ? typeof path !== 'string' : stryMutAct_9fa48(31) ? false : stryMutAct_9fa48(30) ? true : (stryCov_9fa48(30, 31, 32), typeof path === (stryMutAct_9fa48(33) ? \\"\\" : (stryCov_9fa48(33), 'string')))) ? stryMutAct_9fa48(34) ? html\`\` : (stryCov_9fa48(34), html\`\${name}\`) : stryMutAct_9fa48(35) ? html\`\` : (stryCov_9fa48(35), html\`\${row.name}\`)}\${(stryMutAct_9fa48(\\"32\\") ? typeof path !== 'string' : stryMutAct_9fa48(\\"31\\") ? false : stryMutAct_9fa48(\\"30\\") ? true : (stryCov_9fa48(\\"30\\", \\"31\\", \\"32\\"), typeof path === (stryMutAct_9fa48(\\"33\\") ? \\"\\" : (stryCov_9fa48(\\"33\\"), 'string')))) ? stryMutAct_9fa48(\\"34\\") ? html\`\` : (stryCov_9fa48(\\"34\\"), html\`\${name}\`) : stryMutAct_9fa48(\\"35\\") ? html\`\` : (stryCov_9fa48(\\"35\\"), html\`\${row.name}\`)} - \${scoreIsPresent ? stryMutAct_9fa48(36) ? html\`\` : (stryCov_9fa48(36), html\`
+ \${scoreIsPresent ? stryMutAct_9fa48(\\"36\\") ? html\`\` : (stryCov_9fa48(\\"36\\"), html\`
\${mutationScoreRounded}%
-
\`) : stryMutAct_9fa48(37) ? html\`\` : (stryCov_9fa48(37), html\` N/A \`)} +
\`) : stryMutAct_9fa48(\\"37\\") ? html\`\` : (stryCov_9fa48(\\"37\\"), html\` N/A \`)} \${scoreIsPresent ? mutationScoreRounded : undefined} @@ -255,46 +255,46 @@ export class MutationTestReportTotalsComponent extends LitElement { } private determineColoringClass(mutationScore: number) { - if (stryMutAct_9fa48(38)) { + if (stryMutAct_9fa48(\\"38\\")) { {} } else { - stryCov_9fa48(38); + stryCov_9fa48(\\"38\\"); - if (stryMutAct_9fa48(41) ? !isNaN(mutationScore) || this.thresholds : stryMutAct_9fa48(40) ? false : stryMutAct_9fa48(39) ? true : (stryCov_9fa48(39, 40, 41), (stryMutAct_9fa48(42) ? isNaN(mutationScore) : (stryCov_9fa48(42), !isNaN(mutationScore))) && this.thresholds)) { - if (stryMutAct_9fa48(43)) { + if (stryMutAct_9fa48(\\"41\\") ? !isNaN(mutationScore) || this.thresholds : stryMutAct_9fa48(\\"40\\") ? false : stryMutAct_9fa48(\\"39\\") ? true : (stryCov_9fa48(\\"39\\", \\"40\\", \\"41\\"), (stryMutAct_9fa48(\\"42\\") ? isNaN(mutationScore) : (stryCov_9fa48(\\"42\\"), !isNaN(mutationScore))) && this.thresholds)) { + if (stryMutAct_9fa48(\\"43\\")) { {} } else { - stryCov_9fa48(43); + stryCov_9fa48(\\"43\\"); - if (stryMutAct_9fa48(47) ? mutationScore >= this.thresholds.low : stryMutAct_9fa48(46) ? mutationScore <= this.thresholds.low : stryMutAct_9fa48(45) ? false : stryMutAct_9fa48(44) ? true : (stryCov_9fa48(44, 45, 46, 47), mutationScore < this.thresholds.low)) { - if (stryMutAct_9fa48(48)) { + if (stryMutAct_9fa48(\\"47\\") ? mutationScore >= this.thresholds.low : stryMutAct_9fa48(\\"46\\") ? mutationScore <= this.thresholds.low : stryMutAct_9fa48(\\"45\\") ? false : stryMutAct_9fa48(\\"44\\") ? true : (stryCov_9fa48(\\"44\\", \\"45\\", \\"46\\", \\"47\\"), mutationScore < this.thresholds.low)) { + if (stryMutAct_9fa48(\\"48\\")) { {} } else { - stryCov_9fa48(48); - return stryMutAct_9fa48(49) ? \\"\\" : (stryCov_9fa48(49), 'danger'); + stryCov_9fa48(\\"48\\"); + return stryMutAct_9fa48(\\"49\\") ? \\"\\" : (stryCov_9fa48(\\"49\\"), 'danger'); } - } else if (stryMutAct_9fa48(53) ? mutationScore >= this.thresholds.high : stryMutAct_9fa48(52) ? mutationScore <= this.thresholds.high : stryMutAct_9fa48(51) ? false : stryMutAct_9fa48(50) ? true : (stryCov_9fa48(50, 51, 52, 53), mutationScore < this.thresholds.high)) { - if (stryMutAct_9fa48(54)) { + } else if (stryMutAct_9fa48(\\"53\\") ? mutationScore >= this.thresholds.high : stryMutAct_9fa48(\\"52\\") ? mutationScore <= this.thresholds.high : stryMutAct_9fa48(\\"51\\") ? false : stryMutAct_9fa48(\\"50\\") ? true : (stryCov_9fa48(\\"50\\", \\"51\\", \\"52\\", \\"53\\"), mutationScore < this.thresholds.high)) { + if (stryMutAct_9fa48(\\"54\\")) { {} } else { - stryCov_9fa48(54); - return stryMutAct_9fa48(55) ? \\"\\" : (stryCov_9fa48(55), 'warning'); + stryCov_9fa48(\\"54\\"); + return stryMutAct_9fa48(\\"55\\") ? \\"\\" : (stryCov_9fa48(\\"55\\"), 'warning'); } } else { - if (stryMutAct_9fa48(56)) { + if (stryMutAct_9fa48(\\"56\\")) { {} } else { - stryCov_9fa48(56); - return stryMutAct_9fa48(57) ? \\"\\" : (stryCov_9fa48(57), 'success'); + stryCov_9fa48(\\"56\\"); + return stryMutAct_9fa48(\\"57\\") ? \\"\\" : (stryCov_9fa48(\\"57\\"), 'success'); } } } } else { - if (stryMutAct_9fa48(58)) { + if (stryMutAct_9fa48(\\"58\\")) { {} } else { - stryCov_9fa48(58); - return stryMutAct_9fa48(59) ? \\"\\" : (stryCov_9fa48(59), 'default'); + stryCov_9fa48(\\"58\\"); + return stryMutAct_9fa48(\\"59\\") ? \\"\\" : (stryCov_9fa48(\\"59\\"), 'default'); } } } diff --git a/packages/instrumenter/testResources/instrumenter/shebang.js.out.snap b/packages/instrumenter/testResources/instrumenter/shebang.js.out.snap index 239391de3d..164d9a1264 100644 --- a/packages/instrumenter/testResources/instrumenter/shebang.js.out.snap +++ b/packages/instrumenter/testResources/instrumenter/shebang.js.out.snap @@ -8,7 +8,7 @@ function stryNS_9fa48() { var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -57,5 +57,5 @@ function stryMutAct_9fa48(id) { return isActive(id); } -console.log(stryMutAct_9fa48(0) ? \\"\\" : (stryCov_9fa48(0), 'test'));" +console.log(stryMutAct_9fa48(\\"0\\") ? \\"\\" : (stryCov_9fa48(\\"0\\"), 'test'));" `; diff --git a/packages/instrumenter/testResources/instrumenter/super-call.ts.out.snap b/packages/instrumenter/testResources/instrumenter/super-call.ts.out.snap index 70d4976668..da4ba9e87e 100644 --- a/packages/instrumenter/testResources/instrumenter/super-call.ts.out.snap +++ b/packages/instrumenter/testResources/instrumenter/super-call.ts.out.snap @@ -6,7 +6,7 @@ exports[`instrumenter integration should be able to instrument super calls 1`] = var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -57,7 +57,7 @@ function stryMutAct_9fa48(id) { export class InjectionError extends TypedInjectError { constructor(public readonly path: InjectionTarget[], public readonly cause: Error) { - super(stryMutAct_9fa48(0) ? \`\` : (stryCov_9fa48(0), \`Could not \${describeInjectAction(path[0])} \${path.map(name).join(stryMutAct_9fa48(1) ? \\"\\" : (stryCov_9fa48(1), ' -> '))}. Cause: \${cause.message}\`)); + super(stryMutAct_9fa48(\\"0\\") ? \`\` : (stryCov_9fa48(\\"0\\"), \`Could not \${describeInjectAction(path[0])} \${path.map(name).join(stryMutAct_9fa48(\\"1\\") ? \\"\\" : (stryCov_9fa48(\\"1\\"), ' -> '))}. Cause: \${cause.message}\`)); } }" diff --git a/packages/instrumenter/testResources/instrumenter/switch-case.js.out.snap b/packages/instrumenter/testResources/instrumenter/switch-case.js.out.snap index 4fa31ea6dc..bb10c3627e 100644 --- a/packages/instrumenter/testResources/instrumenter/switch-case.js.out.snap +++ b/packages/instrumenter/testResources/instrumenter/switch-case.js.out.snap @@ -6,7 +6,7 @@ exports[`instrumenter integration should be able to instrument switch case state var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -56,17 +56,17 @@ function stryMutAct_9fa48(id) { } switch (foo) { - case stryMutAct_9fa48(1) ? \\"\\" : (stryCov_9fa48(1), 'bar'): - if (stryMutAct_9fa48(0)) {} else { - stryCov_9fa48(0); - console.log(stryMutAct_9fa48(2) ? \\"\\" : (stryCov_9fa48(2), 'bar')); + case stryMutAct_9fa48(\\"1\\") ? \\"\\" : (stryCov_9fa48(\\"1\\"), 'bar'): + if (stryMutAct_9fa48(\\"0\\")) {} else { + stryCov_9fa48(\\"0\\"); + console.log(stryMutAct_9fa48(\\"2\\") ? \\"\\" : (stryCov_9fa48(\\"2\\"), 'bar')); break; } - case stryMutAct_9fa48(4) ? \\"\\" : (stryCov_9fa48(4), 'baz'): - if (stryMutAct_9fa48(3)) {} else { - stryCov_9fa48(3); - console.log(stryMutAct_9fa48(5) ? \\"\\" : (stryCov_9fa48(5), 'baz')); + case stryMutAct_9fa48(\\"4\\") ? \\"\\" : (stryCov_9fa48(\\"4\\"), 'baz'): + if (stryMutAct_9fa48(\\"3\\")) {} else { + stryCov_9fa48(\\"3\\"); + console.log(stryMutAct_9fa48(\\"5\\") ? \\"\\" : (stryCov_9fa48(\\"5\\"), 'baz')); break; } diff --git a/packages/instrumenter/testResources/instrumenter/ts-sample.ts.out.snap b/packages/instrumenter/testResources/instrumenter/ts-sample.ts.out.snap index 5319f0f1d3..8a3ad3631d 100644 --- a/packages/instrumenter/testResources/instrumenter/ts-sample.ts.out.snap +++ b/packages/instrumenter/testResources/instrumenter/ts-sample.ts.out.snap @@ -6,7 +6,7 @@ exports[`instrumenter integration should be able to instrument a simple ts file var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -55,32 +55,32 @@ function stryMutAct_9fa48(id) { return isActive(id); } -const bar: number = stryMutAct_9fa48(0) ? 40 - 2 : (stryCov_9fa48(0), 40 + 2); +const bar: number = stryMutAct_9fa48(\\"0\\") ? 40 - 2 : (stryCov_9fa48(\\"0\\"), 40 + 2); class Person { - #name = stryMutAct_9fa48(1) ? \\"\\" : (stryCov_9fa48(1), 'unknown'); + #name = stryMutAct_9fa48(\\"1\\") ? \\"\\" : (stryCov_9fa48(\\"1\\"), 'unknown'); get name(): string { - if (stryMutAct_9fa48(2)) { + if (stryMutAct_9fa48(\\"2\\")) { {} } else { - stryCov_9fa48(2); + stryCov_9fa48(\\"2\\"); return this.#name; } } set name(value: string) { - if (stryMutAct_9fa48(3)) { + if (stryMutAct_9fa48(\\"3\\")) { {} } else { - stryCov_9fa48(3); + stryCov_9fa48(\\"3\\"); - if (stryMutAct_9fa48(7) ? value.length >= 2 : stryMutAct_9fa48(6) ? value.length <= 2 : stryMutAct_9fa48(5) ? false : stryMutAct_9fa48(4) ? true : (stryCov_9fa48(4, 5, 6, 7), value.length < 2)) { - if (stryMutAct_9fa48(8)) { + if (stryMutAct_9fa48(\\"7\\") ? value.length >= 2 : stryMutAct_9fa48(\\"6\\") ? value.length <= 2 : stryMutAct_9fa48(\\"5\\") ? false : stryMutAct_9fa48(\\"4\\") ? true : (stryCov_9fa48(\\"4\\", \\"5\\", \\"6\\", \\"7\\"), value.length < 2)) { + if (stryMutAct_9fa48(\\"8\\")) { {} } else { - stryCov_9fa48(8); - throw new Error(stryMutAct_9fa48(9) ? \\"\\" : (stryCov_9fa48(9), 'Name should be at least 2 characters long')); + stryCov_9fa48(\\"8\\"); + throw new Error(stryMutAct_9fa48(\\"9\\") ? \\"\\" : (stryCov_9fa48(\\"9\\"), 'Name should be at least 2 characters long')); } } diff --git a/packages/instrumenter/testResources/instrumenter/vue-sample.vue.out.snap b/packages/instrumenter/testResources/instrumenter/vue-sample.vue.out.snap index 7d66b34bc1..fe812a52ce 100644 --- a/packages/instrumenter/testResources/instrumenter/vue-sample.vue.out.snap +++ b/packages/instrumenter/testResources/instrumenter/vue-sample.vue.out.snap @@ -47,7 +47,7 @@ function stryNS_9fa48() { var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -96,32 +96,32 @@ function stryMutAct_9fa48(id) { return isActive(id); } -export default stryMutAct_9fa48(0) ? {} : (stryCov_9fa48(0), { - name: stryMutAct_9fa48(1) ? \\"\\" : (stryCov_9fa48(1), 'HelloWorld'), +export default stryMutAct_9fa48(\\"0\\") ? {} : (stryCov_9fa48(\\"0\\"), { + name: stryMutAct_9fa48(\\"1\\") ? \\"\\" : (stryCov_9fa48(\\"1\\"), 'HelloWorld'), data() { - if (stryMutAct_9fa48(2)) { + if (stryMutAct_9fa48(\\"2\\")) { {} } else { - stryCov_9fa48(2); - return stryMutAct_9fa48(3) ? {} : (stryCov_9fa48(3), { - msg: stryMutAct_9fa48(4) ? \\"\\" : (stryCov_9fa48(4), 'Welcome to Your Vue.js App') + stryCov_9fa48(\\"2\\"); + return stryMutAct_9fa48(\\"3\\") ? {} : (stryCov_9fa48(\\"3\\"), { + msg: stryMutAct_9fa48(\\"4\\") ? \\"\\" : (stryCov_9fa48(\\"4\\"), 'Welcome to Your Vue.js App') }); } }, - watch: stryMutAct_9fa48(5) ? {} : (stryCov_9fa48(5), { + watch: stryMutAct_9fa48(\\"5\\") ? {} : (stryCov_9fa48(\\"5\\"), { 'category.type'(categoryType) { - if (stryMutAct_9fa48(6)) { + if (stryMutAct_9fa48(\\"6\\")) { {} } else { - stryCov_9fa48(6); + stryCov_9fa48(\\"6\\"); - if (stryMutAct_9fa48(9) ? this.isNew || this.category : stryMutAct_9fa48(8) ? false : stryMutAct_9fa48(7) ? true : (stryCov_9fa48(7, 8, 9), this.isNew && this.category)) { - if (stryMutAct_9fa48(10)) { + if (stryMutAct_9fa48(\\"9\\") ? this.isNew || this.category : stryMutAct_9fa48(\\"8\\") ? false : stryMutAct_9fa48(\\"7\\") ? true : (stryCov_9fa48(\\"7\\", \\"8\\", \\"9\\"), this.isNew && this.category)) { + if (stryMutAct_9fa48(\\"10\\")) { {} } else { - stryCov_9fa48(10); + stryCov_9fa48(\\"10\\"); this.category.permissions = getDefaultDocumentCategoryPermissions(categoryType); } } @@ -137,7 +137,7 @@ function stryNS_9fa48() { var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -186,7 +186,7 @@ function stryMutAct_9fa48(id) { return isActive(id); } -const b = stryMutAct_9fa48(11) ? a - c : (stryCov_9fa48(11), a + c); +const b = stryMutAct_9fa48(\\"11\\") ? a - c : (stryCov_9fa48(\\"11\\"), a + c); diff --git a/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts b/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts index e63e48f60d..99221c604a 100644 --- a/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts +++ b/packages/jasmine-runner/test/unit/jasmine-test-runner.spec.ts @@ -72,7 +72,7 @@ describe(JasmineTestRunner.name, () => { it('should set the activeMutant on global scope', async () => { actEmptyMutantRun(undefined, factory.mutant({ id: '23' })); - expect(global.__stryker2__?.activeMutant).eq(23); + expect(global.__stryker2__?.activeMutant).eq('23'); }); function actEmptyMutantRun(testFilter?: string[], activeMutant = factory.mutant(), sandboxFileName = 'sandbox/file') { diff --git a/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Player.js b/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Player.js index 0e2e05da89..b0fbd5e638 100644 --- a/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Player.js +++ b/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Player.js @@ -4,7 +4,7 @@ var ns = g.__stryker2__ || (g.__stryker2__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -56,52 +56,52 @@ function stryMutAct_9fa48(id) { function Player() {} Player.prototype.play = function (song) { - if (stryMutAct_9fa48(0)) { + if (stryMutAct_9fa48("0")) { {} } else { - stryCov_9fa48(0); + stryCov_9fa48("0"); this.currentlyPlayingSong = song; - this.isPlaying = stryMutAct_9fa48(1) ? false : (stryCov_9fa48(1), true); + this.isPlaying = stryMutAct_9fa48("1") ? false : (stryCov_9fa48("1"), true); } }; Player.prototype.pause = function () { - if (stryMutAct_9fa48(2)) { + if (stryMutAct_9fa48("2")) { {} } else { - stryCov_9fa48(2); - this.isPlaying = stryMutAct_9fa48(3) ? true : (stryCov_9fa48(3), false); + stryCov_9fa48("2"); + this.isPlaying = stryMutAct_9fa48("3") ? true : (stryCov_9fa48("3"), false); } }; Player.prototype.resume = function () { - if (stryMutAct_9fa48(4)) { + if (stryMutAct_9fa48("4")) { {} } else { - stryCov_9fa48(4); + stryCov_9fa48("4"); - if (stryMutAct_9fa48(6) ? false : stryMutAct_9fa48(5) ? true : (stryCov_9fa48(5, 6), this.isPlaying)) { - if (stryMutAct_9fa48(7)) { + if (stryMutAct_9fa48("6") ? false : stryMutAct_9fa48("5") ? true : (stryCov_9fa48("5", "6"), this.isPlaying)) { + if (stryMutAct_9fa48("7")) { {} } else { - stryCov_9fa48(7); - throw new Error(stryMutAct_9fa48(8) ? "" : (stryCov_9fa48(8), "song is already playing")); + stryCov_9fa48("7"); + throw new Error(stryMutAct_9fa48("8") ? "" : (stryCov_9fa48("8"), "song is already playing")); } } - this.isPlaying = stryMutAct_9fa48(9) ? false : (stryCov_9fa48(9), true); + this.isPlaying = stryMutAct_9fa48("9") ? false : (stryCov_9fa48("9"), true); } }; Player.prototype.makeFavorite = function () { - if (stryMutAct_9fa48(10)) { + if (stryMutAct_9fa48("10")) { {} } else { - stryCov_9fa48(10); - this.currentlyPlayingSong.persistFavoriteStatus(stryMutAct_9fa48(11) ? false : (stryCov_9fa48(11), true)); + stryCov_9fa48("10"); + this.currentlyPlayingSong.persistFavoriteStatus(stryMutAct_9fa48("11") ? false : (stryCov_9fa48("11"), true)); } }; // Add random string, resulting in a static mutant in the instrumented code. -module.exports.foo = stryMutAct_9fa48(12) ? "" : (stryCov_9fa48(12), 'bar'); +module.exports.foo = stryMutAct_9fa48("12") ? "" : (stryCov_9fa48("12"), 'bar'); module.exports = Player; \ No newline at end of file diff --git a/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Song.js b/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Song.js index aa0cea72b2..41efe8c2ec 100644 --- a/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Song.js +++ b/packages/jasmine-runner/testResources/jasmine-init-instrumented/lib/jasmine_examples/Song.js @@ -4,7 +4,7 @@ var ns = g.__stryker2__ || (g.__stryker2__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -56,12 +56,12 @@ function stryMutAct_9fa48(id) { function Song() {} Song.prototype.persistFavoriteStatus = function (value) { - if (stryMutAct_9fa48(13)) { + if (stryMutAct_9fa48("13")) { {} } else { - stryCov_9fa48(13); + stryCov_9fa48("13"); // something complicated - throw new Error(stryMutAct_9fa48(14) ? "" : (stryCov_9fa48(14), "not yet implemented")); + throw new Error(stryMutAct_9fa48("14") ? "" : (stryCov_9fa48("14"), "not yet implemented")); } }; diff --git a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts index 4390ed6322..12c7a065d6 100644 --- a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts +++ b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts @@ -156,7 +156,7 @@ describe(`${JestTestRunner.name} integration test`, () => { const mutantRunOptions = factory.mutantRunOptions({ sandboxFileName: require.resolve(path.resolve(exampleProjectRoot, 'src', 'Circle.js')), }); - mutantRunOptions.activeMutant.id = '1'; + mutantRunOptions.activeMutant.id = '11'; const runResult = await jestTestRunner.mutantRun(mutantRunOptions); @@ -166,7 +166,7 @@ describe(`${JestTestRunner.name} integration test`, () => { it('should be able to let a mutant survive after killing mutant 1', async () => { // Arrange const exampleProjectRoot = resolveTestResource('jasmine2-node-instrumented'); - process.chdir(resolveTestResource('jasmine2-node-instrumented')); + process.chdir(exampleProjectRoot); const jestTestRunner = createSut(); const mutantRunOptions = factory.mutantRunOptions({ sandboxFileName: require.resolve(path.resolve(exampleProjectRoot, 'src', 'Add.js')), @@ -175,7 +175,7 @@ describe(`${JestTestRunner.name} integration test`, () => { // Act const firstResult = await jestTestRunner.mutantRun(mutantRunOptions); - mutantRunOptions.activeMutant.id = '0'; + mutantRunOptions.activeMutant.id = '10'; const secondResult = await jestTestRunner.mutantRun(mutantRunOptions); // Assert diff --git a/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Add.js b/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Add.js index d630d67020..392724aa5d 100644 --- a/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Add.js +++ b/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Add.js @@ -4,7 +4,7 @@ var ns = g.__stryker2__ || (g.__stryker2__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -55,38 +55,38 @@ function stryMutAct_9fa48(id) { class CalculatorElement extends HTMLElement { connectedCallback() { - if (stryMutAct_9fa48(0)) { + if (stryMutAct_9fa48("0")) { {} } else { - stryCov_9fa48(0); + stryCov_9fa48("0"); - switch (this.getAttribute(stryMutAct_9fa48(1) ? "" : (stryCov_9fa48(1), 'operator'))) { - case stryMutAct_9fa48(3) ? "" : (stryCov_9fa48(3), 'add'): - if (stryMutAct_9fa48(2)) {} else { - stryCov_9fa48(2); - this.innerHTML = stryMutAct_9fa48(4) ? Number(this.getAttribute(stryMutAct_9fa48(5) ? "" : (stryCov_9fa48(5), 'a'))) - Number(this.getAttribute(stryMutAct_9fa48(6) ? "" : (stryCov_9fa48(6), 'b'))) : (stryCov_9fa48(4), Number(this.getAttribute(stryMutAct_9fa48(5) ? "" : (stryCov_9fa48(5), 'a'))) + Number(this.getAttribute(stryMutAct_9fa48(6) ? "" : (stryCov_9fa48(6), 'b')))); + switch (this.getAttribute(stryMutAct_9fa48("1") ? "" : (stryCov_9fa48("1"), 'operator'))) { + case stryMutAct_9fa48("3") ? "" : (stryCov_9fa48("3"), 'add'): + if (stryMutAct_9fa48("2")) {} else { + stryCov_9fa48("2"); + this.innerHTML = stryMutAct_9fa48("4") ? Number(this.getAttribute(stryMutAct_9fa48("5") ? "" : (stryCov_9fa48("5"), 'a'))) - Number(this.getAttribute(stryMutAct_9fa48("6") ? "" : (stryCov_9fa48("6"), 'b'))) : (stryCov_9fa48("4"), Number(this.getAttribute(stryMutAct_9fa48("5") ? "" : (stryCov_9fa48("5"), 'a'))) + Number(this.getAttribute(stryMutAct_9fa48("6") ? "" : (stryCov_9fa48("6"), 'b')))); break; } - case stryMutAct_9fa48(8) ? "" : (stryCov_9fa48(8), 'addOne'): - if (stryMutAct_9fa48(7)) {} else { - stryCov_9fa48(7); - this.innerHTML = stryMutAct_9fa48(9) ? Number(this.getAttribute(stryMutAct_9fa48(10) ? "" : (stryCov_9fa48(10), 'a'))) - 1 : (stryCov_9fa48(9), Number(this.getAttribute(stryMutAct_9fa48(10) ? "" : (stryCov_9fa48(10), 'a'))) + 1); + case stryMutAct_9fa48("8") ? "" : (stryCov_9fa48("8"), 'addOne'): + if (stryMutAct_9fa48("7")) {} else { + stryCov_9fa48("7"); + this.innerHTML = stryMutAct_9fa48("9") ? Number(this.getAttribute(stryMutAct_9fa48("10") ? "" : (stryCov_9fa48("10"), 'a'))) - 1 : (stryCov_9fa48("9"), Number(this.getAttribute(stryMutAct_9fa48("10") ? "" : (stryCov_9fa48("10"), 'a'))) + 1); break; } - case stryMutAct_9fa48(12) ? "" : (stryCov_9fa48(12), 'negate'): - if (stryMutAct_9fa48(11)) {} else { - stryCov_9fa48(11); - this.innerHTML = stryMutAct_9fa48(13) ? +Number(this.getAttribute(stryMutAct_9fa48(14) ? "" : (stryCov_9fa48(14), 'a'))) : (stryCov_9fa48(13), -Number(this.getAttribute(stryMutAct_9fa48(14) ? "" : (stryCov_9fa48(14), 'a')))); + case stryMutAct_9fa48("12") ? "" : (stryCov_9fa48("12"), 'negate'): + if (stryMutAct_9fa48("11")) {} else { + stryCov_9fa48("11"); + this.innerHTML = stryMutAct_9fa48("13") ? +Number(this.getAttribute(stryMutAct_9fa48("14") ? "" : (stryCov_9fa48("14"), 'a'))) : (stryCov_9fa48("13"), -Number(this.getAttribute(stryMutAct_9fa48("14") ? "" : (stryCov_9fa48("14"), 'a')))); break; } - case stryMutAct_9fa48(16) ? "" : (stryCov_9fa48(16), 'isNegative'): - if (stryMutAct_9fa48(15)) {} else { - stryCov_9fa48(15); - const a = Number(this.getAttribute(stryMutAct_9fa48(17) ? "" : (stryCov_9fa48(17), 'a'))); - this.innerHTML = stryMutAct_9fa48(21) ? a >= 0 : stryMutAct_9fa48(20) ? a <= 0 : stryMutAct_9fa48(19) ? false : stryMutAct_9fa48(18) ? true : (stryCov_9fa48(18, 19, 20, 21), a < 0); + case stryMutAct_9fa48("16") ? "" : (stryCov_9fa48("16"), 'isNegative'): + if (stryMutAct_9fa48("15")) {} else { + stryCov_9fa48("15"); + const a = Number(this.getAttribute(stryMutAct_9fa48("17") ? "" : (stryCov_9fa48("17"), 'a'))); + this.innerHTML = stryMutAct_9fa48("21") ? a >= 0 : stryMutAct_9fa48("20") ? a <= 0 : stryMutAct_9fa48("19") ? false : stryMutAct_9fa48("18") ? true : (stryCov_9fa48("18", "19", "20", "21"), a < 0); break; } @@ -96,4 +96,4 @@ class CalculatorElement extends HTMLElement { } -customElements.define(stryMutAct_9fa48(22) ? "" : (stryCov_9fa48(22), 'my-calculator'), CalculatorElement); \ No newline at end of file +customElements.define(stryMutAct_9fa48("22") ? "" : (stryCov_9fa48("22"), 'my-calculator'), CalculatorElement); \ No newline at end of file diff --git a/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Circle.js b/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Circle.js index 0dbd1abb73..0e0a9eac96 100644 --- a/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Circle.js +++ b/packages/jest-runner/testResources/jasmine2-dom-sixteen-instrumented/src/Circle.js @@ -4,7 +4,7 @@ var ns = g.__stryker2__ || (g.__stryker2__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -55,23 +55,23 @@ function stryMutAct_9fa48(id) { class CircleElement extends HTMLElement { get circumference() { - if (stryMutAct_9fa48(23)) { + if (stryMutAct_9fa48("23")) { {} } else { - stryCov_9fa48(23); - return stryMutAct_9fa48(24) ? 2 * Math.PI / Number(this.getAttribute(stryMutAct_9fa48(26) ? "" : (stryCov_9fa48(26), 'radius'))) : (stryCov_9fa48(24), (stryMutAct_9fa48(25) ? 2 / Math.PI : (stryCov_9fa48(25), 2 * Math.PI)) * Number(this.getAttribute(stryMutAct_9fa48(26) ? "" : (stryCov_9fa48(26), 'radius')))); + stryCov_9fa48("23"); + return stryMutAct_9fa48("24") ? 2 * Math.PI / Number(this.getAttribute(stryMutAct_9fa48("26") ? "" : (stryCov_9fa48("26"), 'radius'))) : (stryCov_9fa48("24"), (stryMutAct_9fa48("25") ? 2 / Math.PI : (stryCov_9fa48("25"), 2 * Math.PI)) * Number(this.getAttribute(stryMutAct_9fa48("26") ? "" : (stryCov_9fa48("26"), 'radius')))); } } untestedFunction() { - if (stryMutAct_9fa48(27)) { + if (stryMutAct_9fa48("27")) { {} } else { - stryCov_9fa48(27); - return stryMutAct_9fa48(28) ? 5 / 2 / 3 : (stryCov_9fa48(28), (stryMutAct_9fa48(29) ? 5 * 2 : (stryCov_9fa48(29), 5 / 2)) * 3); + stryCov_9fa48("27"); + return stryMutAct_9fa48("28") ? 5 / 2 / 3 : (stryCov_9fa48("28"), (stryMutAct_9fa48("29") ? 5 * 2 : (stryCov_9fa48("29"), 5 / 2)) * 3); } } } -customElements.define(stryMutAct_9fa48(30) ? "" : (stryCov_9fa48(30), 'my-circle'), CircleElement); \ No newline at end of file +customElements.define(stryMutAct_9fa48("30") ? "" : (stryCov_9fa48("30"), 'my-circle'), CircleElement); \ No newline at end of file diff --git a/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Add.js b/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Add.js index 147bc36216..953461dfbc 100644 --- a/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Add.js +++ b/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Add.js @@ -4,7 +4,7 @@ var ns = g.__stryker2__ || (g.__stryker2__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -54,46 +54,46 @@ function stryMutAct_9fa48(id) { } exports.add = function (num1, num2) { - if (stryMutAct_9fa48(0)) { + if (stryMutAct_9fa48("0")) { {} } else { - stryCov_9fa48(0); - return stryMutAct_9fa48(1) ? num1 - num2 : (stryCov_9fa48(1), num1 + num2); + stryCov_9fa48("0"); + return stryMutAct_9fa48("1") ? num1 - num2 : (stryCov_9fa48("1"), num1 + num2); } }; exports.addOne = function (number) { - if (stryMutAct_9fa48(2)) { + if (stryMutAct_9fa48("2")) { {} } else { - stryCov_9fa48(2); - stryMutAct_9fa48(3) ? number-- : (stryCov_9fa48(3), number++); + stryCov_9fa48("2"); + stryMutAct_9fa48("3") ? number-- : (stryCov_9fa48("3"), number++); return number; } }; exports.negate = function (number) { - if (stryMutAct_9fa48(4)) { + if (stryMutAct_9fa48("4")) { {} } else { - stryCov_9fa48(4); - return stryMutAct_9fa48(5) ? +number : (stryCov_9fa48(5), -number); + stryCov_9fa48("4"); + return stryMutAct_9fa48("5") ? +number : (stryCov_9fa48("5"), -number); } }; exports.isNegativeNumber = function (number) { - if (stryMutAct_9fa48(6)) { + if (stryMutAct_9fa48("6")) { {} } else { - stryCov_9fa48(6); - var isNegative = stryMutAct_9fa48(7) ? true : (stryCov_9fa48(7), false); + stryCov_9fa48("6"); + var isNegative = stryMutAct_9fa48("7") ? true : (stryCov_9fa48("7"), false); - if (stryMutAct_9fa48(11) ? number >= 0 : stryMutAct_9fa48(10) ? number <= 0 : stryMutAct_9fa48(9) ? false : stryMutAct_9fa48(8) ? true : (stryCov_9fa48(8, 9, 10, 11), number < 0)) { - if (stryMutAct_9fa48(12)) { + if (stryMutAct_9fa48("11") ? number >= 0 : stryMutAct_9fa48("10") ? number <= 0 : stryMutAct_9fa48("9") ? false : stryMutAct_9fa48("8") ? true : (stryCov_9fa48("8", "9", "10", "11"), number < 0)) { + if (stryMutAct_9fa48("12")) { {} } else { - stryCov_9fa48(12); - isNegative = stryMutAct_9fa48(13) ? false : (stryCov_9fa48(13), true); + stryCov_9fa48("12"); + isNegative = stryMutAct_9fa48("13") ? false : (stryCov_9fa48("13"), true); } } diff --git a/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Circle.js b/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Circle.js index de935dfabe..915b9ee9f8 100644 --- a/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Circle.js +++ b/packages/jest-runner/testResources/jasmine2-node-instrumented/src/Circle.js @@ -4,7 +4,7 @@ var ns = g.__stryker2__ || (g.__stryker2__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -54,20 +54,20 @@ function stryMutAct_9fa48(id) { } exports.getCircumference = function (radius) { - if (stryMutAct_9fa48(14)) { + if (stryMutAct_9fa48("14")) { {} } else { - stryCov_9fa48(14); + stryCov_9fa48("14"); //Function to test multiple math mutations in a single function. - return stryMutAct_9fa48(15) ? 2 * Math.PI / radius : (stryCov_9fa48(15), (stryMutAct_9fa48(16) ? 2 / Math.PI : (stryCov_9fa48(16), 2 * Math.PI)) * radius); + return stryMutAct_9fa48("15") ? 2 * Math.PI / radius : (stryCov_9fa48("15"), (stryMutAct_9fa48("16") ? 2 / Math.PI : (stryCov_9fa48("16"), 2 * Math.PI)) * radius); } }; exports.untestedFunction = function () { - if (stryMutAct_9fa48(17)) { + if (stryMutAct_9fa48("17")) { {} } else { - stryCov_9fa48(17); - var i = stryMutAct_9fa48(18) ? 5 / 2 / 3 : (stryCov_9fa48(18), (stryMutAct_9fa48(19) ? 5 * 2 : (stryCov_9fa48(19), 5 / 2)) * 3); + stryCov_9fa48("17"); + var i = stryMutAct_9fa48("18") ? 5 / 2 / 3 : (stryCov_9fa48("18"), (stryMutAct_9fa48("19") ? 5 * 2 : (stryCov_9fa48("19"), 5 / 2)) * 3); } }; \ No newline at end of file diff --git a/packages/karma-runner/testResources/instrumented/src/Add.js b/packages/karma-runner/testResources/instrumented/src/Add.js index d9d9f1b450..3f7617e030 100644 --- a/packages/karma-runner/testResources/instrumented/src/Add.js +++ b/packages/karma-runner/testResources/instrumented/src/Add.js @@ -4,7 +4,7 @@ var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -54,46 +54,46 @@ function stryMutAct_9fa48(id) { } var add = function (num1, num2) { - if (stryMutAct_9fa48(0)) { + if (stryMutAct_9fa48("0")) { {} } else { - stryCov_9fa48(0); - return stryMutAct_9fa48(1) ? num1 - num2 : (stryCov_9fa48(1), num1 + num2); + stryCov_9fa48("0"); + return stryMutAct_9fa48("1") ? num1 - num2 : (stryCov_9fa48("1"), num1 + num2); } }; var addOne = function (number) { - if (stryMutAct_9fa48(2)) { + if (stryMutAct_9fa48("2")) { {} } else { - stryCov_9fa48(2); - stryMutAct_9fa48(3) ? number-- : (stryCov_9fa48(3), number++); + stryCov_9fa48("2"); + stryMutAct_9fa48("3") ? number-- : (stryCov_9fa48("3"), number++); return number; } }; var negate = function (number) { - if (stryMutAct_9fa48(4)) { + if (stryMutAct_9fa48("4")) { {} } else { - stryCov_9fa48(4); - return stryMutAct_9fa48(5) ? +number : (stryCov_9fa48(5), -number); + stryCov_9fa48("4"); + return stryMutAct_9fa48("5") ? +number : (stryCov_9fa48("5"), -number); } }; var isNegativeNumber = function (number) { - if (stryMutAct_9fa48(6)) { + if (stryMutAct_9fa48("6")) { {} } else { - stryCov_9fa48(6); - var isNegative = stryMutAct_9fa48(7) ? true : (stryCov_9fa48(7), false); + stryCov_9fa48("6"); + var isNegative = stryMutAct_9fa48("7") ? true : (stryCov_9fa48("7"), false); - if (stryMutAct_9fa48(11) ? number >= 0 : stryMutAct_9fa48(10) ? number <= 0 : stryMutAct_9fa48(9) ? false : stryMutAct_9fa48(8) ? true : (stryCov_9fa48(8, 9, 10, 11), number < 0)) { - if (stryMutAct_9fa48(12)) { + if (stryMutAct_9fa48("11") ? number >= 0 : stryMutAct_9fa48("10") ? number <= 0 : stryMutAct_9fa48("9") ? false : stryMutAct_9fa48("8") ? true : (stryCov_9fa48("8", "9", "10", "11"), number < 0)) { + if (stryMutAct_9fa48("12")) { {} } else { - stryCov_9fa48(12); - isNegative = stryMutAct_9fa48(13) ? false : (stryCov_9fa48(13), true); + stryCov_9fa48("12"); + isNegative = stryMutAct_9fa48("13") ? false : (stryCov_9fa48("13"), true); } } diff --git a/packages/karma-runner/testResources/instrumented/src/Circle.js b/packages/karma-runner/testResources/instrumented/src/Circle.js index 5f5f5b0490..8b995abfae 100644 --- a/packages/karma-runner/testResources/instrumented/src/Circle.js +++ b/packages/karma-runner/testResources/instrumented/src/Circle.js @@ -4,7 +4,7 @@ var ns = g.__stryker__ || (g.__stryker__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -54,20 +54,20 @@ function stryMutAct_9fa48(id) { } var getCircumference = function (radius) { - if (stryMutAct_9fa48(14)) { + if (stryMutAct_9fa48("14")) { {} } else { - stryCov_9fa48(14); + stryCov_9fa48("14"); //Function to test multiple math mutations in a single function. - return stryMutAct_9fa48(15) ? 2 * Math.PI / radius : (stryCov_9fa48(15), (stryMutAct_9fa48(16) ? 2 / Math.PI : (stryCov_9fa48(16), 2 * Math.PI)) * radius); + return stryMutAct_9fa48("15") ? 2 * Math.PI / radius : (stryCov_9fa48("15"), (stryMutAct_9fa48("16") ? 2 / Math.PI : (stryCov_9fa48("16"), 2 * Math.PI)) * radius); } }; var untestedFunction = function () { - if (stryMutAct_9fa48(17)) { + if (stryMutAct_9fa48("17")) { {} } else { - stryCov_9fa48(17); - var i = stryMutAct_9fa48(18) ? 5 / 2 / 3 : (stryCov_9fa48(18), (stryMutAct_9fa48(19) ? 5 * 2 : (stryCov_9fa48(19), 5 / 2)) * 3); + stryCov_9fa48("17"); + var i = stryMutAct_9fa48("18") ? 5 / 2 / 3 : (stryCov_9fa48("18"), (stryMutAct_9fa48("19") ? 5 * 2 : (stryCov_9fa48("19"), 5 / 2)) * 3); } }; \ No newline at end of file diff --git a/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts b/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts index 1343c8297e..1c71035207 100644 --- a/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts +++ b/packages/mocha-runner/test/unit/mocha-test-runner.spec.ts @@ -241,7 +241,7 @@ describe(MochaTestRunner.name, () => { it('should active the given mutant', async () => { await actMutantRun(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '42' }) })); - expect(global.__stryker2__?.activeMutant).eq(42); + expect(global.__stryker2__?.activeMutant).eq('42'); }); it('should use `grep` to when the test filter is specified', async () => { diff --git a/packages/mocha-runner/testResources/sample-project-instrumented/MyMath.js b/packages/mocha-runner/testResources/sample-project-instrumented/MyMath.js index b3a16ffba3..9fb68947d6 100644 --- a/packages/mocha-runner/testResources/sample-project-instrumented/MyMath.js +++ b/packages/mocha-runner/testResources/sample-project-instrumented/MyMath.js @@ -6,7 +6,7 @@ function stryNS_9fa48() { var ns = g.__stryker2__ || (g.__stryker2__ = {}); if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { - ns.activeMutant = Number(g.process.env.__STRYKER_ACTIVE_MUTANT__); + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; } function retrieveNS() { @@ -55,58 +55,58 @@ function stryMutAct_9fa48(id) { return isActive(id); } -const pi = stryMutAct_9fa48(0) ? 3 - .14 : (stryCov_9fa48(0), 3 + .14); +const pi = stryMutAct_9fa48("0") ? 3 - .14 : (stryCov_9fa48("0"), 3 + .14); function MyMath() { - if (stryMutAct_9fa48(1)) { + if (stryMutAct_9fa48("1")) { {} } else { - stryCov_9fa48(1); + stryCov_9fa48("1"); this.pi = pi; } } MyMath.prototype.add = function (num1, num2) { - if (stryMutAct_9fa48(2)) { + if (stryMutAct_9fa48("2")) { {} } else { - stryCov_9fa48(2); - return stryMutAct_9fa48(3) ? num1 - num2 : (stryCov_9fa48(3), num1 + num2); + stryCov_9fa48("2"); + return stryMutAct_9fa48("3") ? num1 - num2 : (stryCov_9fa48("3"), num1 + num2); } }; MyMath.prototype.addOne = function (number) { - if (stryMutAct_9fa48(4)) { + if (stryMutAct_9fa48("4")) { {} } else { - stryCov_9fa48(4); - stryMutAct_9fa48(5) ? number-- : (stryCov_9fa48(5), number++); + stryCov_9fa48("4"); + stryMutAct_9fa48("5") ? number-- : (stryCov_9fa48("5"), number++); return number; } }; MyMath.prototype.negate = function (number) { - if (stryMutAct_9fa48(6)) { + if (stryMutAct_9fa48("6")) { {} } else { - stryCov_9fa48(6); - return stryMutAct_9fa48(7) ? +number : (stryCov_9fa48(7), -number); + stryCov_9fa48("6"); + return stryMutAct_9fa48("7") ? +number : (stryCov_9fa48("7"), -number); } }; MyMath.prototype.isNegativeNumber = function (number) { - if (stryMutAct_9fa48(8)) { + if (stryMutAct_9fa48("8")) { {} } else { - stryCov_9fa48(8); - var isNegative = stryMutAct_9fa48(9) ? true : (stryCov_9fa48(9), false); + stryCov_9fa48("8"); + var isNegative = stryMutAct_9fa48("9") ? true : (stryCov_9fa48("9"), false); - if (stryMutAct_9fa48(13) ? number >= 0 : stryMutAct_9fa48(12) ? number <= 0 : stryMutAct_9fa48(11) ? false : stryMutAct_9fa48(10) ? true : (stryCov_9fa48(10, 11, 12, 13), number < 0)) { - if (stryMutAct_9fa48(14)) { + if (stryMutAct_9fa48("13") ? number >= 0 : stryMutAct_9fa48("12") ? number <= 0 : stryMutAct_9fa48("11") ? false : stryMutAct_9fa48("10") ? true : (stryCov_9fa48("10", "11", "12", "13"), number < 0)) { + if (stryMutAct_9fa48("14")) { {} } else { - stryCov_9fa48(14); - isNegative = stryMutAct_9fa48(15) ? false : (stryCov_9fa48(15), true); + stryCov_9fa48("14"); + isNegative = stryMutAct_9fa48("15") ? false : (stryCov_9fa48("15"), true); } } From 4b06ab641778ad28543f5d3f679f0c3714536b59 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 6 Mar 2021 15:22:06 +0100 Subject: [PATCH 11/25] Support mutant id as string in the karma runner --- .../karma-runner/src/karma-plugins/test-hooks-middleware.ts | 2 +- .../test/unit/karma-plugins/test-hooks-middleware.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts b/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts index 7c79fcc169..8a08a7dab3 100644 --- a/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts +++ b/packages/karma-runner/src/karma-plugins/test-hooks-middleware.ts @@ -57,7 +57,7 @@ export class TestHooksMiddleware { public configureActiveMutant({ activeMutant, testFilter }: MutantRunOptions): void { this.configureCoverageAnalysis('off'); this.currentTestHooks += `window.${NAMESPACE} = window.${NAMESPACE} || {}; - window.${NAMESPACE}.${ACTIVE_MUTANT} = ${activeMutant.id};`; + window.${NAMESPACE}.${ACTIVE_MUTANT} = "${activeMutant.id}";`; if (testFilter) { switch (this.testFramework) { case 'jasmine': diff --git a/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts b/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts index cf69068ec0..391f0e5475 100644 --- a/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts +++ b/packages/karma-runner/test/unit/karma-plugins/test-hooks-middleware.spec.ts @@ -67,7 +67,7 @@ describe(TestHooksMiddleware.name, () => { it('should set the "activeMutant" id', () => { sut.configureActiveMutant(factory.mutantRunOptions({ activeMutant: factory.mutant({ id: '42' }) })); - expect(sut.currentTestHooks).contains('window.__stryker__.activeMutant = 42'); + expect(sut.currentTestHooks).contains('window.__stryker__.activeMutant = "42"'); }); it("should ignore the test filter if the current test framework doesn't support it", () => { From e1c117cdad0042e898745e13e2208dd8f0a6653e Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 6 Mar 2021 15:56:31 +0100 Subject: [PATCH 12/25] Add `metrics` as second parameter for `onMutationTestReportReady` --- packages/api/package.json | 1 + packages/api/src/report/reporter.ts | 6 +- .../core/src/reporters/broadcast-reporter.ts | 16 ++--- .../core/src/reporters/clear-text-reporter.ts | 9 ++- .../dashboard-reporter/dashboard-reporter.ts | 10 +-- .../reporters/mutation-test-report-helper.ts | 15 +++-- .../unit/reporters/broadcast-reporter.spec.ts | 67 ++++++++++++++----- .../reporters/clear-text-reporter.spec.ts | 34 ++++++---- .../dashboard-reporter.spec.ts | 6 +- packages/test-helpers/src/factory.ts | 13 +++- 10 files changed, 117 insertions(+), 60 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 35b4fdffa4..03cfd66cc6 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -39,6 +39,7 @@ }, "dependencies": { "mutation-testing-report-schema": "~1.6.0", + "mutation-testing-metrics": "~1.6.2", "surrial": "~2.0.2", "tslib": "~2.1.0" }, diff --git a/packages/api/src/report/reporter.ts b/packages/api/src/report/reporter.ts index e998ef6b52..64e5ed8e14 100644 --- a/packages/api/src/report/reporter.ts +++ b/packages/api/src/report/reporter.ts @@ -1,3 +1,5 @@ +import { MutationTestMetricsResult } from 'mutation-testing-metrics'; + import { MutantResult, MutantTestCoverage, schema } from '../core'; import { SourceFile } from './source-file'; @@ -16,7 +18,7 @@ export interface Reporter { * Called when all source files were loaded * @param files The immutable source files */ - onAllSourceFilesRead?(files: readonly SourceFile[]): void; + onAllSourceFilesRead?(files: ReadonlyArray>): void; /** * Called when mutants are matched with tests @@ -41,7 +43,7 @@ export interface Reporter { * @param report the mutation test result that is valid according to the mutation-testing-report-schema (json schema) * @see https://github.com/stryker-mutator/mutation-testing-elements/tree/master/packages/mutation-testing-report-schema#mutation-testing-elements-schema */ - onMutationTestReportReady?(report: Readonly): void; + onMutationTestReportReady?(report: Readonly, metrics: Readonly): void; /** * Called when stryker wants to quit diff --git a/packages/core/src/reporters/broadcast-reporter.ts b/packages/core/src/reporters/broadcast-reporter.ts index 99b9920ea0..8378fb48d3 100644 --- a/packages/core/src/reporters/broadcast-reporter.ts +++ b/packages/core/src/reporters/broadcast-reporter.ts @@ -2,6 +2,7 @@ import { MutantTestCoverage, MutantResult, schema, StrykerOptions } from '@stryk import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, PluginKind } from '@stryker-mutator/api/plugin'; import { Reporter, SourceFile } from '@stryker-mutator/api/report'; +import { MutationTestMetricsResult } from 'mutation-testing-metrics'; import { tokens } from 'typed-inject'; import { coreTokens } from '../di'; @@ -42,13 +43,12 @@ export class BroadcastReporter implements StrictReporter { } } - private broadcast(methodName: keyof Reporter, eventArgs: any): Promise { + private broadcast(methodName: TMethod, ...eventArgs: Parameters[TMethod]>): Promise { return Promise.all( - Object.keys(this.reporters).map(async (reporterName) => { - const reporter = this.reporters[reporterName]; - if (typeof reporter[methodName] === 'function') { + Object.entries(this.reporters).map(async ([reporterName, reporter]) => { + if (reporter[methodName]) { try { - await (reporter[methodName] as any)(eventArgs); + await (reporter[methodName] as (...args: Parameters[TMethod]>) => Promise | void)!(...eventArgs); } catch (error) { this.handleError(error, methodName, reporterName); } @@ -77,12 +77,12 @@ export class BroadcastReporter implements StrictReporter { this.broadcast('onAllMutantsTested', results); } - public onMutationTestReportReady(report: schema.MutationTestResult): void { - this.broadcast('onMutationTestReportReady', report); + public onMutationTestReportReady(report: schema.MutationTestResult, metrics: MutationTestMetricsResult): void { + this.broadcast('onMutationTestReportReady', report, metrics); } public async wrapUp(): Promise { - await this.broadcast('wrapUp', undefined); + await this.broadcast('wrapUp'); } private handleError(error: Error, methodName: string, reporterName: string) { diff --git a/packages/core/src/reporters/clear-text-reporter.ts b/packages/core/src/reporters/clear-text-reporter.ts index bb9af1ffa3..0f7b6d8207 100644 --- a/packages/core/src/reporters/clear-text-reporter.ts +++ b/packages/core/src/reporters/clear-text-reporter.ts @@ -5,7 +5,7 @@ import { schema, Position, StrykerOptions } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; -import { calculateMutationTestMetrics, MetricsResult, MutantModel, TestModel, MutationTestMetricsResult } from 'mutation-testing-metrics'; +import { MetricsResult, MutantModel, TestModel, MutationTestMetricsResult } from 'mutation-testing-metrics'; import { tokens } from 'typed-inject'; import { plural } from '../utils/string-utils'; @@ -32,10 +32,9 @@ export class ClearTextReporter implements Reporter { } } - public onMutationTestReportReady(report: schema.MutationTestResult): void { - const metricsResult = calculateMutationTestMetrics(report); - this.reportAllMutants(metricsResult); - this.writeLine(new ClearTextScoreTable(metricsResult.systemUnderTestMetrics, this.options.thresholds).draw()); + public onMutationTestReportReady(_report: schema.MutationTestResult, metrics: MutationTestMetricsResult): void { + this.reportAllMutants(metrics); + this.writeLine(new ClearTextScoreTable(metrics.systemUnderTestMetrics, this.options.thresholds).draw()); } private reportAllMutants({ systemUnderTestMetrics }: MutationTestMetricsResult): void { diff --git a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts index 380987bea5..9b5a3e52bb 100644 --- a/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts +++ b/packages/core/src/reporters/dashboard-reporter/dashboard-reporter.ts @@ -2,7 +2,7 @@ import { StrykerOptions, ReportType, schema } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; -import { calculateMetrics } from 'mutation-testing-metrics'; +import { MutationTestMetricsResult } from 'mutation-testing-metrics'; import { CIProvider } from '../ci/provider'; @@ -27,11 +27,11 @@ export class DashboardReporter implements Reporter { private onGoingWork: Promise | undefined; - public onMutationTestReportReady(result: schema.MutationTestResult): void { + public onMutationTestReportReady(result: schema.MutationTestResult, metrics: MutationTestMetricsResult): void { this.onGoingWork = (async () => { const { projectName, version, moduleName } = this.getContextFromEnvironment(); if (projectName && version) { - await this.update(this.toReport(result), projectName, version, moduleName); + await this.update(this.toReport(result, metrics), projectName, version, moduleName); } else { this.log.info( 'The report was not send to the dashboard. The dashboard.project and/or dashboard.version values were missing and not detected to be running on a build server.' @@ -44,12 +44,12 @@ export class DashboardReporter implements Reporter { await this.onGoingWork; } - private toReport(result: schema.MutationTestResult): Report { + private toReport(result: schema.MutationTestResult, metrics: MutationTestMetricsResult): Report { if (this.options.dashboard.reportType === ReportType.Full) { return result; } else { return { - mutationScore: calculateMetrics(result.files).metrics.mutationScore, + mutationScore: metrics.systemUnderTestMetrics.metrics.mutationScore, }; } } diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index 908bea38bf..2fa62b8d88 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -5,7 +5,7 @@ import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; import { normalizeWhitespaces } from '@stryker-mutator/util'; -import { calculateMetrics } from 'mutation-testing-metrics'; +import { calculateMutationTestMetrics, MutationTestMetricsResult } from 'mutation-testing-metrics'; import { CompleteDryRunResult, MutantRunResult, MutantRunStatus } from '@stryker-mutator/api/test-runner'; import { CheckStatus, PassedCheckResult, CheckResult } from '@stryker-mutator/api/check'; @@ -89,17 +89,18 @@ export class MutationTestReportHelper { public reportAll(results: MutantResult[]): void { const report = this.mutationTestReport(results); + const metrics = calculateMutationTestMetrics(report); this.reporter.onAllMutantsTested(results); - this.reporter.onMutationTestReportReady(report); - this.determineExitCode(report); + this.reporter.onMutationTestReportReady(report, metrics); + this.determineExitCode(metrics); } - private determineExitCode(report: schema.MutationTestResult) { - const { metrics } = calculateMetrics(report.files); + private determineExitCode(metrics: MutationTestMetricsResult) { + const mutationScore = metrics.systemUnderTestMetrics.metrics.mutationScore; const breaking = this.options.thresholds.break; - const formattedScore = metrics.mutationScore.toFixed(2); + const formattedScore = mutationScore.toFixed(2); if (typeof breaking === 'number') { - if (metrics.mutationScore < breaking) { + if (mutationScore < breaking) { this.log.error(`Final mutation score ${formattedScore} under breaking threshold ${breaking}, setting exit code to 1 (failure).`); this.log.info('(improve mutation score or set `thresholds.break = null` to prevent this error in the future)'); setExitCode(1); diff --git a/packages/core/test/unit/reporters/broadcast-reporter.spec.ts b/packages/core/test/unit/reporters/broadcast-reporter.spec.ts index 38f33d0637..9d84a17dcb 100644 --- a/packages/core/test/unit/reporters/broadcast-reporter.spec.ts +++ b/packages/core/test/unit/reporters/broadcast-reporter.spec.ts @@ -8,7 +8,7 @@ import { coreTokens } from '../../../src/di'; import { PluginCreator } from '../../../src/di/plugin-creator'; import { BroadcastReporter } from '../../../src/reporters/broadcast-reporter'; -describe('BroadcastReporter', () => { +describe(BroadcastReporter.name, () => { let sut: BroadcastReporter; let rep1: sinon.SinonStubbedInstance>; let rep2: sinon.SinonStubbedInstance>; @@ -68,13 +68,31 @@ describe('BroadcastReporter', () => { }); }); - describe('when created', () => { + describe('with 2 reporters', () => { beforeEach(() => { sut = createSut(); }); - it('should forward all events', () => { - actArrangeAssertAllEvents(); + it('should forward "onSourceFileRead"', () => { + actAssertShouldForward('onSourceFileRead', factory.sourceFile()); + }); + it('should forward "onAllSourceFilesRead"', () => { + actAssertShouldForward('onAllSourceFilesRead', [factory.sourceFile()]); + }); + it('should forward "onAllMutantsMatchedWithTests"', () => { + actAssertShouldForward('onAllMutantsMatchedWithTests', [factory.mutantTestCoverage()]); + }); + it('should forward "onMutantTested"', () => { + actAssertShouldForward('onMutantTested', factory.mutantResult()); + }); + it('should forward "onAllMutantsTested"', () => { + actAssertShouldForward('onAllMutantsTested', [factory.mutantResult()]); + }); + it('should forward "onMutationTestReportReady"', () => { + actAssertShouldForward('onMutationTestReportReady', factory.mutationTestReportSchemaMutationTestResult(), factory.mutationTestMetricsResult()); + }); + it('should forward "wrapUp"', () => { + actAssertShouldForward('wrapUp'); }); describe('when "wrapUp" returns promises', () => { @@ -128,8 +146,30 @@ describe('BroadcastReporter', () => { factory.ALL_REPORTER_EVENTS.forEach((eventName) => rep1[eventName].throws(actualError)); }); - it('should still broadcast to other reporters', () => { - actArrangeAssertAllEvents(); + it('should still broadcast "onSourceFileRead"', () => { + actAssertShouldForward('onSourceFileRead', factory.sourceFile()); + }); + it('should still broadcast "onAllSourceFilesRead"', () => { + actAssertShouldForward('onAllSourceFilesRead', [factory.sourceFile()]); + }); + it('should still broadcast "onAllMutantsMatchedWithTests"', () => { + actAssertShouldForward('onAllMutantsMatchedWithTests', [factory.mutantTestCoverage()]); + }); + it('should still broadcast "onMutantTested"', () => { + actAssertShouldForward('onMutantTested', factory.mutantResult()); + }); + it('should still broadcast "onAllMutantsTested"', () => { + actAssertShouldForward('onAllMutantsTested', [factory.mutantResult()]); + }); + it('should still broadcast "onMutationTestReportReady"', () => { + actAssertShouldForward( + 'onMutationTestReportReady', + factory.mutationTestReportSchemaMutationTestResult(), + factory.mutationTestMetricsResult() + ); + }); + it('should still broadcast "wrapUp"', () => { + actAssertShouldForward('wrapUp'); }); it('should log each error', () => { @@ -147,15 +187,6 @@ describe('BroadcastReporter', () => { .injectClass(BroadcastReporter); } - function actArrangeAssertAllEvents() { - factory.ALL_REPORTER_EVENTS.forEach((eventName) => { - const eventData = eventName === 'wrapUp' ? undefined : eventName; - (sut as any)[eventName](eventName); - expect(rep1[eventName]).calledWith(eventData); - expect(rep2[eventName]).calledWith(eventData); - }); - } - function captureTTY() { isTTY = process.stdout.isTTY; } @@ -167,4 +198,10 @@ describe('BroadcastReporter', () => { function setTTY(val: boolean) { process.stdout.isTTY = val; } + + function actAssertShouldForward(method: TMethod, ...input: Parameters[TMethod]>) { + (sut[method] as (...args: Parameters[TMethod]>) => Promise | void)(...input); + expect(rep1[method]).calledWithExactly(...input); + expect(rep2[method]).calledWithExactly(...input); + } }); diff --git a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts index 3138263615..10be9d4949 100644 --- a/packages/core/test/unit/reporters/clear-text-reporter.spec.ts +++ b/packages/core/test/unit/reporters/clear-text-reporter.spec.ts @@ -7,6 +7,8 @@ import sinon from 'sinon'; import chalk from 'chalk'; +import { calculateMutationTestMetrics } from 'mutation-testing-metrics'; + import { ClearTextReporter } from '../../../src/reporters/clear-text-reporter'; describe(ClearTextReporter.name, () => { @@ -53,7 +55,7 @@ describe(ClearTextReporter.name, () => { it('should report the clear text table with correct values', () => { testInjector.options.coverageAnalysis = 'all'; - sut.onMutationTestReportReady({ + act({ files: { 'src/file.js': { language: 'js', @@ -91,7 +93,7 @@ describe(ClearTextReporter.name, () => { chalk.level = 1; sut = testInjector.injector.injectClass(ClearTextReporter); // recreate, `allowConsoleColors` is read in constructor - sut.onMutationTestReportReady({ + act({ files: {}, schemaVersion: '1.0', thresholds: factory.mutationScoreThresholds({}), @@ -103,7 +105,7 @@ describe(ClearTextReporter.name, () => { it('should report a killed mutant to debug', async () => { mutant.status = MutantStatus.Killed; mutant.killedBy = ['1']; - sut.onMutationTestReportReady(report); + act(report); expect(testInjector.logger.debug).calledWithMatch(sinon.match('1. [Killed] Math')); expect(testInjector.logger.debug).calledWith(`${chalk.red('- foo')}`); expect(testInjector.logger.debug).calledWith(`${chalk.green('+ bar')}`); @@ -113,7 +115,7 @@ describe(ClearTextReporter.name, () => { it('should report a CompileError mutant to debug', async () => { mutant.status = MutantStatus.CompileError; mutant.statusReason = 'could not call bar of undefined'; - sut.onMutationTestReportReady(report); + act(report); expect(testInjector.logger.debug).calledWithMatch(sinon.match('1. [CompileError] Math')); expect(testInjector.logger.debug).calledWith(`${chalk.red('- foo')}`); expect(testInjector.logger.debug).calledWith(`${chalk.green('+ bar')}`); @@ -122,7 +124,7 @@ describe(ClearTextReporter.name, () => { it('should report a NoCoverage mutant to stdout', async () => { mutant.status = MutantStatus.NoCoverage; - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).calledWithMatch(sinon.match('1. [NoCoverage] Math')); expect(stdoutStub).calledWith(`${chalk.red('- foo')}${os.EOL}`); expect(stdoutStub).calledWith(`${chalk.green('+ bar')}${os.EOL}`); @@ -130,20 +132,20 @@ describe(ClearTextReporter.name, () => { it('should report a Survived mutant to stdout', async () => { mutant.status = MutantStatus.Survived; - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).calledWithMatch(sinon.match('1. [Survived] Math')); }); it('should report a Timeout mutant to stdout', async () => { mutant.status = MutantStatus.Timeout; - sut.onMutationTestReportReady(report); + act(report); expect(testInjector.logger.debug).calledWithMatch(sinon.match('1. [Timeout] Math')); }); it('should report the tests ran for a Survived mutant to stdout for "perTest" coverage analysis', async () => { mutant.coveredBy = ['1', '2', '3']; mutant.status = MutantStatus.Survived; - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).calledWithExactly(`Tests ran:${os.EOL}`); expect(stdoutStub).calledWithExactly(` foo should be bar${os.EOL}`); expect(stdoutStub).calledWithExactly(` bar should be baz${os.EOL}`); @@ -154,7 +156,7 @@ describe(ClearTextReporter.name, () => { testInjector.options.clearTextReporter.maxTestsToLog = 2; mutant.coveredBy = ['1', '2', '3']; mutant.status = MutantStatus.Survived; - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).calledWithExactly(`Tests ran:${os.EOL}`); expect(stdoutStub).calledWithExactly(` foo should be bar${os.EOL}`); expect(stdoutStub).calledWithExactly(` bar should be baz${os.EOL}`); @@ -166,7 +168,7 @@ describe(ClearTextReporter.name, () => { testInjector.options.clearTextReporter.maxTestsToLog = 2; mutant.static = true; mutant.status = MutantStatus.Survived; - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).calledWithExactly(`Ran all tests for this mutant.${os.EOL}`); }); @@ -174,7 +176,7 @@ describe(ClearTextReporter.name, () => { testInjector.options.clearTextReporter.logTests = false; mutant.coveredBy = ['1', '2', '3']; mutant.status = MutantStatus.Survived; - sut.onMutationTestReportReady(report); + act(report); expect(process.stdout.write).not.calledWithMatch(sinon.match('Tests ran: ')); expect(process.stdout.write).not.calledWithMatch(sinon.match('foo should be bar')); @@ -185,7 +187,7 @@ describe(ClearTextReporter.name, () => { mutant.testsCompleted = 4; report.files['foo.js'].mutants.push(factory.mutationTestReportSchemaMutantResult({ testsCompleted: 5 })); report.files['foo.js'].mutants.push(factory.mutationTestReportSchemaMutantResult({ testsCompleted: 1 })); - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).calledWithExactly(`Ran 3.33 tests per mutant on average.${os.EOL}`); }); @@ -193,7 +195,7 @@ describe(ClearTextReporter.name, () => { it('should log source file location', () => { mutant.status = MutantStatus.Survived; mutant.location.start = { line: 4, column: 6 }; - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).to.have.been.calledWithMatch(sinon.match(`${chalk.cyan('foo.js')}:${chalk.yellow('4')}:${chalk.yellow('6')}`)); }); @@ -204,9 +206,13 @@ describe(ClearTextReporter.name, () => { mutant.location.start = { line: 4, column: 6 }; // Recreate, color setting is set in constructor sut = testInjector.injector.injectClass(ClearTextReporter); - sut.onMutationTestReportReady(report); + act(report); expect(stdoutStub).calledWithMatch(sinon.match('foo.js:4:6')); }); }); + + function act(report: schema.MutationTestResult) { + sut.onMutationTestReportReady(report, calculateMutationTestMetrics(report)); + } }); diff --git a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts index cae64536ac..d6af26b167 100644 --- a/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts +++ b/packages/core/test/unit/reporters/dashboard-reporter/dashboard-reporter.spec.ts @@ -3,6 +3,8 @@ import { expect } from 'chai'; import sinon from 'sinon'; import { MutantStatus, ReportType, schema } from '@stryker-mutator/api/core'; +import { calculateMutationTestMetrics } from 'mutation-testing-metrics'; + import { CIProvider } from '../../../../src/reporters/ci/provider'; import { DashboardReporter } from '../../../../src/reporters/dashboard-reporter/dashboard-reporter'; import { DashboardReporterClient } from '../../../../src/reporters/dashboard-reporter/dashboard-reporter-client'; @@ -107,7 +109,7 @@ describe(DashboardReporter.name, () => { const sut = createSut(null); // Act - sut.onMutationTestReportReady(factory.mutationTestReportSchemaMutationTestResult()); + sut.onMutationTestReportReady(factory.mutationTestReportSchemaMutationTestResult(), factory.mutationTestMetricsResult()); await sut.wrapUp(); // Assert @@ -119,7 +121,7 @@ describe(DashboardReporter.name, () => { async function act(result: schema.MutationTestResult) { const sut = createSut(); - sut.onMutationTestReportReady(result); + sut.onMutationTestReportReady(result, calculateMutationTestMetrics(result)); await sut.wrapUp(); } }); diff --git a/packages/test-helpers/src/factory.ts b/packages/test-helpers/src/factory.ts index 5ea436a98a..28aa4a8c71 100644 --- a/packages/test-helpers/src/factory.ts +++ b/packages/test-helpers/src/factory.ts @@ -14,8 +14,8 @@ import { MutantStatus, } from '@stryker-mutator/api/core'; import { Logger } from '@stryker-mutator/api/logging'; -import { Reporter } from '@stryker-mutator/api/report'; -import { Metrics, MetricsResult } from 'mutation-testing-metrics'; +import { Reporter, SourceFile } from '@stryker-mutator/api/report'; +import { calculateMutationTestMetrics, Metrics, MetricsResult, MutationTestMetricsResult } from 'mutation-testing-metrics'; import sinon from 'sinon'; import { Injector } from 'typed-inject'; import { PluginResolver } from '@stryker-mutator/api/plugin'; @@ -145,6 +145,10 @@ export const mutationTestReportSchemaMutationTestResult = factoryMethod(() => + calculateMutationTestMetrics(mutationTestReportSchemaMutationTestResult()) +); + export const mutant = factoryMethod(() => ({ id: '42', fileName: 'file', @@ -361,6 +365,11 @@ export function file(): File { return new File('', ''); } +export const sourceFile = factoryMethod(() => ({ + content: 'foo.bar()', + path: 'foo.js', +})); + export function fileNotFoundError(): NodeJS.ErrnoException { return createErrnoException('ENOENT'); } From da693cfe757bed4236cafc7f6331ae0eaf2aa2e3 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 6 Mar 2021 16:01:37 +0100 Subject: [PATCH 13/25] update package-lock --- e2e/package-lock.json | 6 +++--- e2e/test/karma-webpack-with-ts/package-lock.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 956b7bc131..b67b0af076 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -8842,9 +8842,9 @@ } }, "mutation-testing-metrics": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.6.0.tgz", - "integrity": "sha512-dJG8yDgBSQbTWnoqp9gTpIuszjvWw13/Eo3+w89PzGlKoqY2pxzSwyjTFVKF7GE+SH6aOoDBlsGKkzekYLz6Aw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.6.2.tgz", + "integrity": "sha512-Rhmp/Mvs27RKTJO2cIzViiPN76ERR3CGVNlBZsM0sbdnbIaTuvISlEHFuIZHEQl/+zySX9Z+h/k/b47JxOskiA==", "dev": true, "requires": { "mutation-testing-report-schema": "^1.6.0" diff --git a/e2e/test/karma-webpack-with-ts/package-lock.json b/e2e/test/karma-webpack-with-ts/package-lock.json index 4648ec502c..9530e8f9b0 100644 --- a/e2e/test/karma-webpack-with-ts/package-lock.json +++ b/e2e/test/karma-webpack-with-ts/package-lock.json @@ -23,9 +23,9 @@ "integrity": "sha512-GSJHHXMGLZDzTRq59IUfL9FCdAlGfqNp/dEa7k7aBaaWD+JKaCjsAk9KYm2V12ItonVaYx2dprN66Zdm1AuBTQ==" }, "mutation-testing-metrics": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.6.0.tgz", - "integrity": "sha512-dJG8yDgBSQbTWnoqp9gTpIuszjvWw13/Eo3+w89PzGlKoqY2pxzSwyjTFVKF7GE+SH6aOoDBlsGKkzekYLz6Aw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mutation-testing-metrics/-/mutation-testing-metrics-1.6.2.tgz", + "integrity": "sha512-Rhmp/Mvs27RKTJO2cIzViiPN76ERR3CGVNlBZsM0sbdnbIaTuvISlEHFuIZHEQl/+zySX9Z+h/k/b47JxOskiA==", "requires": { "mutation-testing-report-schema": "^1.6.0" } From 7cfee499e93663c2d2cf5ca79c25fe91a098992f Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 6 Mar 2021 16:48:08 +0100 Subject: [PATCH 14/25] fix no-coverage detection --- packages/core/src/process/4-mutation-test-executor.ts | 5 ++++- .../test/unit/process/4-mutation-test-executor.spec.ts | 10 +++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/core/src/process/4-mutation-test-executor.ts b/packages/core/src/process/4-mutation-test-executor.ts index 9d211f7916..2172aa5880 100644 --- a/packages/core/src/process/4-mutation-test-executor.ts +++ b/packages/core/src/process/4-mutation-test-executor.ts @@ -71,7 +71,10 @@ export class MutationTestExecutor { } private executeNoCoverage(input$: Observable) { - const [noCoverageMatchedMutant$, coveredMutant$] = partition(input$.pipe(shareReplay()), (mutant) => mutant.status === MutantStatus.NoCoverage); + const [noCoverageMatchedMutant$, coveredMutant$] = partition( + input$.pipe(shareReplay()), + (mutant) => !mutant.static && (mutant.coveredBy?.length ?? 0) === 0 + ); const noCoverageResult$ = noCoverageMatchedMutant$.pipe( map((mutant) => this.mutationTestReportHelper.reportMutantStatus(mutant, MutantStatus.NoCoverage)) ); diff --git a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts index a4e75f4ef8..1b2ede9f18 100644 --- a/packages/core/test/unit/process/4-mutation-test-executor.spec.ts +++ b/packages/core/test/unit/process/4-mutation-test-executor.spec.ts @@ -72,8 +72,8 @@ describe(MutationTestExecutor.name, () => { it('should schedule mutants to be tested', async () => { // Arrange arrangeScenario(); - mutants.push(factory.mutantTestCoverage({ id: '1' })); - mutants.push(factory.mutantTestCoverage({ id: '2' })); + mutants.push(factory.mutantTestCoverage({ id: '1', static: true })); + mutants.push(factory.mutantTestCoverage({ id: '2', coveredBy: ['1'] })); // Act await sut.execute(); @@ -116,7 +116,7 @@ describe(MutationTestExecutor.name, () => { it('should calculate timeout correctly', async () => { // Arrange arrangeScenario(); - mutants.push(factory.mutantTestCoverage({ id: '1', estimatedNetTime: 10 })); + mutants.push(factory.mutantTestCoverage({ id: '1', estimatedNetTime: 10, coveredBy: ['1'] })); testInjector.options.timeoutFactor = 1.5; testInjector.options.timeoutMS = 27; @@ -165,7 +165,7 @@ describe(MutationTestExecutor.name, () => { it('should not run mutants that are uncovered by tests', async () => { // Arrange arrangeScenario(); - mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined, static: false, status: MutantStatus.NoCoverage })); + mutants.push(factory.mutantTestCoverage({ id: '1', coveredBy: undefined, static: false })); // Act await sut.execute(); @@ -232,7 +232,7 @@ describe(MutationTestExecutor.name, () => { it('should report mutant run results', async () => { // Arrange - const mutant = factory.mutantTestCoverage(); + const mutant = factory.mutantTestCoverage({ static: true }); const mutantRunResult = factory.killedMutantRunResult({ status: MutantRunStatus.Killed }); mutants.push(mutant); arrangeScenario({ mutantRunResult }); From 744b5e90480dd64a510f84c245445c63a0e5151d Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 6 Mar 2021 20:13:06 +0100 Subject: [PATCH 15/25] test(e2e): fix coverage analysis e2e unit test --- e2e/test/coverage-analysis/verify/verify.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/test/coverage-analysis/verify/verify.ts b/e2e/test/coverage-analysis/verify/verify.ts index 36d9a95ca2..82e652aeb2 100644 --- a/e2e/test/coverage-analysis/verify/verify.ts +++ b/e2e/test/coverage-analysis/verify/verify.ts @@ -59,7 +59,7 @@ describe('Coverage analysis', () => { const stryker = new Stryker(strykerOptions); // Act - const testsRan = (await stryker.runMutationTest()).reduce((a, b) => a + b.nrOfTestsRan, 0); + const testsRan = (await stryker.runMutationTest()).reduce((a, b) => a + (b.testsCompleted ?? 0), 0); // Assert const metricsResult = calculateMetrics(CoverageAnalysisReporter.instance?.report.files); @@ -79,7 +79,7 @@ describe('Coverage analysis', () => { const stryker = new Stryker(strykerOptions); // Act - const testsRan = (await stryker.runMutationTest()).reduce((a, b) => a + b.nrOfTestsRan, 0); + const testsRan = (await stryker.runMutationTest()).reduce((a, b) => a + (b.testsCompleted ?? 0), 0); // Assert const metricsResult = calculateMetrics(CoverageAnalysisReporter.instance?.report.files); @@ -99,7 +99,7 @@ describe('Coverage analysis', () => { const stryker = new Stryker(strykerOptions); // Act - const testsRan = (await stryker.runMutationTest()).reduce((a, b) => a + b.nrOfTestsRan, 0); + const testsRan = (await stryker.runMutationTest()).reduce((a, b) => a + (b.testsCompleted ?? 0), 0); // Assert const metricsResult = calculateMetrics(CoverageAnalysisReporter.instance?.report.files); From 1845c936a10ba16c0d4d04995076922eaeab7b29 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Thu, 11 Mar 2021 20:51:11 +0100 Subject: [PATCH 16/25] report all properties --- .../core/src/reporters/clear-text-reporter.ts | 2 +- .../reporters/mutation-test-report-helper.ts | 59 +++++--- .../mutation-test-report-helper.spec.ts | 128 +++++++++++++++--- 3 files changed, 151 insertions(+), 38 deletions(-) diff --git a/packages/core/src/reporters/clear-text-reporter.ts b/packages/core/src/reporters/clear-text-reporter.ts index 0f7b6d8207..5e1406d2eb 100644 --- a/packages/core/src/reporters/clear-text-reporter.ts +++ b/packages/core/src/reporters/clear-text-reporter.ts @@ -88,7 +88,6 @@ export class ClearTextReporter implements Reporter { .forEach((line) => { logImplementation(chalk.green('+ ' + line)); }); - logImplementation(''); if (result.status === MutantStatus.Survived) { if (result.static) { logImplementation('Ran all tests for this mutant.'); @@ -100,6 +99,7 @@ export class ClearTextReporter implements Reporter { } else if (result.status === MutantStatus.RuntimeError || result.status === MutantStatus.CompileError) { logImplementation(`Error message: ${result.statusReason}`); } + logImplementation(''); } private colorSourceFileAndLocation(fileName: string, position: Position): string { diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index 2fa62b8d88..df40543674 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -6,7 +6,7 @@ import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; import { normalizeWhitespaces } from '@stryker-mutator/util'; import { calculateMutationTestMetrics, MutationTestMetricsResult } from 'mutation-testing-metrics'; -import { CompleteDryRunResult, MutantRunResult, MutantRunStatus } from '@stryker-mutator/api/test-runner'; +import { CompleteDryRunResult, MutantRunResult, MutantRunStatus, TestResult } from '@stryker-mutator/api/test-runner'; import { CheckStatus, PassedCheckResult, CheckResult } from '@stryker-mutator/api/check'; import { coreTokens } from '../di'; @@ -17,18 +17,15 @@ import { setExitCode } from '../utils/object-utils'; * A helper class to convert and report mutants that survived or get killed */ export class MutationTestReportHelper { - public readonly testNamesById: Map; - public static inject = tokens(coreTokens.reporter, commonTokens.options, coreTokens.inputFiles, commonTokens.logger, coreTokens.dryRunResult); + constructor( private readonly reporter: Required, private readonly options: StrykerOptions, private readonly inputFiles: InputFileCollection, private readonly log: Logger, private readonly dryRunResult: CompleteDryRunResult - ) { - this.testNamesById = new Map(this.dryRunResult.tests.map((test) => [test.id, test.name])); - } + ) {} public reportCheckFailed(mutant: Mutant, checkResult: Exclude): MutantResult { return this.reportOne({ @@ -115,25 +112,38 @@ export class MutationTestReportHelper { } private mutationTestReport(results: readonly MutantResult[]): schema.MutationTestResult { + // Mocha, jest and karma use test titles as test ids. + // This can mean a lot of duplicate strings in the json report. + // Therefore we remap the test ids here to numbers. + const testIdMap = new Map(this.dryRunResult.tests.map((test, index) => [test.id, index.toString()])); + const remapTestId = (id: string): string => testIdMap.get(id) ?? id; + const remapTestIds = (ids: string[] | undefined): string[] | undefined => ids?.map(remapTestId); + return { - files: this.toFileResults(results), + files: this.toFileResults(results, remapTestIds), schemaVersion: '1.0', thresholds: this.options.thresholds, + testFiles: this.toTestFiles(remapTestId), }; } - private toFileResults(results: readonly MutantResult[]): schema.FileResultDictionary { + private toFileResults( + results: readonly MutantResult[], + remapTestIds: (ids: string[] | undefined) => string[] | undefined + ): schema.FileResultDictionary { const resultDictionary: schema.FileResultDictionary = Object.create(null); + results.forEach((mutantResult) => { const fileResult = resultDictionary[mutantResult.fileName]; + const mutant = this.toMutantResult(mutantResult, remapTestIds); if (fileResult) { - fileResult.mutants.push(this.toMutantResult(mutantResult)); + fileResult.mutants.push(mutant); } else { const sourceFile = this.inputFiles.files.find((file) => file.name === mutantResult.fileName); if (sourceFile) { resultDictionary[mutantResult.fileName] = { language: this.determineLanguage(sourceFile.name), - mutants: [this.toMutantResult(mutantResult)], + mutants: [mutant], source: sourceFile.textContent, }; } else { @@ -147,7 +157,22 @@ export class MutationTestReportHelper { return resultDictionary; } - public determineLanguage(name: string): string { + private toTestFiles(remapTestId: (id: string) => string): schema.TestFileDefinitionDictionary { + return { + '': { + tests: this.dryRunResult.tests.map((test) => this.toTestDefinition(test, remapTestId)), + }, + }; + } + + private toTestDefinition(test: TestResult, remapTestId: (id: string) => string): schema.TestDefinition { + return { + id: remapTestId(test.id), + name: test.name, + }; + } + + private determineLanguage(name: string): string { const ext = path.extname(name).toLowerCase(); switch (ext) { case '.ts': @@ -161,13 +186,13 @@ export class MutationTestReportHelper { } } - private toMutantResult(mutantResult: MutantResult): schema.MutantResult { + private toMutantResult(mutantResult: MutantResult, remapTestIds: (ids: string[] | undefined) => string[] | undefined): schema.MutantResult { + const { range, fileName, location, killedBy, coveredBy, ...apiMutant } = mutantResult; return { - id: mutantResult.id, - location: this.toLocation(mutantResult.location), - mutatorName: mutantResult.mutatorName, - replacement: mutantResult.replacement, - status: mutantResult.status, + ...apiMutant, + killedBy: remapTestIds(killedBy), + coveredBy: remapTestIds(coveredBy), + location: this.toLocation(location), }; } diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index 1155f58b98..be0cb35131 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -6,6 +6,8 @@ import { expect } from 'chai'; import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; import { CheckStatus } from '@stryker-mutator/api/check'; +import { calculateMutationTestMetrics } from 'mutation-testing-metrics'; + import { coreTokens } from '../../../src/di'; import { InputFileCollection } from '../../../src/input/input-file-collection'; import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; @@ -63,16 +65,16 @@ describe(MutationTestReportHelper.name, () => { }); it('should copy thresholds', () => { - const actualReport = actReportAll(); + const [actualReport] = actReportAll(); expect(actualReport.thresholds).eq(testInjector.options.thresholds); }); it('should set correct schema version', () => { - const actualReport = actReportAll(); + const [actualReport] = actReportAll(); expect(actualReport.schemaVersion).eq('1.0'); }); - it('should correctly map file properties', () => { + it('should correctly map system under test file properties', () => { // Arrange files.push(new File('foo.js', 'foo content')); files.push(new File('bar.html', 'bar content')); @@ -82,7 +84,7 @@ describe(MutationTestReportHelper.name, () => { const inputMutants = files.map((file) => factory.killedMutantResult({ fileName: file.name })); // Act - const actualReport = actReportAll(inputMutants); + const [actualReport] = actReportAll(inputMutants); // Assert expect(Object.keys(actualReport.files)).lengthOf(5); @@ -93,16 +95,46 @@ describe(MutationTestReportHelper.name, () => { expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); }); + it('should report the tests in `testFiles`', () => { + // Arrange + dryRunResult.tests.push( + factory.testResult({ id: 'spec1', name: 'dog should not eat dog' }), + factory.testResult({ id: 'spec2', name: 'dog should chase its own tail' }) + ); + + // Act + const [actualReport] = actReportAll([]); + + // Assert + const expected: schema.TestFileDefinitionDictionary = { + ['']: { + tests: [ + { id: '0', name: 'dog should not eat dog' }, + { id: '1', name: 'dog should chase its own tail' }, + ], + }, + }; + expect(actualReport.testFiles).deep.eq(expected); + }); + it('should correctly map basic MutantResult properties', () => { // Arrange + const killedMutantResult: MutantResult = { + id: '1', + mutatorName: 'Foo', + replacement: 'foo replacement', + fileName: 'foo.js', + description: 'this is mutant foo', + duration: 42, + location: factory.location(), + range: [1, 2], + static: true, + statusReason: 'smacked on the head', + testsCompleted: 32, + status: MutantStatus.Killed, + }; const inputMutants = [ - factory.mutantResult({ - id: '1', - mutatorName: 'Foo', - replacement: 'foo replacement', - fileName: 'foo.js', - status: MutantStatus.Killed, - }), + killedMutantResult, factory.mutantResult({ fileName: 'bar.js', status: MutantStatus.NoCoverage, @@ -127,16 +159,22 @@ describe(MutationTestReportHelper.name, () => { files.push(...inputMutants.map((m) => new File(m.fileName, ''))); // Act - const actualReport = actReportAll(inputMutants); + const [actualReport] = actReportAll(inputMutants); // Assert - expect(Object.keys(actualReport.files)).lengthOf(6); - expect(actualReport.files['foo.js'].mutants[0]).include({ + const expectedKilledMutant: Partial = { id: '1', mutatorName: 'Foo', replacement: 'foo replacement', + description: 'this is mutant foo', + duration: 42, + static: true, + statusReason: 'smacked on the head', + testsCompleted: 32, status: MutantStatus.Killed, - }); + }; + expect(Object.keys(actualReport.files)).lengthOf(6); + expect(actualReport.files['foo.js'].mutants[0]).include(expectedKilledMutant); expect(actualReport.files['bar.js'].mutants[0]).include({ status: MutantStatus.NoCoverage }); expect(actualReport.files['baz.js'].mutants[0]).include({ status: MutantStatus.RuntimeError }); expect(actualReport.files['qux.js'].mutants[0]).include({ status: MutantStatus.Survived }); @@ -147,10 +185,37 @@ describe(MutationTestReportHelper.name, () => { it('should offset location correctly', () => { const inputMutants = [factory.mutantResult({ location: { end: { line: 3, column: 4 }, start: { line: 1, column: 2 } } })]; files.push(...inputMutants.map((m) => new File(m.fileName, ''))); - const actualReport = actReportAll(inputMutants); + const [actualReport] = actReportAll(inputMutants); expect(actualReport.files['file.js'].mutants[0].location).deep.eq({ end: { line: 4, column: 5 }, start: { line: 2, column: 3 } }); }); + it('should remap test ids if possible (for brevity, since mocha, jest and karma use test titles as test ids)', () => { + // Arrange + dryRunResult.tests.push( + factory.testResult({ id: 'foo should bar', name: 'foo should bar' }), + factory.testResult({ id: 'baz should qux', name: 'baz should qux' }) + ); + const killedMutantResult = factory.mutantResult({ + fileName: 'foo.js', + killedBy: ['foo should bar'], + coveredBy: ['foo should bar', 'baz should qux', 'not found'], + }); + files.push(new File('foo.js', '')); + + // Act + const [actualReport] = actReportAll([killedMutantResult]); + + // Assert + const expectedTests: schema.TestDefinition[] = [ + { id: '0', name: 'foo should bar' }, + { id: '1', name: 'baz should qux' }, + ]; + const actualResultMutant = actualReport.files['foo.js'].mutants[0]; + expect(actualReport.testFiles?.[''].tests).deep.eq(expectedTests); + expect(actualResultMutant.coveredBy).deep.eq(['0', '1', 'not found']); + expect(actualResultMutant.killedBy).deep.eq(['0']); + }); + it('should group mutants by file name', () => { // Arrange const inputMutants = [ @@ -166,7 +231,7 @@ describe(MutationTestReportHelper.name, () => { files.push(new File('foo.js', '')); // Act - const actualReport = actReportAll(inputMutants); + const [actualReport] = actReportAll(inputMutants); // Assert expect(Object.keys(actualReport.files)).lengthOf(1); @@ -175,11 +240,34 @@ describe(MutationTestReportHelper.name, () => { it('should log a warning if source file could not be found', () => { const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; - const actualReport = actReportAll(inputMutants); + const [actualReport] = actReportAll(inputMutants); expect(Object.keys(actualReport.files)).lengthOf(0); expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); }); + it('should provide the metrics as second argument', () => { + // Arrange + const inputMutants: MutantResult[] = [ + { + mutatorName: 'Foo', + fileName: 'foo.js', + status: MutantStatus.Killed, + range: [1, 2], + location: { start: { line: 1, column: 2 }, end: { line: 4, column: 5 } }, + replacement: '+', + id: '1', + }, + ]; + files.push(new File('foo.js', '')); + dryRunResult.tests.push(factory.testResult({ id: 'foo should bar', name: 'foo should bar' })); + + // Act + const [actualReport, metrics] = actReportAll(inputMutants); + + // Assert + expect(metrics).deep.eq(calculateMutationTestMetrics(actualReport)); + }); + describe('determineExitCode', () => { beforeEach(() => { files.push(new File('file.js', '')); @@ -210,9 +298,9 @@ describe(MutationTestReportHelper.name, () => { }); }); - function actReportAll(input: MutantResult[] = []): schema.MutationTestResult { + function actReportAll(input: MutantResult[] = []): Parameters['onMutationTestReportReady']> { sut.reportAll(input); - return reporterMock.onMutationTestReportReady.firstCall.args[0]; + return reporterMock.onMutationTestReportReady.firstCall.args; } }); From b1f6065c6a78d6adfd4c18d24c25aa2dd34e7606 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Thu, 11 Mar 2021 23:39:07 +0100 Subject: [PATCH 17/25] Report tests per test file if reported --- .../core/src/process/3-dry-run-executor.ts | 20 ++++- .../reporters/mutation-test-report-helper.ts | 73 ++++++++++++------- packages/core/src/sandbox/sandbox.ts | 4 + .../unit/process/3-dry-run-executor.spec.ts | 21 +++++- .../mutation-test-report-helper.spec.ts | 40 +++++++++- 5 files changed, 124 insertions(+), 34 deletions(-) diff --git a/packages/core/src/process/3-dry-run-executor.ts b/packages/core/src/process/3-dry-run-executor.ts index 297b99766d..4169ee102a 100644 --- a/packages/core/src/process/3-dry-run-executor.ts +++ b/packages/core/src/process/3-dry-run-executor.ts @@ -70,7 +70,8 @@ export class DryRunExecutor { commonTokens.logger, commonTokens.options, coreTokens.timer, - coreTokens.concurrencyTokenProvider + coreTokens.concurrencyTokenProvider, + coreTokens.sandbox ); constructor( @@ -78,7 +79,8 @@ export class DryRunExecutor { private readonly log: Logger, private readonly options: StrykerOptions, private readonly timer: I, - private readonly concurrencyTokenProvider: I + private readonly concurrencyTokenProvider: I, + public readonly sandbox: I ) {} public async execute(): Promise> { @@ -128,10 +130,24 @@ export class DryRunExecutor { const grossTimeMS = this.timer.elapsedMs(INITIAL_TEST_RUN_MARKER); const humanReadableTimeElapsed = this.timer.humanReadableElapsed(INITIAL_TEST_RUN_MARKER); this.validateResultCompleted(dryRunResult); + + this.remapSandboxFilesToOriginalFiles(dryRunResult); const timing = this.calculateTiming(grossTimeMS, humanReadableTimeElapsed, dryRunResult.tests); return { dryRunResult, timing }; } + /** + * Remaps test files to their respective original names outside the sandbox. + * @param dryRunResult the completed result + */ + private remapSandboxFilesToOriginalFiles(dryRunResult: CompleteDryRunResult) { + dryRunResult.tests.forEach((test) => { + if (test.fileName) { + test.fileName = this.sandbox.originalFileFor(test.fileName); + } + }); + } + private logInitialTestRunSucceeded(tests: TestResult[], timing: Timing) { this.log.info( 'Initial test run succeeded. Ran %s tests in %s (net %s ms, overhead %s ms).', diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index df40543674..d8eeeefd02 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -131,38 +131,55 @@ export class MutationTestReportHelper { results: readonly MutantResult[], remapTestIds: (ids: string[] | undefined) => string[] | undefined ): schema.FileResultDictionary { - const resultDictionary: schema.FileResultDictionary = Object.create(null); - - results.forEach((mutantResult) => { - const fileResult = resultDictionary[mutantResult.fileName]; - const mutant = this.toMutantResult(mutantResult, remapTestIds); - if (fileResult) { - fileResult.mutants.push(mutant); - } else { - const sourceFile = this.inputFiles.files.find((file) => file.name === mutantResult.fileName); - if (sourceFile) { - resultDictionary[mutantResult.fileName] = { - language: this.determineLanguage(sourceFile.name), - mutants: [mutant], - source: sourceFile.textContent, - }; - } else { - this.log.warn( - normalizeWhitespaces(`File "${mutantResult.fileName}" not found - in input files, but did receive mutant result for it. This shouldn't happen`) - ); - } - } - }); - return resultDictionary; + return results.reduce((acc, mutantResult) => { + const fileResult = acc[mutantResult.fileName] ?? (acc[mutantResult.fileName] = this.toFileResult(mutantResult.fileName)); + fileResult.mutants.push(this.toMutantResult(mutantResult, remapTestIds)); + return acc; + }, Object.create(null)); } private toTestFiles(remapTestId: (id: string) => string): schema.TestFileDefinitionDictionary { - return { - '': { - tests: this.dryRunResult.tests.map((test) => this.toTestDefinition(test, remapTestId)), - }, + return this.dryRunResult.tests.reduce((acc, testResult) => { + const test = this.toTestDefinition(testResult, remapTestId); + const fileName = testResult.fileName ?? ''; // by default we accumulate tests under the '' key + const testFile = acc[fileName] ?? (acc[fileName] = this.toTestFile(fileName)); + testFile.tests.push(test); + return acc; + }, Object.create(null)); + } + + private toFileResult(fileName: string): schema.FileResult { + const fileResult: schema.FileResult = { + language: this.determineLanguage(fileName), + mutants: [], + source: '', }; + const sourceFile = this.inputFiles.files.find((file) => file.name === fileName); + if (sourceFile) { + fileResult.source = sourceFile.textContent; + } else { + this.log.warn( + normalizeWhitespaces(`File "${fileName}" not found + in input files, but did receive mutant result for it. This shouldn't happen`) + ); + } + return fileResult; + } + + private toTestFile(fileName: string | undefined): schema.TestFile { + const testFile: schema.TestFile = { tests: [] }; + if (fileName) { + const sourceFile = this.inputFiles.files.find((file) => file.name === fileName); + if (sourceFile) { + testFile.source = sourceFile.textContent; + } else { + this.log.warn( + normalizeWhitespaces(`Test file "${fileName}" not found + in input files, but did receive test result for it. This shouldn't happen.`) + ); + } + } + return testFile; } private toTestDefinition(test: TestResult, remapTestId: (id: string) => string): schema.TestDefinition { diff --git a/packages/core/src/sandbox/sandbox.ts b/packages/core/src/sandbox/sandbox.ts index 96ab8cd292..510f070a89 100644 --- a/packages/core/src/sandbox/sandbox.ts +++ b/packages/core/src/sandbox/sandbox.ts @@ -65,6 +65,10 @@ export class Sandbox implements Disposable { return sandboxFileName; } + public originalFileFor(sandboxFileName: string): string { + return path.resolve(sandboxFileName).replace(this.workingDirectory, process.cwd()); + } + private fillSandbox(): Promise { return from(this.files) .pipe( diff --git a/packages/core/test/unit/process/3-dry-run-executor.spec.ts b/packages/core/test/unit/process/3-dry-run-executor.spec.ts index e8837812e1..59ed101d8c 100644 --- a/packages/core/test/unit/process/3-dry-run-executor.spec.ts +++ b/packages/core/test/unit/process/3-dry-run-executor.spec.ts @@ -1,7 +1,7 @@ import { EOL } from 'os'; import { Injector } from 'typed-inject'; -import { factory, testInjector } from '@stryker-mutator/test-helpers'; +import { assertions, factory, testInjector } from '@stryker-mutator/test-helpers'; import sinon from 'sinon'; import { TestRunner, CompleteDryRunResult, ErrorDryRunResult, TimeoutDryRunResult, DryRunResult } from '@stryker-mutator/api/test-runner'; import { expect } from 'chai'; @@ -16,6 +16,7 @@ import { coreTokens } from '../../../src/di'; import { ConfigError } from '../../../src/errors'; import { ConcurrencyTokenProvider, Pool } from '../../../src/concurrent'; import { createTestRunnerPoolMock } from '../../helpers/producers'; +import { Sandbox } from '../../../src/sandbox'; describe(DryRunExecutor.name, () => { let injectorMock: sinon.SinonStubbedInstance>; @@ -24,6 +25,7 @@ describe(DryRunExecutor.name, () => { let timerMock: sinon.SinonStubbedInstance; let testRunnerMock: sinon.SinonStubbedInstance>; let concurrencyTokenProviderMock: sinon.SinonStubbedInstance; + let sandbox: sinon.SinonStubbedInstance; beforeEach(() => { timerMock = sinon.createStubInstance(Timer); @@ -36,12 +38,14 @@ describe(DryRunExecutor.name, () => { concurrencyTokenProviderMock = sinon.createStubInstance(ConcurrencyTokenProvider); injectorMock = factory.injector(); injectorMock.resolve.withArgs(coreTokens.testRunnerPool).returns(testRunnerPoolMock as I>); + sandbox = sinon.createStubInstance(Sandbox); sut = new DryRunExecutor( injectorMock as Injector, testInjector.logger, testInjector.options, timerMock, - concurrencyTokenProviderMock + concurrencyTokenProviderMock, + sandbox ); }); @@ -118,7 +122,7 @@ describe(DryRunExecutor.name, () => { expect(injector.provideValue).calledWithExactly(coreTokens.timeOverheadMS, 0); }); - it('should provide the result', async () => { + it('should provide the dry run result', async () => { timerMock.elapsedMs.returns(42); runResult.tests.push(factory.successTestResult()); runResult.mutantCoverage = { @@ -129,6 +133,17 @@ describe(DryRunExecutor.name, () => { expect(actualInjector.provideValue).calledWithExactly(coreTokens.dryRunResult, runResult); }); + it('should remap test files that are reported', async () => { + runResult.tests.push(factory.successTestResult({ fileName: '.stryker-tmp/sandbox-123/test/foo.spec.js' })); + sandbox.originalFileFor.returns('test/foo.spec.js'); + await sut.execute(); + const actualDryRunResult = injectorMock.provideValue.getCalls().find((call) => call.args[0] === coreTokens.dryRunResult)! + .args[1] as DryRunResult; + assertions.expectCompleted(actualDryRunResult); + expect(actualDryRunResult.tests[0].fileName).eq('test/foo.spec.js'); + expect(sandbox.originalFileFor).calledWith('.stryker-tmp/sandbox-123/test/foo.spec.js'); + }); + it('should have logged the amount of tests ran', async () => { runResult.tests.push(factory.successTestResult({ timeSpentMs: 10 })); runResult.tests.push(factory.successTestResult({ timeSpentMs: 10 })); diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index be0cb35131..ea7e2d7224 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -95,6 +95,18 @@ describe(MutationTestReportHelper.name, () => { expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); }); + it('should correctly test file properties', () => { + // Arrange + dryRunResult.tests.push(factory.testResult({ id: 'spec1', name: 'dog should not eat dog', fileName: 'foo.spec.js' })); + files.push(new File('foo.js', 'foo content'), new File('foo.spec.js', 'it("dog should not eat dog")'), new File('baz.js', 'baz content')); + + // Act + const [actualReport] = actReportAll(); + + // Assert + expect(actualReport.testFiles?.['foo.spec.js'].source).eq('it("dog should not eat dog")'); + }); + it('should report the tests in `testFiles`', () => { // Arrange dryRunResult.tests.push( @@ -238,13 +250,39 @@ describe(MutationTestReportHelper.name, () => { expect(actualReport.files['foo.js'].mutants).lengthOf(2); }); + it('should group test by test file name', () => { + // Arrange + dryRunResult.tests.push( + factory.testResult({ fileName: 'foo.spec.js', name: '1' }), + factory.testResult({ fileName: 'bar.spec.js', name: '2' }), + factory.testResult({ fileName: 'foo.spec.js', name: '3' }) + ); + files.push(new File('foo.spec.js', ''), new File('bar.spec.js', '')); + + // Act + const [actualReport] = actReportAll([]); + + // Assert + expect(Object.keys(actualReport.testFiles!)).lengthOf(2); + expect(actualReport.testFiles!['foo.spec.js'].tests).lengthOf(2); + expect(actualReport.testFiles!['foo.spec.js'].tests[0].name).eq('1'); + expect(actualReport.testFiles!['foo.spec.js'].tests[1].name).eq('3'); + expect(actualReport.testFiles!['bar.spec.js'].tests[0].name).eq('2'); + }); + it('should log a warning if source file could not be found', () => { const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; const [actualReport] = actReportAll(inputMutants); - expect(Object.keys(actualReport.files)).lengthOf(0); + expect(actualReport.files['not-found.js'].mutants).lengthOf(1); expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); }); + it('should log a warning the test file could not be found', () => { + dryRunResult.tests.push(factory.testResult({ fileName: 'foo.spec.js' })); + actReportAll([]); + expect(testInjector.logger.warn).calledWithMatch('Test file "foo.spec.js" not found in input files'); + }); + it('should provide the metrics as second argument', () => { // Arrange const inputMutants: MutantResult[] = [ From 50e204ebfda40c39ed80e4744b2b105d2606c2bf Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Tue, 16 Mar 2021 08:08:29 +0100 Subject: [PATCH 18/25] feat(report): add `framework`, `config` and `projectRoot` to report --- .../reporters/mutation-test-report-helper.ts | 58 +++++++++++++- .../mutation-test-report-helper.spec.ts | 80 ++++++++++++++++++- 2 files changed, 135 insertions(+), 3 deletions(-) diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index d8eeeefd02..23be24a789 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -4,7 +4,7 @@ import { Location, Position, StrykerOptions, Mutant, MutantTestCoverage, MutantR import { Logger } from '@stryker-mutator/api/logging'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { Reporter } from '@stryker-mutator/api/report'; -import { normalizeWhitespaces } from '@stryker-mutator/util'; +import { normalizeWhitespaces, requireResolve } from '@stryker-mutator/util'; import { calculateMutationTestMetrics, MutationTestMetricsResult } from 'mutation-testing-metrics'; import { CompleteDryRunResult, MutantRunResult, MutantRunStatus, TestResult } from '@stryker-mutator/api/test-runner'; import { CheckStatus, PassedCheckResult, CheckResult } from '@stryker-mutator/api/check'; @@ -13,6 +13,17 @@ import { coreTokens } from '../di'; import { InputFileCollection } from '../input/input-file-collection'; import { setExitCode } from '../utils/object-utils'; +const STRYKER_FRAMEWORK: Readonly> = Object.freeze({ + name: 'StrykerJS', + // eslint-disable-next-line @typescript-eslint/no-require-imports + version: require('../../../package.json').version, + branding: { + homepageUrl: 'https://stryker-mutator.io', + imageUrl: + "data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1458 1458' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' clip-rule='evenodd' stroke-linejoin='round' stroke-miterlimit='2'%3E%3Cpath fill='none' d='M0 0h1458v1458H0z'/%3E%3CclipPath id='a'%3E%3Cpath d='M0 0h1458v1458H0z'/%3E%3C/clipPath%3E%3Cg clip-path='url(%23a)'%3E%3Cpath d='M1458 729c0 402.655-326.345 729-729 729S0 1131.655 0 729C0 326.445 326.345 0 729 0s729 326.345 729 729' fill='%23e74c3c' fill-rule='nonzero'/%3E%3Cpath d='M778.349 1456.15L576.6 1254.401l233-105 85-78.668v-64.332l-257-257-44-187-50-208 251.806-82.793L1076.6 389.401l380.14 379.15c-19.681 367.728-311.914 663.049-678.391 687.599z' fill-opacity='.3'/%3E%3Cpath d='M753.4 329.503c41.79 0 74.579 7.83 97.925 25.444 23.571 18.015 41.69 43.956 55.167 77.097l11.662 28.679 165.733-58.183-14.137-32.13c-26.688-60.655-64.896-108.61-114.191-144.011-49.329-35.423-117.458-54.302-204.859-54.302-50.78 0-95.646 7.376-134.767 21.542-40.093 14.671-74.09 34.79-102.239 60.259-28.84 26.207-50.646 57.06-65.496 92.701-14.718 35.052-22.101 72.538-22.101 112.401 0 72.536 20.667 133.294 61.165 182.704 38.624 47.255 98.346 88.037 179.861 121.291 42.257 17.475 78.715 33.125 109.227 46.994 27.193 12.361 49.294 26.124 66.157 41.751 15.309 14.186 26.497 30.584 33.63 49.258 7.721 20.214 11.16 45.69 11.16 76.402 0 28.021-4.251 51.787-13.591 71.219-8.832 18.374-20.171 33.178-34.523 44.219-14.787 11.374-31.193 19.591-49.393 24.466-19.68 5.359-39.14 7.993-58.69 7.993-29.359 0-54.387-3.407-75.182-10.747-20.112-7.013-37.144-16.144-51.259-27.486-13.618-11.009-24.971-23.766-33.744-38.279-9.64-15.8-17.272-31.924-23.032-48.408l-10.965-31.376-161.669 60.585 10.734 30.124c10.191 28.601 24.197 56.228 42.059 82.748 18.208 27.144 41.322 51.369 69.525 72.745 27.695 21.075 60.904 38.218 99.481 51.041 37.777 12.664 82.004 19.159 132.552 19.159 49.998 0 95.818-8.321 137.611-24.622 42.228-16.471 78.436-38.992 108.835-67.291 30.719-28.597 54.631-62.103 71.834-100.642 17.263-38.56 25.923-79.392 25.923-122.248 0-54.339-8.368-100.37-24.208-138.32-16.29-38.759-38.252-71.661-65.948-98.797-26.965-26.418-58.269-48.835-93.858-67.175-33.655-17.241-69.196-33.11-106.593-47.533-35.934-13.429-65.822-26.601-89.948-39.525-22.153-11.868-40.009-24.21-53.547-37.309-11.429-11.13-19.83-23.678-24.718-37.664-5.413-15.49-7.98-33.423-7.98-53.577 0-40.883 11.293-71.522 37.086-90.539 28.443-20.825 64.985-30.658 109.311-30.658z' fill='%23f1c40f' fill-rule='nonzero'/%3E%3Cpath d='M720 0h18v113h-18zM1458 738v-18h-113v18h113zM720 1345h18v113h-18zM113 738v-18H0v18h113z'/%3E%3C/g%3E%3C/svg%3E", + }, +}); + /** * A helper class to convert and report mutants that survived or get killed */ @@ -124,6 +135,12 @@ export class MutationTestReportHelper { schemaVersion: '1.0', thresholds: this.options.thresholds, testFiles: this.toTestFiles(remapTestId), + projectRoot: process.cwd(), + config: this.options, + framework: { + ...STRYKER_FRAMEWORK, + dependencies: this.discoverDependencies(), + }, }; } @@ -226,4 +243,43 @@ export class MutationTestReportHelper { line: pos.line + 1, }; } + + private discoverDependencies(): schema.Dependencies { + const discover = (specifier: string) => { + try { + return [specifier, (requireResolve(`${specifier}/package.json`) as { version: string }).version]; + } catch { + // package does not exist... + return undefined; + } + }; + const dependencies = [ + '@stryker-mutator/mocha-runner', + '@stryker-mutator/karma-runner', + '@stryker-mutator/jasmine-runner', + '@stryker-mutator/jest-runner', + '@stryker-mutator/typescript-checker', + 'karma', + 'karma-chai', + 'karma-chrome-launcher', + 'karma-jasmine', + 'karma-mocha', + 'mocha', + 'jasmine', + 'jasmine-core', + 'jest', + 'react-scripts', + 'typescript', + '@angular/cli', + 'webpack', + 'webpack-cli', + 'ts-jest', + ]; + return dependencies.map(discover).reduce((acc, dependency) => { + if (dependency) { + acc[dependency[0]] = dependency[1]; + } + return acc; + }, Object.create(null)); + } } diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index ea7e2d7224..9a5e55e4cd 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -2,10 +2,10 @@ import sinon from 'sinon'; import { File, Location, MutantResult, MutantStatus, Range, schema } from '@stryker-mutator/api/core'; import { Reporter } from '@stryker-mutator/api/report'; import { factory, testInjector } from '@stryker-mutator/test-helpers'; +import * as strykerUtil from '@stryker-mutator/util'; import { expect } from 'chai'; import { CompleteDryRunResult } from '@stryker-mutator/api/test-runner'; import { CheckStatus } from '@stryker-mutator/api/check'; - import { calculateMutationTestMetrics } from 'mutation-testing-metrics'; import { coreTokens } from '../../../src/di'; @@ -13,14 +13,16 @@ import { InputFileCollection } from '../../../src/input/input-file-collection'; import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; import * as objectUtils from '../../../src/utils/object-utils'; -describe(MutationTestReportHelper.name, () => { +describe.only(MutationTestReportHelper.name, () => { let reporterMock: sinon.SinonStubbedInstance>; let inputFiles: InputFileCollection; let files: File[]; let setExitCodeStub: sinon.SinonStub; let dryRunResult: CompleteDryRunResult; + let requireResolveStub: sinon.SinonStub, ReturnType>; beforeEach(() => { + requireResolveStub = sinon.stub(strykerUtil, 'requireResolve'); reporterMock = factory.reporter(); setExitCodeStub = sinon.stub(objectUtils, 'setExitCode'); files = []; @@ -74,6 +76,80 @@ describe(MutationTestReportHelper.name, () => { expect(actualReport.schemaVersion).eq('1.0'); }); + it('should add the project root', () => { + const [actualReport] = actReportAll([]); + expect(actualReport.projectRoot).eq(process.cwd()); + }); + + describe('config', () => { + it('should report config', () => { + const [actualReport] = actReportAll([]); + expect(actualReport.config).eq(testInjector.options); + }); + }); + + describe('framework', () => { + it('should report "name", "version" and "branding"', () => { + const expected: Pick = { + name: 'StrykerJS', + // eslint-disable-next-line @typescript-eslint/no-require-imports + version: require('../../../../package.json').version, + branding: { + homepageUrl: 'https://stryker-mutator.io', + imageUrl: + "data:image/svg+xml;utf8,%3Csvg viewBox='0 0 1458 1458' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd' clip-rule='evenodd' stroke-linejoin='round' stroke-miterlimit='2'%3E%3Cpath fill='none' d='M0 0h1458v1458H0z'/%3E%3CclipPath id='a'%3E%3Cpath d='M0 0h1458v1458H0z'/%3E%3C/clipPath%3E%3Cg clip-path='url(%23a)'%3E%3Cpath d='M1458 729c0 402.655-326.345 729-729 729S0 1131.655 0 729C0 326.445 326.345 0 729 0s729 326.345 729 729' fill='%23e74c3c' fill-rule='nonzero'/%3E%3Cpath d='M778.349 1456.15L576.6 1254.401l233-105 85-78.668v-64.332l-257-257-44-187-50-208 251.806-82.793L1076.6 389.401l380.14 379.15c-19.681 367.728-311.914 663.049-678.391 687.599z' fill-opacity='.3'/%3E%3Cpath d='M753.4 329.503c41.79 0 74.579 7.83 97.925 25.444 23.571 18.015 41.69 43.956 55.167 77.097l11.662 28.679 165.733-58.183-14.137-32.13c-26.688-60.655-64.896-108.61-114.191-144.011-49.329-35.423-117.458-54.302-204.859-54.302-50.78 0-95.646 7.376-134.767 21.542-40.093 14.671-74.09 34.79-102.239 60.259-28.84 26.207-50.646 57.06-65.496 92.701-14.718 35.052-22.101 72.538-22.101 112.401 0 72.536 20.667 133.294 61.165 182.704 38.624 47.255 98.346 88.037 179.861 121.291 42.257 17.475 78.715 33.125 109.227 46.994 27.193 12.361 49.294 26.124 66.157 41.751 15.309 14.186 26.497 30.584 33.63 49.258 7.721 20.214 11.16 45.69 11.16 76.402 0 28.021-4.251 51.787-13.591 71.219-8.832 18.374-20.171 33.178-34.523 44.219-14.787 11.374-31.193 19.591-49.393 24.466-19.68 5.359-39.14 7.993-58.69 7.993-29.359 0-54.387-3.407-75.182-10.747-20.112-7.013-37.144-16.144-51.259-27.486-13.618-11.009-24.971-23.766-33.744-38.279-9.64-15.8-17.272-31.924-23.032-48.408l-10.965-31.376-161.669 60.585 10.734 30.124c10.191 28.601 24.197 56.228 42.059 82.748 18.208 27.144 41.322 51.369 69.525 72.745 27.695 21.075 60.904 38.218 99.481 51.041 37.777 12.664 82.004 19.159 132.552 19.159 49.998 0 95.818-8.321 137.611-24.622 42.228-16.471 78.436-38.992 108.835-67.291 30.719-28.597 54.631-62.103 71.834-100.642 17.263-38.56 25.923-79.392 25.923-122.248 0-54.339-8.368-100.37-24.208-138.32-16.29-38.759-38.252-71.661-65.948-98.797-26.965-26.418-58.269-48.835-93.858-67.175-33.655-17.241-69.196-33.11-106.593-47.533-35.934-13.429-65.822-26.601-89.948-39.525-22.153-11.868-40.009-24.21-53.547-37.309-11.429-11.13-19.83-23.678-24.718-37.664-5.413-15.49-7.98-33.423-7.98-53.577 0-40.883 11.293-71.522 37.086-90.539 28.443-20.825 64.985-30.658 109.311-30.658z' fill='%23f1c40f' fill-rule='nonzero'/%3E%3Cpath d='M720 0h18v113h-18zM1458 738v-18h-113v18h113zM720 1345h18v113h-18zM113 738v-18H0v18h113z'/%3E%3C/g%3E%3C/svg%3E", + }, + }; + const [actualReport] = actReportAll([]); + expect(actualReport.framework).deep.include(expected); + }); + + it('should report "dependencies"', () => { + // Arrange + const expectedDependencies: schema.Dependencies = { + '@stryker-mutator/mocha-runner': '1.0.1', + '@stryker-mutator/karma-runner': '1.0.2', + '@stryker-mutator/jasmine-runner': '1.0.3', + '@stryker-mutator/jest-runner': '1.0.4', + '@stryker-mutator/typescript-checker': '1.0.5', + karma: '1.0.6', + 'karma-chai': '1.0.7', + 'karma-chrome-launcher': '1.0.8', + 'karma-jasmine': '1.0.9', + 'karma-mocha': '1.0.10', + mocha: '1.0.11', + jasmine: '1.0.12', + 'jasmine-core': '1.0.13', + jest: '1.0.14', + 'react-scripts': '1.0.15', + typescript: '1.0.16', + '@angular/cli': '1.0.17', + webpack: '1.0.18', + 'webpack-cli': '1.0.19', + 'ts-jest': '1.0.20', + }; + Object.entries(expectedDependencies).forEach(([dep, version]) => requireResolveStub.withArgs(`${dep}/package.json`).returns({ version })); + + // Act + const [actualReport] = actReportAll([]); + + // Assert + expect(actualReport.framework?.dependencies).deep.eq(expectedDependencies); + }); + + it('should ignore dependencies that could not be found', () => { + // Arrange + requireResolveStub.withArgs('karma/package.json').returns({ version: '2.3.4' }); + requireResolveStub.withArgs('typescript/package.json').throws(new Error('[MODULE_NOT_FOUND]: Cannot find module "typescript"')); + + // Act + const [actualReport] = actReportAll([]); + + // Assert + expect(actualReport.framework?.dependencies).deep.eq({ karma: '2.3.4' }); + }); + }); + it('should correctly map system under test file properties', () => { // Arrange files.push(new File('foo.js', 'foo content')); From 8b367e54c9d81b741ceff35df2dac5967579a7c3 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Tue, 16 Mar 2021 15:35:57 +0100 Subject: [PATCH 19/25] Remove `.only` --- .../test/unit/reporters/mutation-test-report-helper.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index 9a5e55e4cd..4f7a399fe0 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -13,7 +13,7 @@ import { InputFileCollection } from '../../../src/input/input-file-collection'; import { MutationTestReportHelper } from '../../../src/reporters/mutation-test-report-helper'; import * as objectUtils from '../../../src/utils/object-utils'; -describe.only(MutationTestReportHelper.name, () => { +describe(MutationTestReportHelper.name, () => { let reporterMock: sinon.SinonStubbedInstance>; let inputFiles: InputFileCollection; let files: File[]; From 4806bc6296df9f49564b3d4439c2564089b9050c Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 20 Mar 2021 20:39:14 +0100 Subject: [PATCH 20/25] report test locations in mutationTestReportReady if provided --- .../reporters/mutation-test-report-helper.ts | 1 + .../mutation-test-report-helper.spec.ts | 370 +++++++++--------- 2 files changed, 188 insertions(+), 183 deletions(-) diff --git a/packages/core/src/reporters/mutation-test-report-helper.ts b/packages/core/src/reporters/mutation-test-report-helper.ts index 23be24a789..31bfbf0b96 100644 --- a/packages/core/src/reporters/mutation-test-report-helper.ts +++ b/packages/core/src/reporters/mutation-test-report-helper.ts @@ -203,6 +203,7 @@ export class MutationTestReportHelper { return { id: remapTestId(test.id), name: test.name, + location: test.startPosition ? { start: this.toPosition(test.startPosition) } : undefined, }; } diff --git a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts index 4f7a399fe0..dc1f01a82d 100644 --- a/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts +++ b/packages/core/test/unit/reporters/mutation-test-report-helper.spec.ts @@ -150,213 +150,217 @@ describe(MutationTestReportHelper.name, () => { }); }); - it('should correctly map system under test file properties', () => { - // Arrange - files.push(new File('foo.js', 'foo content')); - files.push(new File('bar.html', 'bar content')); - files.push(new File('baz.vue', 'baz content')); - files.push(new File('qux.ts', 'qux content')); - files.push(new File('corge.tsx', 'corge content')); - const inputMutants = files.map((file) => factory.killedMutantResult({ fileName: file.name })); - - // Act - const [actualReport] = actReportAll(inputMutants); + describe('system under test', () => { + it('should correctly map system under test file properties', () => { + // Arrange + files.push(new File('foo.js', 'foo content')); + files.push(new File('bar.html', 'bar content')); + files.push(new File('baz.vue', 'baz content')); + files.push(new File('qux.ts', 'qux content')); + files.push(new File('corge.tsx', 'corge content')); + const inputMutants = files.map((file) => factory.killedMutantResult({ fileName: file.name })); - // Assert - expect(Object.keys(actualReport.files)).lengthOf(5); - expect(actualReport.files['foo.js']).include({ language: 'javascript', source: 'foo content' }); - expect(actualReport.files['bar.html']).include({ language: 'html', source: 'bar content' }); - expect(actualReport.files['baz.vue']).include({ language: 'html', source: 'baz content' }); - expect(actualReport.files['qux.ts']).include({ language: 'typescript', source: 'qux content' }); - expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); - }); + // Act + const [actualReport] = actReportAll(inputMutants); - it('should correctly test file properties', () => { - // Arrange - dryRunResult.tests.push(factory.testResult({ id: 'spec1', name: 'dog should not eat dog', fileName: 'foo.spec.js' })); - files.push(new File('foo.js', 'foo content'), new File('foo.spec.js', 'it("dog should not eat dog")'), new File('baz.js', 'baz content')); + // Assert + expect(Object.keys(actualReport.files)).lengthOf(5); + expect(actualReport.files['foo.js']).include({ language: 'javascript', source: 'foo content' }); + expect(actualReport.files['bar.html']).include({ language: 'html', source: 'bar content' }); + expect(actualReport.files['baz.vue']).include({ language: 'html', source: 'baz content' }); + expect(actualReport.files['qux.ts']).include({ language: 'typescript', source: 'qux content' }); + expect(actualReport.files['corge.tsx']).include({ language: 'typescript', source: 'corge content' }); + }); - // Act - const [actualReport] = actReportAll(); + it('should correctly map basic MutantResult properties', () => { + // Arrange + const killedMutantResult: MutantResult = { + id: '1', + mutatorName: 'Foo', + replacement: 'foo replacement', + fileName: 'foo.js', + description: 'this is mutant foo', + duration: 42, + location: factory.location(), + range: [1, 2], + static: true, + statusReason: 'smacked on the head', + testsCompleted: 32, + status: MutantStatus.Killed, + }; + const inputMutants = [ + killedMutantResult, + factory.mutantResult({ + fileName: 'bar.js', + status: MutantStatus.NoCoverage, + }), + factory.mutantResult({ + fileName: 'baz.js', + status: MutantStatus.RuntimeError, + }), + factory.mutantResult({ + fileName: 'qux.js', + status: MutantStatus.Survived, + }), + factory.mutantResult({ + fileName: '5.js', + status: MutantStatus.Timeout, + }), + factory.mutantResult({ + fileName: '6.js', + status: MutantStatus.CompileError, + }), + ]; + files.push(...inputMutants.map((m) => new File(m.fileName, ''))); - // Assert - expect(actualReport.testFiles?.['foo.spec.js'].source).eq('it("dog should not eat dog")'); - }); + // Act + const [actualReport] = actReportAll(inputMutants); - it('should report the tests in `testFiles`', () => { - // Arrange - dryRunResult.tests.push( - factory.testResult({ id: 'spec1', name: 'dog should not eat dog' }), - factory.testResult({ id: 'spec2', name: 'dog should chase its own tail' }) - ); + // Assert + const expectedKilledMutant: Partial = { + id: '1', + mutatorName: 'Foo', + replacement: 'foo replacement', + description: 'this is mutant foo', + duration: 42, + static: true, + statusReason: 'smacked on the head', + testsCompleted: 32, + status: MutantStatus.Killed, + }; + expect(Object.keys(actualReport.files)).lengthOf(6); + expect(actualReport.files['foo.js'].mutants[0]).include(expectedKilledMutant); + expect(actualReport.files['bar.js'].mutants[0]).include({ status: MutantStatus.NoCoverage }); + expect(actualReport.files['baz.js'].mutants[0]).include({ status: MutantStatus.RuntimeError }); + expect(actualReport.files['qux.js'].mutants[0]).include({ status: MutantStatus.Survived }); + expect(actualReport.files['5.js'].mutants[0]).include({ status: MutantStatus.Timeout }); + expect(actualReport.files['6.js'].mutants[0]).include({ status: MutantStatus.CompileError }); + }); - // Act - const [actualReport] = actReportAll([]); + it('should offset location correctly', () => { + const inputMutants = [factory.mutantResult({ location: { end: { line: 3, column: 4 }, start: { line: 1, column: 2 } } })]; + files.push(...inputMutants.map((m) => new File(m.fileName, ''))); + const [actualReport] = actReportAll(inputMutants); + expect(actualReport.files['file.js'].mutants[0].location).deep.eq({ end: { line: 4, column: 5 }, start: { line: 2, column: 3 } }); + }); - // Assert - const expected: schema.TestFileDefinitionDictionary = { - ['']: { - tests: [ - { id: '0', name: 'dog should not eat dog' }, - { id: '1', name: 'dog should chase its own tail' }, - ], - }, - }; - expect(actualReport.testFiles).deep.eq(expected); - }); + it('should group mutants by file name', () => { + // Arrange + const inputMutants = [ + factory.mutantResult({ + mutatorName: 'Foo', + fileName: 'foo.js', + }), + factory.mutantResult({ + mutatorName: 'Bar', + fileName: 'foo.js', + }), + ]; + files.push(new File('foo.js', '')); - it('should correctly map basic MutantResult properties', () => { - // Arrange - const killedMutantResult: MutantResult = { - id: '1', - mutatorName: 'Foo', - replacement: 'foo replacement', - fileName: 'foo.js', - description: 'this is mutant foo', - duration: 42, - location: factory.location(), - range: [1, 2], - static: true, - statusReason: 'smacked on the head', - testsCompleted: 32, - status: MutantStatus.Killed, - }; - const inputMutants = [ - killedMutantResult, - factory.mutantResult({ - fileName: 'bar.js', - status: MutantStatus.NoCoverage, - }), - factory.mutantResult({ - fileName: 'baz.js', - status: MutantStatus.RuntimeError, - }), - factory.mutantResult({ - fileName: 'qux.js', - status: MutantStatus.Survived, - }), - factory.mutantResult({ - fileName: '5.js', - status: MutantStatus.Timeout, - }), - factory.mutantResult({ - fileName: '6.js', - status: MutantStatus.CompileError, - }), - ]; - files.push(...inputMutants.map((m) => new File(m.fileName, ''))); + // Act + const [actualReport] = actReportAll(inputMutants); - // Act - const [actualReport] = actReportAll(inputMutants); + // Assert + expect(Object.keys(actualReport.files)).lengthOf(1); + expect(actualReport.files['foo.js'].mutants).lengthOf(2); + }); - // Assert - const expectedKilledMutant: Partial = { - id: '1', - mutatorName: 'Foo', - replacement: 'foo replacement', - description: 'this is mutant foo', - duration: 42, - static: true, - statusReason: 'smacked on the head', - testsCompleted: 32, - status: MutantStatus.Killed, - }; - expect(Object.keys(actualReport.files)).lengthOf(6); - expect(actualReport.files['foo.js'].mutants[0]).include(expectedKilledMutant); - expect(actualReport.files['bar.js'].mutants[0]).include({ status: MutantStatus.NoCoverage }); - expect(actualReport.files['baz.js'].mutants[0]).include({ status: MutantStatus.RuntimeError }); - expect(actualReport.files['qux.js'].mutants[0]).include({ status: MutantStatus.Survived }); - expect(actualReport.files['5.js'].mutants[0]).include({ status: MutantStatus.Timeout }); - expect(actualReport.files['6.js'].mutants[0]).include({ status: MutantStatus.CompileError }); + it('should log a warning if source file could not be found', () => { + const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; + const [actualReport] = actReportAll(inputMutants); + expect(actualReport.files['not-found.js'].mutants).lengthOf(1); + expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); + }); }); - it('should offset location correctly', () => { - const inputMutants = [factory.mutantResult({ location: { end: { line: 3, column: 4 }, start: { line: 1, column: 2 } } })]; - files.push(...inputMutants.map((m) => new File(m.fileName, ''))); - const [actualReport] = actReportAll(inputMutants); - expect(actualReport.files['file.js'].mutants[0].location).deep.eq({ end: { line: 4, column: 5 }, start: { line: 2, column: 3 } }); - }); + describe('tests', () => { + it('should correctly provide test file properties', () => { + // Arrange + dryRunResult.tests.push(factory.testResult({ id: 'spec1', name: 'dog should not eat dog', fileName: 'foo.spec.js' })); + files.push(new File('foo.js', 'foo content'), new File('foo.spec.js', 'it("dog should not eat dog")'), new File('baz.js', 'baz content')); - it('should remap test ids if possible (for brevity, since mocha, jest and karma use test titles as test ids)', () => { - // Arrange - dryRunResult.tests.push( - factory.testResult({ id: 'foo should bar', name: 'foo should bar' }), - factory.testResult({ id: 'baz should qux', name: 'baz should qux' }) - ); - const killedMutantResult = factory.mutantResult({ - fileName: 'foo.js', - killedBy: ['foo should bar'], - coveredBy: ['foo should bar', 'baz should qux', 'not found'], + // Act + const [actualReport] = actReportAll(); + + // Assert + expect(actualReport.testFiles?.['foo.spec.js'].source).eq('it("dog should not eat dog")'); }); - files.push(new File('foo.js', '')); - // Act - const [actualReport] = actReportAll([killedMutantResult]); + it('should report the tests in `testFiles`', () => { + // Arrange + dryRunResult.tests.push( + factory.testResult({ id: 'spec1', name: 'dog should not eat dog' }), + factory.testResult({ id: 'spec2', name: 'dog should chase its own tail', startPosition: { line: 5, column: 0 } }) + ); - // Assert - const expectedTests: schema.TestDefinition[] = [ - { id: '0', name: 'foo should bar' }, - { id: '1', name: 'baz should qux' }, - ]; - const actualResultMutant = actualReport.files['foo.js'].mutants[0]; - expect(actualReport.testFiles?.[''].tests).deep.eq(expectedTests); - expect(actualResultMutant.coveredBy).deep.eq(['0', '1', 'not found']); - expect(actualResultMutant.killedBy).deep.eq(['0']); - }); + // Act + const [actualReport] = actReportAll([]); - it('should group mutants by file name', () => { - // Arrange - const inputMutants = [ - factory.mutantResult({ - mutatorName: 'Foo', - fileName: 'foo.js', - }), - factory.mutantResult({ - mutatorName: 'Bar', - fileName: 'foo.js', - }), - ]; - files.push(new File('foo.js', '')); + // Assert + const expected: schema.TestFileDefinitionDictionary = { + ['']: { + tests: [ + { id: '0', name: 'dog should not eat dog', location: undefined }, + { id: '1', name: 'dog should chase its own tail', location: { start: { line: 6, column: 1 } } }, // mutation testing elements uses offset 1 for both line and column + ], + }, + }; + expect(actualReport.testFiles).deep.eq(expected); + }); - // Act - const [actualReport] = actReportAll(inputMutants); + it('should remap test ids if possible (for brevity, since mocha, jest and karma use test titles as test ids)', () => { + // Arrange + dryRunResult.tests.push( + factory.testResult({ id: 'foo should bar', name: 'foo should bar' }), + factory.testResult({ id: 'baz should qux', name: 'baz should qux' }) + ); + const killedMutantResult = factory.mutantResult({ + fileName: 'foo.js', + killedBy: ['foo should bar'], + coveredBy: ['foo should bar', 'baz should qux', 'not found'], + }); + files.push(new File('foo.js', '')); - // Assert - expect(Object.keys(actualReport.files)).lengthOf(1); - expect(actualReport.files['foo.js'].mutants).lengthOf(2); - }); + // Act + const [actualReport] = actReportAll([killedMutantResult]); - it('should group test by test file name', () => { - // Arrange - dryRunResult.tests.push( - factory.testResult({ fileName: 'foo.spec.js', name: '1' }), - factory.testResult({ fileName: 'bar.spec.js', name: '2' }), - factory.testResult({ fileName: 'foo.spec.js', name: '3' }) - ); - files.push(new File('foo.spec.js', ''), new File('bar.spec.js', '')); + // Assert + const expectedTests: schema.TestDefinition[] = [ + { id: '0', name: 'foo should bar', location: undefined }, + { id: '1', name: 'baz should qux', location: undefined }, + ]; + const actualResultMutant = actualReport.files['foo.js'].mutants[0]; + expect(actualReport.testFiles?.[''].tests).deep.eq(expectedTests); + expect(actualResultMutant.coveredBy).deep.eq(['0', '1', 'not found']); + expect(actualResultMutant.killedBy).deep.eq(['0']); + }); - // Act - const [actualReport] = actReportAll([]); + it('should group test by test file name', () => { + // Arrange + dryRunResult.tests.push( + factory.testResult({ fileName: 'foo.spec.js', name: '1' }), + factory.testResult({ fileName: 'bar.spec.js', name: '2' }), + factory.testResult({ fileName: 'foo.spec.js', name: '3' }) + ); + files.push(new File('foo.spec.js', ''), new File('bar.spec.js', '')); - // Assert - expect(Object.keys(actualReport.testFiles!)).lengthOf(2); - expect(actualReport.testFiles!['foo.spec.js'].tests).lengthOf(2); - expect(actualReport.testFiles!['foo.spec.js'].tests[0].name).eq('1'); - expect(actualReport.testFiles!['foo.spec.js'].tests[1].name).eq('3'); - expect(actualReport.testFiles!['bar.spec.js'].tests[0].name).eq('2'); - }); + // Act + const [actualReport] = actReportAll([]); - it('should log a warning if source file could not be found', () => { - const inputMutants = [factory.killedMutantResult({ fileName: 'not-found.js' })]; - const [actualReport] = actReportAll(inputMutants); - expect(actualReport.files['not-found.js'].mutants).lengthOf(1); - expect(testInjector.logger.warn).calledWithMatch('File "not-found.js" not found'); - }); + // Assert + expect(Object.keys(actualReport.testFiles!)).lengthOf(2); + expect(actualReport.testFiles!['foo.spec.js'].tests).lengthOf(2); + expect(actualReport.testFiles!['foo.spec.js'].tests[0].name).eq('1'); + expect(actualReport.testFiles!['foo.spec.js'].tests[1].name).eq('3'); + expect(actualReport.testFiles!['bar.spec.js'].tests[0].name).eq('2'); + }); - it('should log a warning the test file could not be found', () => { - dryRunResult.tests.push(factory.testResult({ fileName: 'foo.spec.js' })); - actReportAll([]); - expect(testInjector.logger.warn).calledWithMatch('Test file "foo.spec.js" not found in input files'); + it('should log a warning the test file could not be found', () => { + dryRunResult.tests.push(factory.testResult({ fileName: 'foo.spec.js' })); + actReportAll([]); + expect(testInjector.logger.warn).calledWithMatch('Test file "foo.spec.js" not found in input files'); + }); }); it('should provide the metrics as second argument', () => { From 769a06e9eaf73ed61a092ccad2365e665a5bea85 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Sat, 20 Mar 2021 22:43:20 +0100 Subject: [PATCH 21/25] Use correct line number offsets --- e2e/test/jest-node/stryker.conf.json | 6 ++++- e2e/test/jest-node/verify/verify.ts | 24 ++++++++++++++++++- .../core/src/process/3-dry-run-executor.ts | 10 ++++++++ packages/jest-runner/src/jest-test-runner.ts | 8 ++++++- .../integration/jest-test-runner.it.spec.ts | 10 ++++---- .../test/unit/jest-test-runner.spec.ts | 4 ++-- 6 files changed, 52 insertions(+), 10 deletions(-) diff --git a/e2e/test/jest-node/stryker.conf.json b/e2e/test/jest-node/stryker.conf.json index e2500aff77..2728ddb540 100644 --- a/e2e/test/jest-node/stryker.conf.json +++ b/e2e/test/jest-node/stryker.conf.json @@ -5,10 +5,14 @@ "tempDirName": "stryker-tmp", "concurrency": 1, "coverageAnalysis": "off", + "plugins": [ + "/home/nicojs/github/stryker-js/packages/jest-runner" + ], "reporters": [ "clear-text", "progress", "html", - "event-recorder" + "event-recorder", + "json" ] } diff --git a/e2e/test/jest-node/verify/verify.ts b/e2e/test/jest-node/verify/verify.ts index 8c6551e440..461332ff52 100644 --- a/e2e/test/jest-node/verify/verify.ts +++ b/e2e/test/jest-node/verify/verify.ts @@ -1,4 +1,7 @@ - +import { expect } from 'chai'; +import path from 'path'; +import { promises as fsPromises } from 'fs'; +import { MutationTestResult, TestFileDefinitionDictionary } from 'mutation-testing-report-schema'; import { expectMetricsResult, produceMetrics } from '../../../helpers'; describe('After running stryker with test runner jest on test environment "node"', () => { @@ -18,4 +21,23 @@ describe('After running stryker with test runner jest on test environment "node" }) }); }); + + it('should report test files and test locations', async () => { + const report: MutationTestResult = require('../reports/mutation/mutation.json'); + const expectedTestFiles: TestFileDefinitionDictionary = { + [path.resolve(__dirname, '..', 'src', 'sum.test.js')]: { + source: await fsPromises.readFile(path.resolve(__dirname, '..', 'src', 'sum.test.js'), 'utf-8'), + tests: [{ + id: '0', + name: 'adds 1 + 2 to equal 3', + location: { start: { line: 3, column: 2 } } // columns should be 1, but for some reason aren't. Best guess if jest? 🤷‍♂️ + }, { + id: '1', + name: 'sub 1 - 0 to equal 1', + location: { start: { line: 6, column: 2 } } + }] + } + }; + expect(report.testFiles).deep.eq(expectedTestFiles); + }); }); diff --git a/packages/core/src/process/3-dry-run-executor.ts b/packages/core/src/process/3-dry-run-executor.ts index 4169ee102a..8512cfc51e 100644 --- a/packages/core/src/process/3-dry-run-executor.ts +++ b/packages/core/src/process/3-dry-run-executor.ts @@ -1,5 +1,8 @@ import { EOL } from 'os'; +import path from 'path'; + +import minimatch from 'minimatch'; import { Injector } from 'typed-inject'; import { I } from '@stryker-mutator/util'; import { Logger } from '@stryker-mutator/api/logging'; @@ -144,6 +147,13 @@ export class DryRunExecutor { dryRunResult.tests.forEach((test) => { if (test.fileName) { test.fileName = this.sandbox.originalFileFor(test.fileName); + + // HACK line numbers of the tests can be offset by 1 because the disable type checks preprocessor could have added a `// @ts-nocheck` line. + // We correct for that here if needed + // If we do more complex stuff in sandbox preprocessing in the future, we might want to add a robust remapping logic + if (test.startPosition && this.options.disableTypeChecks && minimatch(test.fileName, path.resolve(this.options.disableTypeChecks))) { + test.startPosition.line--; + } } }); } diff --git a/packages/jest-runner/src/jest-test-runner.ts b/packages/jest-runner/src/jest-test-runner.ts index 0feb012393..677d5146f7 100644 --- a/packages/jest-runner/src/jest-test-runner.ts +++ b/packages/jest-runner/src/jest-test-runner.ts @@ -197,7 +197,13 @@ export class JestTestRunner implements TestRunner { name: testResult.fullName, timeSpentMs: testResult.duration ?? 0, fileName: suiteResult.testFilePath, - startPosition: testResult.location ?? undefined, + startPosition: testResult.location + ? { + // Stryker works 0-based internally, jest works 1-based: https://jestjs.io/docs/cli#--testlocationinresults + line: testResult.location.line - 1, + column: testResult.location.column, + } + : undefined, }; switch (testResult.status) { diff --git a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts index 06310ccdd7..4f74b0816f 100644 --- a/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts +++ b/packages/jest-runner/test/integration/jest-test-runner.it.spec.ts @@ -80,27 +80,27 @@ describe(`${JestTestRunner.name} integration test`, () => { { id: 'Add should be able to add two numbers', fileName: addSpecFileName, - startPosition: { column: 2, line: 7 }, + startPosition: { column: 2, line: 6 }, }, { id: 'Add should be able to add one to a number', fileName: addSpecFileName, - startPosition: { column: 2, line: 17 }, + startPosition: { column: 2, line: 16 }, }, { id: 'Add should be able negate a number', fileName: addSpecFileName, - startPosition: { column: 2, line: 26 }, + startPosition: { column: 2, line: 25 }, }, { id: 'Add should be able to recognize a negative number', fileName: addSpecFileName, - startPosition: { column: 2, line: 35 }, + startPosition: { column: 2, line: 34 }, }, { id: 'Circle should have a circumference of 2PI when the radius is 1', fileName: circleSpecFileName, - startPosition: { column: 2, line: 4 }, + startPosition: { column: 2, line: 3 }, }, ]); }); diff --git a/packages/jest-runner/test/unit/jest-test-runner.spec.ts b/packages/jest-runner/test/unit/jest-test-runner.spec.ts index 2c6aa3d890..cdb89c2f4a 100644 --- a/packages/jest-runner/test/unit/jest-test-runner.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-runner.spec.ts @@ -128,7 +128,7 @@ describe(JestTestRunner.name, () => { name: 'App renders without crashing', status: TestStatus.Success, timeSpentMs: 23, - startPosition: { column: 4, line: 3 }, + startPosition: { column: 3, line: 2 }, fileName: 'foo.js', }, ], @@ -221,7 +221,7 @@ describe(JestTestRunner.name, () => { status: TestStatus.Success, timeSpentMs: 23, fileName: 'quux.js', - startPosition: { line: 42, column: 43 }, + startPosition: { line: 41, column: 42 }, }, ], }; From 33783d9fc8929b3a7629a6f0cc768a9081907c28 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 26 Mar 2021 22:05:07 +0100 Subject: [PATCH 22/25] update jest in e2e tests --- e2e/package-lock.json | 9295 ++++++++++++++++++++++++----------------- e2e/package.json | 2 +- 2 files changed, 5512 insertions(+), 3785 deletions(-) diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 70e3d22e30..81a708c68f 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -490,18 +490,18 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true } } @@ -542,9 +542,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true } } @@ -568,9 +568,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true } } @@ -594,9 +594,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true } } @@ -1213,35 +1213,56 @@ } }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", - "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.3.0", - "jest-util": "^26.3.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", "slash": "^3.0.0" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -1267,12 +1288,51 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1287,38 +1347,47 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "@jest/core": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz", - "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/reporters": "^26.4.1", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.3.0", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-resolve-dependencies": "^26.4.2", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "jest-watcher": "^26.3.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -1326,13 +1395,25 @@ "strip-ansi": "^6.0.0" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -1391,6 +1472,20 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -1437,82 +1532,36 @@ } }, "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0" - } - }, - "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" - } - }, - "@jest/globals": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz", - "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/types": "^26.3.0", - "expect": "^26.4.2" - } - }, - "@jest/reporters": { - "version": "26.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", - "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^5.0.1" + "jest-mock": "^26.6.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -1547,18 +1596,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1570,80 +1607,39 @@ } } }, - "@jest/source-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz", - "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz", - "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==", - "dev": true, - "requires": { - "@jest/test-result": "^26.3.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2" - } - }, - "@jest/transform": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", - "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.3.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.3.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -1702,6 +1698,20 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -1712,18 +1722,6 @@ "picomatch": "^2.0.5" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1744,26 +1742,36 @@ } } }, - "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -1809,168 +1817,74 @@ } } }, - "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", - "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", - "dev": true - }, - "@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", - "dev": true - }, - "@types/cors": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", - "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==", - "dev": true - }, - "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.10", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.10.tgz", - "integrity": "sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q==", + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", "dev": true, "requires": { - "jest-diff": "^25.2.1", - "pretty-format": "^25.2.1" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" }, "dependencies": { "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "chalk": "^4.0.0" } }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "color-convert": "^2.0.1" } }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "fill-range": "^7.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1992,11 +1906,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } }, "has-flag": { "version": "4.0.0", @@ -2004,36 +1921,48 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" } }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2042,965 +1971,1050 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "10.17.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", - "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/prettier": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.0.tgz", - "integrity": "sha512-hiYA88aHiEIgDmeKlsyVsuQdcFn3Z2VuFd/Xm/HCnGnPD8UFU5BM128uzzRVVGEzKDKYUrRsRH9S2o+NUy/3IA==", - "dev": true - }, - "@types/semver": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.1.tgz", - "integrity": "sha512-+beqKQOh9PYxuHvijhVl+tIHvT6tuwOrE9m14zd+MT2A38KoKZhh7pYJ0SNleLtwDsiIxHDsIk9bv01oOxvSvA==", - "dev": true - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "dev": true, "requires": { - "@xtuc/long": "4.2.2" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@jest/types": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", + "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" + "type-detect": "4.0.8" } }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" + "@sinonjs/commons": "^1.7.0" } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } }, - "abab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", - "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", "dev": true, "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" + "@babel/types": "^7.3.0" } }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "ajv": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.2.tgz", - "integrity": "sha512-qIaxO9RXjaXyO21tJr0EvwPcZa49m64GcXCU8ZrLjCAlFyMuOcPpI560So4A11M1WsKslJYIXn6jSyG5P0xIeg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", "dev": true }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", "dev": true }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "@types/cors": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", + "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==", "dev": true }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } + "@types/node": "*" } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/istanbul-lib-coverage": "*" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true + "@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "@types/jest": { + "version": "26.0.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.10.tgz", + "integrity": "sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" }, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "@types/node": { + "version": "10.17.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", + "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "@types/prettier": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "@types/semver": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-6.2.1.tgz", + "integrity": "sha512-+beqKQOh9PYxuHvijhVl+tIHvT6tuwOrE9m14zd+MT2A38KoKZhh7pYJ0SNleLtwDsiIxHDsIk9bv01oOxvSvA==", "dev": true }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "@types/yargs-parser": "*" } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", "dev": true }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "dev": true, - "optional": true + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", "dev": true }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } }, - "axios": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", - "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { - "follow-redirects": "^1.10.0" + "@xtuc/ieee754": "^1.2.0" } }, - "babel-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz", - "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==", + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "dev": true, "requires": { - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.3.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@xtuc/long": "4.2.2" } }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "dev": true, "requires": { - "object.assign": "^4.1.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" } }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, - "babel-plugin-jest-hoist": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz", - "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==", + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "dev": true, "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, - "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "dev": true, "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, - "babel-preset-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz", - "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==", + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.2.0", - "babel-preset-current-node-syntax": "^0.1.3" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "abab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", + "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", "dev": true }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, - "optional": true + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "ajv": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.2.tgz", + "integrity": "sha512-qIaxO9RXjaXyO21tJr0EvwPcZa49m64GcXCU8ZrLjCAlFyMuOcPpI560So4A11M1WsKslJYIXn6jSyG5P0xIeg==", "dev": true, - "optional": true, "requires": { - "file-uri-to-path": "1.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "type-fest": "^0.11.0" }, "dependencies": { - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true } } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "color-convert": "^1.9.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "remove-trailing-separator": "^1.0.1" } } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true }, - "browserify-des": { + "array-find-index": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "safer-buffer": "~2.1.0" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -3011,1385 +3025,1294 @@ } } }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "object-assign": "^4.1.1", + "util": "0.10.3" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "2.0.1" } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true } } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001043", - "electron-to-chromium": "^1.3.413", - "node-releases": "^1.1.53", - "pkg-up": "^2.0.0" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } + "optional": true }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001083", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001083.tgz", - "integrity": "sha512-CnYJ27awX4h7yj5glfK7r1TOI13LBytpLzEgfj0s4mY75/F8pnQcYjL+oVpmS38FB59+vU0gscQ9D8tc+lIXvA==", + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "axios": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", "dev": true, "requires": { - "check-error": "^1.0.2" + "follow-redirects": "^1.10.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "object.assign": "^4.1.0" } }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, - "cmd-shim": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.0.2.tgz", - "integrity": "sha512-yuOHOon6oFX6kcxVl2jIkvPJsQ/yiKp9fd2dnuoBRZB9GEJ3USWAFCIqfB4xmFou93C3MjjhAprcDwrw+O29VA==", + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "mkdirp-infer-owner": "^2.0.0" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true - }, - "collect-v8-coverage": { + "babel-preset-current-node-syntax": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } } }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "tweetnacl": "^0.14.3" } }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "file-uri-to-path": "1.0.0" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "object-assign": "^4", - "vary": "^1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "cipher-base": "^1.0.3", + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "safe-buffer": "^5.0.1" } }, - "cross-env": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", - "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "cross-spawn": "^6.0.5" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "dev": true, "requires": { - "cssom": "~0.3.6" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "pako": "~1.0.5" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "fast-json-stable-stringify": "2.x" } }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" + "node-int64": "^0.4.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, "requires": { - "ms": "2.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { + "cache-base": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-newline": { + "callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "diff-sequences": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", - "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "caniuse-lite": { + "version": "1.0.30001083", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001083.tgz", + "integrity": "sha512-CnYJ27awX4h7yj5glfK7r1TOI13LBytpLzEgfj0s4mY75/F8pnQcYjL+oVpmS38FB59+vU0gscQ9D8tc+lIXvA==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "rsvp": "^4.8.4" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "check-error": "^1.0.2" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.473", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.473.tgz", - "integrity": "sha512-smevlzzMNz3vMz6OLeeCq5HRWEj2AcgccNPYnAx4Usx0IOciq9DU36RJcICcS09hXoY7t7deRfVYKD14IrGb9A==", + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, + "optional": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, - "emittery": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", - "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "encodeurl": { + "chrome-trace-event": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { - "once": "^1.4.0" + "tslib": "^1.9.0" } }, - "engine.io": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.0.tgz", - "integrity": "sha512-vW7EAtn0HDQ4MtT5QbmCHF17TaYLONv2/JwdYsq9USPRZVM4zG7WB3k0Nc321z8EuSOlhGokrYlYx4176QhD0A==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", - "dev": true - } - } + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true }, - "engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "base64-arraybuffer": "0.1.4" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "is-descriptor": "^0.1.0" } } } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "prr": "~1.0.1" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "cmd-shim": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.0.2.tgz", + "integrity": "sha512-yuOHOon6oFX6kcxVl2jIkvPJsQ/yiKp9fd2dnuoBRZB9GEJ3USWAFCIqfB4xmFou93C3MjjhAprcDwrw+O29VA==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "graceful-fs": "^4.1.2", + "mkdirp-infer-owner": "^2.0.0" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "coffeescript": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", + "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "color-name": "1.1.3" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "delayed-stream": "~1.0.0" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "execa": { + "constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "safe-buffer": "~5.1.1" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "object-assign": "^4", + "vary": "^1" } }, - "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "@jest/types": "^26.3.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-regex-util": "^26.0.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", "dev": true } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-env": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", + "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -4421,1175 +4344,2337 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true } } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "webidl-conversions": "^5.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } } } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "electron-to-chromium": { + "version": "1.3.473", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.473.tgz", + "integrity": "sha512-smevlzzMNz3vMz6OLeeCq5HRWEj2AcgccNPYnAx4Usx0IOciq9DU36RJcICcS09hXoY7t7deRfVYKD14IrGb9A==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "once": "^1.4.0" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "engine.io": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.0.tgz", + "integrity": "sha512-vW7EAtn0HDQ4MtT5QbmCHF17TaYLONv2/JwdYsq9USPRZVM4zG7WB3k0Nc321z8EuSOlhGokrYlYx4176QhD0A==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + } } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "base64-arraybuffer": "0.1.4" } }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } } }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "prr": "~1.0.1" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "optional": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" + "is-arrayish": "^0.2.1" } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } }, - "get-stdin": { + "esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "pump": "^3.0.0" + "estraverse": "^4.1.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, - "glob-parent": { + "events": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, - "optional": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "exec-sh": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.5.tgz", + "integrity": "sha512-0hzpaUazv4mEccxdn3TXC+HWNeVXNKMCJRK6E7Xyg+LwGAYI3yFag6jTkd4injV+kChYDQS1ftqDhnDVWNhU8A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "global-prefix": "^3.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" } } } }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "homedir-polyfill": "^1.0.1" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "grunt": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", - "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "dev": true, "requires": { - "coffeescript": "~1.10.0", - "dateformat": "~1.0.12", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.3.0", - "glob": "~7.0.0", - "grunt-cli": "~1.2.0", - "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~2.0.0", - "grunt-legacy-util": "~1.1.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.13.0", - "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", - "nopt": "~3.0.6", - "path-is-absolute": "~1.0.0", - "rimraf": "~2.6.2" + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" }, "dependencies": { - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "findup-sync": "~0.3.0", - "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" + "color-convert": "^2.0.1" } }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "grunt-legacy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", - "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.5" - } - }, - "grunt-legacy-log-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", - "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", - "dev": true, - "requires": { - "chalk": "~2.4.1", - "lodash": "~4.17.10" - } - }, - "grunt-legacy-util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", - "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", - "dev": true, - "requires": { - "async": "~1.5.2", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.10", - "underscore.string": "~3.3.4", - "which": "~1.3.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "is-descriptor": "^1.0.0" } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "bser": "2.1.1" } }, - "has-values": { + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { + "extend-shallow": "^2.0.1", "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-extendable": "^0.1.0" } } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "locate-path": "^3.0.0" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "locate-path": "^2.0.0" } }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "~5.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.5" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", "dev": true }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "map-cache": "^0.2.2" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, + "optional": true, "requires": { - "repeating": "^2.0.0" + "bindings": "^1.5.0", + "nan": "^2.12.1" } }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "pump": "^3.0.0" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, - "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "assert-plus": "^1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "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" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, + "optional": true, "requires": { - "kind-of": "^3.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, + "optional": true, "requires": { - "is-buffer": "^1.1.5" + "is-extglob": "^2.1.0" } } } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "global-prefix": "^3.0.0" }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } } } }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } + "optional": true }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "grunt": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", + "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "coffeescript": "~1.10.0", + "dateformat": "~1.0.12", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.3.0", + "glob": "~7.0.0", + "grunt-cli": "~1.2.0", + "grunt-known-options": "~1.1.0", + "grunt-legacy-log": "~2.0.0", + "grunt-legacy-util": "~1.1.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.13.0", + "minimatch": "~3.0.2", + "mkdirp": "~0.5.1", + "nopt": "~3.0.6", + "path-is-absolute": "~1.0.0", + "rimraf": "~2.6.2" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "grunt-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "dev": true, + "requires": { + "findup-sync": "~0.3.0", + "grunt-known-options": "~1.1.0", + "nopt": "~3.0.6", + "resolve": "~1.1.0" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } } }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "grunt-known-options": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "grunt-legacy-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", + "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", "dev": true, "requires": { - "isobject": "^3.0.1" + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.5" } }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "grunt-legacy-log-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", + "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", + "dev": true, + "requires": { + "chalk": "~2.4.1", + "lodash": "~4.17.10" + } }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "grunt-legacy-util": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", + "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", "dev": true, - "optional": true, "requires": { - "is-docker": "^2.0.0" + "async": "~1.5.2", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.10", + "underscore.string": "~3.3.4", + "which": "~1.3.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", - "dev": true + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "optional": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.6.2.tgz", + "integrity": "sha512-Uc0o2MRnC8TS1MjDrB8jE1umKEo2mflzGvdg0Ncs+yuLtOJ+uz/Wz8VmGsNGtuASr8+E0LDgPkOpvdoC76m5WQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "jasmine-core": "~3.6.0" + } + }, + "jasmine-core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", + "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "dev": true + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "semver": "^6.0.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "supports-color": { @@ -5600,90 +6685,270 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "ms": "^2.1.1" + "color-convert": "^2.0.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "detect-newline": "^3.0.0" } }, - "jasmine": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.6.2.tgz", - "integrity": "sha512-Uc0o2MRnC8TS1MjDrB8jE1umKEo2mflzGvdg0Ncs+yuLtOJ+uz/Wz8VmGsNGtuASr8+E0LDgPkOpvdoC76m5WQ==", + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "dev": true, "requires": { - "glob": "^7.1.6", - "jasmine-core": "~3.6.0" + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, - "jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", - "dev": true - }, - "jest": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.4.2.tgz", - "integrity": "sha512-LLCjPrUh98Ik8CzW8LLVnSCfLaiY+wbK53U7VxnFSX7Q+kWC4noVeDvGWIFw0Amfq1lq2VfGm7YHWSLBV62MJw==", + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "dev": true, "requires": { - "@jest/core": "^26.4.2", - "import-local": "^3.0.2", - "jest-cli": "^26.4.2" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -5709,31 +6974,49 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "jest-cli": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.2.tgz", - "integrity": "sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/core": "^26.4.2", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", + "@types/node": "*", "chalk": "^4.0.0", - "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "prompts": "^2.0.1", - "yargs": "^15.3.1" + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "supports-color": { @@ -5744,137 +7027,71 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, - "jest-changed-files": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz", - "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==", + "jest-environment-jsdom-sixteen": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-sixteen/-/jest-environment-jsdom-sixteen-1.0.3.tgz", + "integrity": "sha512-CwMqDUUfSl808uGPWXlNA1UFkWFgRmhHvyAjhCmCry6mYq4b/nn80MMN7tglqo5XgrANIs/w+mzINPzbZ4ZZrQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", - "execa": "^4.0.0", - "throat": "^5.0.0" + "@jest/fake-timers": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "jsdom": "^16.2.1" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "@jest/fake-timers": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", "dev": true, "requires": { - "pump": "^3.0.0" + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "lolex": "^5.0.0" } }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, "requires": { - "path-key": "^3.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" } }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "jest-config": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz", - "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.4.2", - "@jest/types": "^26.3.0", - "babel-jest": "^26.3.0", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.3.0", - "jest-environment-node": "^26.3.0", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.4.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.4.2" - }, - "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -5888,9 +7105,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -5912,6 +7129,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5933,14 +7156,76 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "jest-message-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0" + } + }, + "jest-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "stack-utils": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", + "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "escape-string-regexp": "^2.0.0" } }, "supports-color": { @@ -5963,28 +7248,51 @@ } } }, - "jest-diff": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", - "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "dev": true, "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.3.0", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -6010,86 +7318,51 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz", - "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "color-name": "~1.1.4" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6098,69 +7371,57 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, - "jest-environment-jsdom": { + "jest-get-type": { "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz", - "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0", - "jsdom": "^16.2.2" - } + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true }, - "jest-environment-jsdom-sixteen": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-sixteen/-/jest-environment-jsdom-sixteen-1.0.3.tgz", - "integrity": "sha512-CwMqDUUfSl808uGPWXlNA1UFkWFgRmhHvyAjhCmCry6mYq4b/nn80MMN7tglqo5XgrANIs/w+mzINPzbZ4ZZrQ==", + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "dev": true, "requires": { - "@jest/fake-timers": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^16.2.1" + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" }, "dependencies": { - "@jest/fake-timers": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", - "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0", - "jest-message-util": "^25.5.0", - "jest-mock": "^25.5.0", - "jest-util": "^25.5.0", - "lolex": "^5.0.0" - } - }, "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "chalk": "^4.0.0" } }, "ansi-styles": { @@ -6172,6 +7433,16 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -6182,9 +7453,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -6206,12 +7477,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6221,6 +7486,13 @@ "to-regex-range": "^5.0.1" } }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6230,54 +7502,21 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "jest-message-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", - "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.5.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", - "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0" - } - }, - "jest-util": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", - "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0", - "chalk": "^3.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "make-dir": "^3.0.0" - } + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "semver": "^6.0.0" + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" } }, "micromatch": { @@ -6290,21 +7529,6 @@ "picomatch": "^2.0.5" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "stack-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.4.tgz", - "integrity": "sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6325,56 +7549,52 @@ } } }, - "jest-environment-node": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz", - "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==", - "dev": true, - "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", - "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", - "@types/graceful-fs": "^4.1.2", + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.3.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" } }, "braces": { @@ -6386,6 +7606,31 @@ "fill-range": "^7.0.1" } }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6395,12 +7640,11 @@ "to-regex-range": "^5.0.1" } }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "is-number": { "version": "7.0.0", @@ -6408,6 +7652,20 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -6418,6 +7676,15 @@ "picomatch": "^2.0.5" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6429,39 +7696,34 @@ } } }, - "jest-jasmine2": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", - "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==", + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.3.0", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", - "@types/node": "*", "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.4.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.4.2", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2", - "throat": "^5.0.0" + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -6507,38 +7769,60 @@ } } }, - "jest-leak-detector": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", - "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" - } - }, - "jest-matcher-utils": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz", - "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==", + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "jest-diff": "^26.4.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -6564,12 +7848,43 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6578,42 +7893,48 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, - "jest-message-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", - "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "@jest/types": "^26.6.2", + "@types/node": "*" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "color-convert": "^2.0.1" } }, "chalk": { @@ -6641,43 +7962,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6686,28 +7976,9 @@ "requires": { "has-flag": "^4.0.0" } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, - "jest-mock": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz", - "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==", - "dev": true, - "requires": { - "@jest/types": "^26.3.0", - "@types/node": "*" - } - }, "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", @@ -6721,31 +7992,52 @@ "dev": true }, "jest-resolve": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", - "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.3.0", + "jest-util": "^26.6.2", "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", + "resolve": "^1.18.1", "slash": "^3.0.0" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -6771,6 +8063,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6787,6 +8088,26 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -6796,6 +8117,16 @@ "p-locate": "^4.1.0" } }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -6821,9 +8152,9 @@ "dev": true }, "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -6869,6 +8200,16 @@ "type-fest": "^0.8.1" } }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6883,58 +8224,152 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-resolve-dependencies": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz", - "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.4.2" + "jest-snapshot": "^26.6.2" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "jest-runner": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz", - "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", + "jest-config": "^26.6.3", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.3.0", - "jest-leak-detector": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-runtime": "^26.4.2", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -6960,12 +8395,51 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6974,53 +8448,84 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-runtime": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", - "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", - "dev": true, - "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/globals": "^26.4.2", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.3.1" + "yargs": "^15.4.1" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -7046,12 +8551,51 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7072,13 +8616,22 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-serializer": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", - "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "dev": true, "requires": { "@types/node": "*", @@ -7086,35 +8639,48 @@ } }, "jest-snapshot": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz", - "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.4.2", + "expect": "^26.6.2", "graceful-fs": "^4.2.4", - "jest-diff": "^26.4.2", + "jest-diff": "^26.6.2", "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^26.4.2", + "pretty-format": "^26.6.2", "semver": "^7.3.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -7149,11 +8715,23 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "supports-color": { "version": "7.2.0", @@ -7163,6 +8741,12 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -7276,33 +8860,45 @@ } }, "jest-validate": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz", - "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.2" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "chalk": { @@ -7348,30 +8944,51 @@ } }, "jest-watcher": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz", - "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "dev": true, "requires": { - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.3.0", + "jest-util": "^26.6.2", "string-length": "^4.0.1" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -7397,12 +9014,51 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7411,13 +9067,22 @@ "requires": { "has-flag": "^4.0.0" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", @@ -7511,9 +9176,9 @@ "dev": true }, "json-parse-even-better-errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.0.tgz", - "integrity": "sha512-o3aP+RsWDJZayj1SbHNQAI8x0v3T3SKiGoZlNYfbUP1S3omJQ6i9CnqADqkSPaOAxwua4/1YWx5CM7oiChJt2Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema": { @@ -9028,9 +10693,9 @@ "dev": true }, "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, "optional": true, "requires": { @@ -9042,12 +10707,25 @@ "which": "^2.0.2" }, "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "which": { "version": "2.0.2", @@ -9058,6 +10736,13 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "optional": true } } }, @@ -9244,9 +10929,9 @@ "dev": true }, "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-finally": { @@ -9542,27 +11227,49 @@ "dev": true }, "pretty-format": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", - "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" }, "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9577,6 +11284,27 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -9605,13 +11333,13 @@ "dev": true }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "prr": { @@ -10662,9 +12390,9 @@ } }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -10785,9 +12513,9 @@ } }, "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -11550,9 +13278,9 @@ "dev": true }, "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "optional": true }, @@ -11563,9 +13291,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", - "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", + "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -12221,12 +13949,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, diff --git a/e2e/package.json b/e2e/package.json index 7d8d61acdd..4a60b2bce4 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -19,7 +19,7 @@ "grunt": "~1.0.4", "jasmine": "~3.6.2", "jasmine-core": "~3.6.0", - "jest": "~26.4.2", + "jest": "~26.6.1", "jest-environment-jsdom-sixteen": "^1.0.3", "karma": "~6.0.1", "karma-chai": "~0.1.0", From 4aaca09002e76fa60781b659ded39e391556ea70 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 26 Mar 2021 22:05:46 +0100 Subject: [PATCH 23/25] Add remapping of lines when type checking is disabled --- packages/core/src/config/file-matcher.ts | 22 +++++++ packages/core/src/config/index.ts | 1 + .../core/src/process/3-dry-run-executor.ts | 7 +-- .../disable-type-checks-preprocessor.ts | 60 +++++++++---------- .../test/unit/config/file-matcher.spec.ts | 24 ++++++++ .../unit/process/3-dry-run-executor.spec.ts | 18 ++++++ .../disable-type-checks-preprocessor.spec.ts | 26 +++----- 7 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 packages/core/src/config/file-matcher.ts create mode 100644 packages/core/test/unit/config/file-matcher.spec.ts diff --git a/packages/core/src/config/file-matcher.ts b/packages/core/src/config/file-matcher.ts new file mode 100644 index 0000000000..ec44e7bb4c --- /dev/null +++ b/packages/core/src/config/file-matcher.ts @@ -0,0 +1,22 @@ +import path from 'path'; + +import minimatch from 'minimatch'; + +/** + * A helper class for matching files using the `disableTypeChecks` setting. + */ +export class FileMatcher { + private readonly pattern: string | false; + + constructor(pattern: string | false) { + if (pattern !== false) { + this.pattern = path.resolve(pattern); + } else { + this.pattern = pattern; + } + } + + public matches(fileName: string): boolean { + return !!this.pattern && minimatch(path.resolve(fileName), this.pattern); + } +} diff --git a/packages/core/src/config/index.ts b/packages/core/src/config/index.ts index debf150d0f..8c266075ad 100644 --- a/packages/core/src/config/index.ts +++ b/packages/core/src/config/index.ts @@ -1,3 +1,4 @@ export * from './read-config'; export * from './options-validator'; export * from './build-schema-with-plugin-contributions'; +export * from './file-matcher'; diff --git a/packages/core/src/process/3-dry-run-executor.ts b/packages/core/src/process/3-dry-run-executor.ts index 8512cfc51e..c79b082199 100644 --- a/packages/core/src/process/3-dry-run-executor.ts +++ b/packages/core/src/process/3-dry-run-executor.ts @@ -1,8 +1,5 @@ import { EOL } from 'os'; -import path from 'path'; - -import minimatch from 'minimatch'; import { Injector } from 'typed-inject'; import { I } from '@stryker-mutator/util'; import { Logger } from '@stryker-mutator/api/logging'; @@ -30,6 +27,7 @@ import { ConfigError } from '../errors'; import { findMutantTestCoverage } from '../mutants'; import { Pool, createTestRunnerPool } from '../concurrent/pool'; import { ConcurrencyTokenProvider } from '../concurrent'; +import { FileMatcher } from '../config'; import { MutationTestContext } from './4-mutation-test-executor'; import { MutantInstrumenterContext } from './2-mutant-instrumenter-executor'; @@ -144,6 +142,7 @@ export class DryRunExecutor { * @param dryRunResult the completed result */ private remapSandboxFilesToOriginalFiles(dryRunResult: CompleteDryRunResult) { + const disableTypeCheckingFileMatcher = new FileMatcher(this.options.disableTypeChecks); dryRunResult.tests.forEach((test) => { if (test.fileName) { test.fileName = this.sandbox.originalFileFor(test.fileName); @@ -151,7 +150,7 @@ export class DryRunExecutor { // HACK line numbers of the tests can be offset by 1 because the disable type checks preprocessor could have added a `// @ts-nocheck` line. // We correct for that here if needed // If we do more complex stuff in sandbox preprocessing in the future, we might want to add a robust remapping logic - if (test.startPosition && this.options.disableTypeChecks && minimatch(test.fileName, path.resolve(this.options.disableTypeChecks))) { + if (test.startPosition && disableTypeCheckingFileMatcher.matches(test.fileName)) { test.startPosition.line--; } } diff --git a/packages/core/src/sandbox/disable-type-checks-preprocessor.ts b/packages/core/src/sandbox/disable-type-checks-preprocessor.ts index cf8cab5fea..e341fea557 100644 --- a/packages/core/src/sandbox/disable-type-checks-preprocessor.ts +++ b/packages/core/src/sandbox/disable-type-checks-preprocessor.ts @@ -1,6 +1,5 @@ import path from 'path'; -import minimatch from 'minimatch'; import { commonTokens, tokens } from '@stryker-mutator/api/plugin'; import { File, StrykerOptions } from '@stryker-mutator/api/core'; import type { disableTypeChecks } from '@stryker-mutator/instrumenter'; @@ -9,6 +8,7 @@ import { propertyPath, PropertyPathBuilder } from '@stryker-mutator/util'; import { coreTokens } from '../di'; import { isWarningEnabled } from '../utils/object-utils'; +import { FileMatcher } from '../config/file-matcher'; import { FilePreprocessor } from './file-preprocessor'; @@ -21,41 +21,35 @@ export class DisableTypeChecksPreprocessor implements FilePreprocessor { constructor(private readonly log: Logger, private readonly options: StrykerOptions, private readonly impl: typeof disableTypeChecks) {} public async preprocess(files: File[]): Promise { - if (this.options.disableTypeChecks === false) { - return files; - } else { - const pattern = path.resolve(this.options.disableTypeChecks); - let warningLogged = false; - const outFiles = await Promise.all( - files.map(async (file) => { - if (minimatch(path.resolve(file.name), pattern)) { - try { - return await this.impl(file, { plugins: this.options.mutator.plugins }); - } catch (err) { - if (isWarningEnabled('preprocessorErrors', this.options.warnings)) { - warningLogged = true; - this.log.warn( - `Unable to disable type checking for file "${ - file.name - }". Shouldn't type checking be disabled for this file? Consider configuring a more restrictive "${propertyPath( - 'disableTypeChecks' - )}" settings (or turn it completely off with \`false\`)`, - err - ); - } - return file; + const matcher = new FileMatcher(this.options.disableTypeChecks); + let warningLogged = false; + const outFiles = await Promise.all( + files.map(async (file) => { + if (matcher.matches(path.resolve(file.name))) { + try { + return await this.impl(file, { plugins: this.options.mutator.plugins }); + } catch (err) { + if (isWarningEnabled('preprocessorErrors', this.options.warnings)) { + warningLogged = true; + this.log.warn( + `Unable to disable type checking for file "${ + file.name + }". Shouldn't type checking be disabled for this file? Consider configuring a more restrictive "${propertyPath( + 'disableTypeChecks' + )}" settings (or turn it completely off with \`false\`)`, + err + ); } - } else { return file; } - }) - ); - if (warningLogged) { - this.log.warn( - `(disable "${PropertyPathBuilder.create().prop('warnings').prop('preprocessorErrors')}" to ignore this warning` - ); - } - return outFiles; + } else { + return file; + } + }) + ); + if (warningLogged) { + this.log.warn(`(disable "${PropertyPathBuilder.create().prop('warnings').prop('preprocessorErrors')}" to ignore this warning`); } + return outFiles; } } diff --git a/packages/core/test/unit/config/file-matcher.spec.ts b/packages/core/test/unit/config/file-matcher.spec.ts new file mode 100644 index 0000000000..2b249b9a5b --- /dev/null +++ b/packages/core/test/unit/config/file-matcher.spec.ts @@ -0,0 +1,24 @@ +import { expect } from 'chai'; + +import { FileMatcher } from '../../../src/config'; + +describe(FileMatcher.name, () => { + describe(FileMatcher.prototype.matches.name, () => { + it('should match when the glob pattern matches', () => { + const sut = new FileMatcher('src/**/*.ts'); + expect(sut.matches('src/foo.ts')).true; + }); + + it('should not match if the pattern is set to `false`', () => { + const sut = new FileMatcher(false); + expect(sut.matches('src/foo.js')).false; + }); + + it("should not match if the glob pattern doesn't match", () => { + const sut = new FileMatcher('src/**/*.js'); + expect(sut.matches('test/foo.spec.js')).false; + }); + + // more tests would test the internals of minimatch itself. We expect that to work. + }); +}); diff --git a/packages/core/test/unit/process/3-dry-run-executor.spec.ts b/packages/core/test/unit/process/3-dry-run-executor.spec.ts index 59ed101d8c..0995ea987e 100644 --- a/packages/core/test/unit/process/3-dry-run-executor.spec.ts +++ b/packages/core/test/unit/process/3-dry-run-executor.spec.ts @@ -144,6 +144,24 @@ describe(DryRunExecutor.name, () => { expect(sandbox.originalFileFor).calledWith('.stryker-tmp/sandbox-123/test/foo.spec.js'); }); + it('should remap test locations when type checking was disabled for a test file', async () => { + runResult.tests.push( + factory.successTestResult({ fileName: '.stryker-tmp/sandbox-123/test/foo.spec.js', startPosition: { line: 3, column: 1 } }), + factory.successTestResult({ fileName: '.stryker-tmp/sandbox-123/testResources/foo.spec.js', startPosition: { line: 5, column: 1 } }) + ); + sandbox.originalFileFor + .withArgs('.stryker-tmp/sandbox-123/test/foo.spec.js') + .returns('test/foo.spec.js') + .withArgs('.stryker-tmp/sandbox-123/testResources/foo.spec.js') + .returns('testResources/foo.spec.js'); + await sut.execute(); + const actualDryRunResult = injectorMock.provideValue.getCalls().find((call) => call.args[0] === coreTokens.dryRunResult)! + .args[1] as DryRunResult; + assertions.expectCompleted(actualDryRunResult); + expect(actualDryRunResult.tests[0].startPosition).deep.eq({ line: 2, column: 1 }); + expect(actualDryRunResult.tests[1].startPosition).deep.eq({ line: 5, column: 1 }); // should not have been remapped, since type checking wasn't disabled here + }); + it('should have logged the amount of tests ran', async () => { runResult.tests.push(factory.successTestResult({ timeSpentMs: 10 })); runResult.tests.push(factory.successTestResult({ timeSpentMs: 10 })); diff --git a/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts b/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts index 41ca1dcb65..cb66219f45 100644 --- a/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts +++ b/packages/core/test/unit/sandbox/disable-type-checks-preprocessor.spec.ts @@ -32,33 +32,21 @@ describe(DisableTypeChecksPreprocessor.name, () => { }); it('should be able to override "disableTypeChecks" glob pattern', async () => { + // Arrange testInjector.options.disableTypeChecks = 'src/**/*.ts'; + const ignoredFile = new File(path.resolve('test/app.spec.ts'), 'spec'); const expectedFile = new File(path.resolve('src/app.ts'), 'output'); - const input = [new File(path.resolve('src/app.ts'), 'input')]; + const expectedFiles = [expectedFile, ignoredFile]; + const input = [new File(path.resolve('src/app.ts'), 'input'), ignoredFile]; disableTypeCheckingStub.resolves(expectedFile); + + // Act const output = await sut.preprocess(input); - assertions.expectTextFilesEqual(output, [expectedFile]); - }); - it('should not disable type checking when the "disableTypeChecks" glob pattern does not match', async () => { - testInjector.options.disableTypeChecks = 'src/**/*.ts'; - const expectedFiles = [new File(path.resolve('test/app.spec.ts'), 'input')]; - disableTypeCheckingStub.resolves(new File('', 'not expected')); - const output = await sut.preprocess(expectedFiles); + // Assert assertions.expectTextFilesEqual(output, expectedFiles); }); - it('should not disable type checking if "disableTypeChecks" is set to `false`', async () => { - const input = [ - new File(path.resolve('src/app.ts'), '// @ts-expect-error\nfoo.bar();'), - new File(path.resolve('test/app.spec.ts'), '/* @ts-expect-error */\nfoo.bar();'), - new File(path.resolve('testResources/project/app.ts'), '/* @ts-expect-error */\nfoo.bar();'), - ]; - testInjector.options.disableTypeChecks = false; - const output = await sut.preprocess(input); - assertions.expectTextFilesEqual(output, input); - }); - it('should not crash on error, instead log a warning', async () => { const input = [new File('src/app.ts', 'input')]; const expectedError = new Error('Expected error for testing'); From a7c265e396e7b95026cb7be2d449094d7227819e Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 26 Mar 2021 22:37:03 +0100 Subject: [PATCH 24/25] Fix tests --- packages/jest-runner/test/unit/jest-test-runner.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jest-runner/test/unit/jest-test-runner.spec.ts b/packages/jest-runner/test/unit/jest-test-runner.spec.ts index cdb89c2f4a..6f63bceb5e 100644 --- a/packages/jest-runner/test/unit/jest-test-runner.spec.ts +++ b/packages/jest-runner/test/unit/jest-test-runner.spec.ts @@ -18,7 +18,7 @@ import { JestRunnerOptionsWithStrykerOptions } from '../../src/jest-runner-optio import { JestRunResult } from '../../src/jest-run-result'; import { state } from '../../src/messaging'; -describe(JestTestRunner.name, () => { +describe.only(JestTestRunner.name, () => { const basePath = '/path/to/project/root'; let jestTestAdapterMock: sinon.SinonStubbedInstance; @@ -128,7 +128,7 @@ describe(JestTestRunner.name, () => { name: 'App renders without crashing', status: TestStatus.Success, timeSpentMs: 23, - startPosition: { column: 3, line: 2 }, + startPosition: { column: 4, line: 2 }, fileName: 'foo.js', }, ], @@ -221,7 +221,7 @@ describe(JestTestRunner.name, () => { status: TestStatus.Success, timeSpentMs: 23, fileName: 'quux.js', - startPosition: { line: 41, column: 42 }, + startPosition: { line: 41, column: 43 }, }, ], }; From 4ae05902c20ec065bb5899f363dc18823c57c6f1 Mon Sep 17 00:00:00 2001 From: Nico Jansen Date: Fri, 26 Mar 2021 22:49:37 +0100 Subject: [PATCH 25/25] Removed plugin location --- e2e/test/jest-node/stryker.conf.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/e2e/test/jest-node/stryker.conf.json b/e2e/test/jest-node/stryker.conf.json index 2728ddb540..dcdcaf536c 100644 --- a/e2e/test/jest-node/stryker.conf.json +++ b/e2e/test/jest-node/stryker.conf.json @@ -5,9 +5,6 @@ "tempDirName": "stryker-tmp", "concurrency": 1, "coverageAnalysis": "off", - "plugins": [ - "/home/nicojs/github/stryker-js/packages/jest-runner" - ], "reporters": [ "clear-text", "progress",