From fe9ab5c6300cd1f6a1a765b7c8bc1f22008035e7 Mon Sep 17 00:00:00 2001 From: "reportportal.io" Date: Wed, 23 Jun 2021 22:27:29 +0000 Subject: [PATCH 01/21] 5.0.2 -> 5.0.3-SNAPSHOT --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a1ef0ca..e8f06d7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.0.2 +5.0.3-SNAPSHOT From 86ed1d17ac9627c3ee872c747cb895bd1911caa8 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich Date: Mon, 27 Dec 2021 17:10:51 +0300 Subject: [PATCH 02/21] EPMRPP-72798 || update release pipeline node v12 --- .github/workflows/release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7cd1b81..482b4ae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,6 +79,10 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 + - name: Setup NodeJS + uses: actions/setup-node@v2 + with: + node-version: '12' - name: Configure git run: | git config --global user.email "reportportal.io" From 13bf2e91e55c77e809dde7f7e4a2a056d71a395c Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 25 Jan 2022 01:30:24 +0300 Subject: [PATCH 03/21] EPMRPP-73451 || bump client js version (#90) --- package-lock.json | 86 ++++++++++++++++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d24d94..d8f0762 100644 --- a/package-lock.json +++ b/package-lock.json @@ -309,6 +309,14 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, "@babel/template": { "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", @@ -917,15 +925,30 @@ } }, "@reportportal/client-javascript": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@reportportal/client-javascript/-/client-javascript-5.0.5.tgz", - "integrity": "sha512-nmb2eVNFcC2ut9muWlB8hzpVnhLh4kFYoMU4kkr8qLD1ahpIYVHxNrJ87K13v1ZJWHzJARlENAIXwqlr6AZAog==", - "requires": { - "axios": "^0.21.1", - "axios-retry": "^3.1.2", - "glob": "^7.1.4", - "uniqid": "^5.0.3", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@reportportal/client-javascript/-/client-javascript-5.0.6.tgz", + "integrity": "sha512-Bz79EvRQoUBjGOlO1PVr3EXcT+W63TH/p6abYtkpKE3U3+KqkJ0pjOArJwyjt6RShQTdpjQAKjIcpm2G+L5PeA==", + "requires": { + "axios": "^0.24.0", + "axios-retry": "^3.2.4", + "glob": "^7.2.0", + "uniqid": "^5.4.0", "universal-analytics": "^0.4.20" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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" + } + } } }, "@sinonjs/commons": { @@ -1243,19 +1266,20 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.4" } }, "axios-retry": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.1.9.tgz", - "integrity": "sha512-NFCoNIHq8lYkJa6ku4m+V1837TP6lCa7n79Iuf8/AqATAHYB0ISaAS1eyIenDOfHOLtym34W65Sjke2xjg2fsA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.2.4.tgz", + "integrity": "sha512-Co3UXiv4npi6lM963mfnuH90/YFLKWWDmoBYfxkHT5xtkSSWNqK9zdG3fw5/CP/dsoKB5aMMJCsgab+tp1OxLQ==", "requires": { - "is-retry-allowed": "^1.1.0" + "@babel/runtime": "^7.15.4", + "is-retry-allowed": "^2.2.0" } }, "babel-jest": { @@ -1793,9 +1817,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" }, @@ -2598,9 +2622,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "for-in": { "version": "1.0.2", @@ -2701,6 +2725,7 @@ "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", @@ -3235,9 +3260,9 @@ } }, "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==" }, "is-stream": { "version": "1.1.0", @@ -5597,6 +5622,11 @@ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -6675,9 +6705,9 @@ } }, "uniqid": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.3.0.tgz", - "integrity": "sha512-Jq8EzvAT8/CcLu8tzoSiylnzPkNhJJKpnMT964Dj1jI4pG4sKYP9aFVByNTp8KzMvYlW1Um63PCDqtOoujNzrA==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz", + "integrity": "sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A==" }, "universal-analytics": { "version": "0.4.23", diff --git a/package.json b/package.json index 6ca17d2..2afea23 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "./modules/index", "spec": "cucumber version >=4.x <=6.x", "dependencies": { - "@reportportal/client-javascript": "^5.0.5", + "@reportportal/client-javascript": "^5.0.6", "cli-table3": "^0.6.0" }, "devDependencies": { From c4771290c015a21779da6dd25ae69e5a2f81c869 Mon Sep 17 00:00:00 2001 From: Aleksandr Zyabrev <40700843+oranje322@users.noreply.github.com> Date: Tue, 8 Feb 2022 10:30:36 +0300 Subject: [PATCH 04/21] EPMRPP-65865 || Reduce package size (#91) Co-authored-by: Aleksandr Zyabrev --- .npmignore | 4 ---- CHANGELOG.md | 2 ++ package.json | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 .npmignore diff --git a/.npmignore b/.npmignore deleted file mode 100644 index b6aa90b..0000000 --- a/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -coverage -.gitignore -.editorconfig -.github/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 40b7f59..2705aec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +### Changed +- Package size reduced ## [5.0.2] - 2021-06-23 ### Fixed diff --git a/package.json b/package.json index 2afea23..f5720c6 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,9 @@ "type": "git", "url": "git+https://github.com/reportportal/agent-js-cucumber" }, + "files": [ + "/modules" + ], "keywords": [ "cucumber-reporter", "reportportal", From bb61c4dcbd6f5593f37e2931321539e48db058fc Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich Date: Fri, 27 May 2022 11:17:53 +0300 Subject: [PATCH 05/21] EPMRPP-76689 || add support cucumber v.7+ --- modules/constants.js | 13 + modules/cucumber-reportportal-formatter.js | 276 ++++++++++++++++++++- modules/storage.js | 147 +++++++++++ modules/utils.js | 38 +++ 4 files changed, 472 insertions(+), 2 deletions(-) create mode 100644 modules/storage.js diff --git a/modules/constants.js b/modules/constants.js index 01903de..5c3c4a5 100644 --- a/modules/constants.js +++ b/modules/constants.js @@ -55,6 +55,18 @@ const CUCUMBER_EVENTS = { TEST_RUN_FINISHED: 'test-run-finished', }; +const CUCUMBER_MESSAGES = { + GHERKIN_DOCUMENT: 'gherkinDocument', + PICKLE: 'pickle', + TEST_RUN_STARTED: 'testRunStarted', + TEST_CASE: 'testCase', + TEST_CASE_STARTED: 'testCaseStarted', + TEST_CASE_FINISHED: 'testCaseFinished', + TEST_STEP_STARTED: 'testStepStarted', + TEST_STEP_FINISHED: 'testStepFinished', + TEST_RUN_FINISHED: 'testRunFinished', +}; + const RP_EVENTS = { TEST_CASE_ID: 'rp/testCaseId', ATTRIBUTES: 'rp/attributes', @@ -92,4 +104,5 @@ module.exports = { CUCUMBER_EVENTS, RP_EVENTS, TABLE_CONFIG, + CUCUMBER_MESSAGES, }; diff --git a/modules/cucumber-reportportal-formatter.js b/modules/cucumber-reportportal-formatter.js index 96e560f..9381d76 100644 --- a/modules/cucumber-reportportal-formatter.js +++ b/modules/cucumber-reportportal-formatter.js @@ -14,14 +14,13 @@ * limitations under the License. */ -const { Formatter } = require('cucumber'); const ReportPortalClient = require('@reportportal/client-javascript'); const Table = require('cli-table3'); const utils = require('./utils'); const Context = require('./context'); const DocumentStorage = require('./documents-storage'); -const itemFinders = require('./itemFinders'); const pjson = require('../package.json'); +const itemFinders = require('./itemFinders'); const { AFTER_HOOK_URI_TO_SKIP, RP_ENTITY_LAUNCH, @@ -30,9 +29,19 @@ const { CUCUMBER_EVENTS, RP_EVENTS, TABLE_CONFIG, + CUCUMBER_MESSAGES, } = require('./constants'); +const Storage = require('./storage'); const createRPFormatterClass = (config) => { + let Formatter; + try { + // eslint-disable-next-line global-require + Formatter = require('@cucumber/cucumber').Formatter; + } catch (e) { + // eslint-disable-next-line global-require + Formatter = require('cucumber').Formatter; + } const documentsStorage = new DocumentStorage(); const reportportal = new ReportPortalClient(config, { name: pjson.name, version: pjson.version }); const attributesConf = !config.attributes ? [] : config.attributes; @@ -53,6 +62,34 @@ const createRPFormatterClass = (config) => { this.rerunOf = rerunOf || config.rerunOf; this.registerListeners(options.eventBroadcaster); + + // NEW API + this.storage = new Storage(); + options.eventBroadcaster.on('envelope', (event) => { + const [key] = Object.keys(event); + switch (key) { + case CUCUMBER_MESSAGES.GHERKIN_DOCUMENT: + return this.onGherkinDocumentEvent(event[key]); + case CUCUMBER_MESSAGES.PICKLE: + return this.onPickleEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_RUN_STARTED: + return this.onTestRunStartedEvent(); + case CUCUMBER_MESSAGES.TEST_CASE: + return this.onTestCaseEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_CASE_STARTED: + return this.onTestCaseStartedEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_STEP_STARTED: + return this.onTestStepStartedEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_STEP_FINISHED: + return this.onTestStepFinishedEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_CASE_FINISHED: + return this.onTestCaseFinishedEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_RUN_FINISHED: + return this.onTestRunFinishedEvent(event[key]); + default: + return null; + } + }); } registerListeners(eventBroadcaster) { @@ -70,6 +107,241 @@ const createRPFormatterClass = (config) => { eventBroadcaster.on(CUCUMBER_EVENTS.TEST_RUN_FINISHED, this.onTestRunFinished.bind(this)); } + onGherkinDocumentEvent(data) { + this.storage.setDocument(data); + } + + onPickleEvent(data) { + this.storage.setPickle(data); + } + + onTestRunStartedEvent() { + const startLaunchData = { + name: config.launch, + startTime: this.reportportal.helpers.now(), + description: !config.description ? '' : config.description, + attributes: [ + ...this.attributesConf, + { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, + ], + rerun: this.isRerun, + rerunOf: this.rerunOf, + }; + const { tempId } = this.reportportal.startLaunch(startLaunchData); + this.storage.setLaunchTempId(tempId); + } + + onTestCaseEvent(data) { + const { id: testCaseId, pickleId, testSteps } = data; + this.storage.setTestCase(data); + + // prepare steps + const stepsMap = {}; + testSteps.forEach((step) => { + const { pickleStepId, id } = step; + // skip hookId + if (pickleStepId) { + const { steps } = this.storage.getPickle(pickleId); + stepsMap[id] = steps.find((item) => item.id === pickleStepId); + } + }); + this.storage.setSteps(testCaseId, stepsMap); + } + + onTestCaseStartedEvent(data) { + const { id, testCaseId } = data; + this.storage.setTestCaseStartedId(id, testCaseId); + const { pickleId } = this.storage.getTestCase(testCaseId); + const { + uri: pickleFeatureUri, + astNodeIds: [scenarioId], + } = this.storage.getPickle(pickleId); + const currentFeatureUri = this.storage.getCurrentFeatureUri(); + const feature = this.storage.getFeature(pickleFeatureUri); + const launchTempId = this.storage.getLaunchTempId(); + + // start FEATURE if no currentFeatureUri or new feature + // else finish old one + if (!currentFeatureUri && currentFeatureUri !== pickleFeatureUri) { + this.storage.setCurrentFeatureUri(pickleFeatureUri); + const suiteData = { + name: feature.name, + startTime: this.reportportal.helpers.now(), + type: 'SUITE', + description: feature.description.trim(), + attributes: utils.createAttributes(feature.tags), + }; + const { tempId } = this.reportportal.startTestItem(suiteData, launchTempId, ''); + this.storage.setFeatureTempId(tempId); + } else { + const tempFeatureId = this.storage.getFeatureTempId(); + this.reportportal.finishTestItem(tempFeatureId, {}); + } + + // current feature node rule || scenario + const currentNode = utils.findNode(feature, scenarioId); + + let scenario; + let ruleTempId = this.storage.getRuleTempId(); + if (currentNode.rule && !ruleTempId) { + // start RULE + const { rule } = currentNode; + const testData = { + startTime: this.reportportal.helpers.now(), + type: 'SUITE', + name: rule.name, + description: rule.description, + attributes: utils.createAttributes(rule.tags), + }; + const parentId = this.storage.getFeatureTempId(); + const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); + ruleTempId = tempId; + this.storage.setRuleTempId(tempId); + + scenario = utils.findScenario(rule, scenarioId); + const isLastScenario = utils.detectLastScenario(currentNode.rule, scenarioId); + this.storage.setLastScenario(isLastScenario); + } else if (currentNode.rule && ruleTempId) { + scenario = utils.findScenario(currentNode.rule, scenarioId); + const isLastScenario = utils.detectLastScenario(currentNode.rule, scenarioId); + this.storage.setLastScenario(isLastScenario); + } else { + scenario = currentNode.scenario; + } + + const testData = { + startTime: this.reportportal.helpers.now(), + type: 'TEST', + name: scenario.name, + description: scenario.description, + attributes: utils.createAttributes(scenario.tags), + }; + + const parentId = ruleTempId || this.storage.getFeatureTempId(); + const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); + this.storage.setScenarioTempId(tempId); + } + + onTestStepStartedEvent(data) { + const { testCaseStartedId, testStepId } = data; + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const step = this.storage.getStep(testCaseId, testStepId); + + // start step + if (step) { + const stepData = { + name: step.text, + startTime: this.reportportal.helpers.now(), + type: 'STEP', + }; + const launchTempId = this.storage.getLaunchTempId(); + const parentId = this.storage.getScenarioTempId(); + const { tempId } = this.reportportal.startTestItem(stepData, launchTempId, parentId); + this.storage.setStepTempId(tempId); + } + } + + onTestStepFinishedEvent(data) { + const { testCaseStartedId, testStepId, testStepResult } = data; + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const step = this.storage.getStep(testCaseId, testStepId); + const tempStepId = this.storage.getStepTempId(); + let status; + + switch (testStepResult.status.toLowerCase()) { + case STATUSES.PASSED: { + status = STATUSES.PASSED; + break; + } + case STATUSES.PENDING: { + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'WARN', + message: "This step is marked as 'pending'", + }); + status = STATUSES.FAILED; + break; + } + case STATUSES.UNDEFINED: { + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: 'There is no step definition found. Please verify and implement it.', + }); + status = STATUSES.FAILED; + break; + } + case STATUSES.AMBIGUOUS: { + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: + 'There are more than one step implementation. Please verify and reimplement it.', + }); + status = STATUSES.FAILED; + break; + } + case STATUSES.SKIPPED: { + status = STATUSES.SKIPPED; + break; + } + case STATUSES.FAILED: { + status = STATUSES.FAILED; + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: testStepResult.message, + }); + break; + } + default: + break; + } + + if (step) { + this.reportportal.finishTestItem(tempStepId, { + status: status || testStepResult.status, + endTime: this.reportportal.helpers.now(), + }); + } + + this.storage.setStepTempId(null); + } + + onTestCaseFinishedEvent(data) { + const { testCaseStartedId } = data; + const scenarioTempId = this.storage.getScenarioTempId(); + this.reportportal.finishTestItem(scenarioTempId, {}); + + // finish RULE if it's exist and if it's last scenario + const isLastScenario = this.storage.getLastScenario(); + const ruleTempId = this.storage.getRuleTempId(); + if (ruleTempId && isLastScenario) { + this.reportportal.finishTestItem(ruleTempId, {}); + this.storage.setRuleTempId(null); + this.storage.setLastScenario(false); + } + + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + this.storage.removeTestCaseStartedId(testCaseStartedId); + this.storage.removeSteps(testCaseId); + this.storage.removeTestCase(testCaseId); + this.storage.setScenarioTempId(null); + } + + onTestRunFinishedEvent() { + const featureTempId = this.storage.getFeatureTempId(); + this.reportportal.finishTestItem(featureTempId, {}); + + const launchId = this.storage.getLaunchTempId(); + this.reportportal.getPromiseFinishAllItems(launchId).then(() => { + this.reportportal.finishLaunch(launchId, {}); + }); + this.storage.setLaunchTempId(null); + this.storage.setCurrentFeatureUri(null); + this.storage.setFeatureTempId(null); + } + onGherkinDocument(event) { this.documentsStorage.cacheDocument(event); diff --git a/modules/storage.js b/modules/storage.js new file mode 100644 index 0000000..2184849 --- /dev/null +++ b/modules/storage.js @@ -0,0 +1,147 @@ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module.exports = class Storage { + constructor() { + this.launchTempId = null; + this.documents = new Map(); + this.pickles = new Map(); + this.testCases = new Map(); + this.testCaseStartedIds = new Map(); + this.steps = new Map(); + this.currentFeatureUri = null; + this.featureTempId = null; + this.ruleTempId = null; + this.scenarioTempId = null; + this.stepTempId = null; + this.isLastScenario = false; + } + + setLaunchTempId(id) { + this.launchTempId = id; + } + + getLaunchTempId() { + return this.launchTempId; + } + + getCurrentFeatureUri() { + return this.currentFeatureUri; + } + + setCurrentFeatureUri(value) { + this.currentFeatureUri = value; + } + + setDocument(gherkinDocument) { + this.documents.set(gherkinDocument.uri, gherkinDocument); + } + + getDocument(uri) { + return this.documents.get(uri); + } + + getFeature(uri) { + const document = this.getDocument(uri); + + return document.feature; + } + + setPickle(pickle) { + this.pickles.set(pickle.id, pickle); + } + + getPickle(id) { + return this.pickles.get(id); + } + + setTestCase(testCase) { + this.testCases.set(testCase.id, testCase); + } + + getTestCase(id) { + return this.testCases.get(id); + } + + removeTestCase(id) { + this.testCases.delete(id); + } + + setTestCaseStartedId(id, testCaseId) { + this.testCaseStartedIds.set(id, testCaseId); + } + + removeTestCaseStartedId(id) { + this.testCaseStartedIds.delete(id); + } + + getTestCaseId(id) { + return this.testCaseStartedIds.get(id); + } + + setSteps(testCaseId, data) { + this.steps.set(testCaseId, data); + } + + removeSteps(testCaseId) { + this.steps.delete(testCaseId); + } + + getStep(testCaseId, testStepId) { + const steps = this.steps.get(testCaseId); + return steps[testStepId]; + } + + setFeatureTempId(value) { + this.featureTempId = value; + } + + getFeatureTempId() { + return this.featureTempId; + } + + setScenarioTempId(id) { + this.scenarioTempId = id; + } + + getScenarioTempId() { + return this.scenarioTempId; + } + + setStepTempId(value) { + this.stepTempId = value; + } + + getStepTempId() { + return this.stepTempId; + } + + setRuleTempId(id) { + this.ruleTempId = id; + } + + getRuleTempId() { + return this.ruleTempId; + } + + setLastScenario(val) { + this.isLastScenario = val; + } + + getLastScenario() { + return this.isLastScenario; + } +}; diff --git a/modules/utils.js b/modules/utils.js index ecb7d64..ef4ca30 100644 --- a/modules/utils.js +++ b/modules/utils.js @@ -101,6 +101,41 @@ const getStepType = (keyword) => { return type; }; +const findNode = (feature, searchId) => { + return feature.children.find((child) => { + if (child.rule) { + return child.rule.children.find((item) => { + if (!item.scenario) return false; + return item.scenario.id === searchId; + }); + } + if (child.scenario) { + return child.scenario.id === searchId; + } + return null; + }); +}; + +const detectLastScenario = (node, searchId) => { + let isLastScenario = false; + node.children.forEach((child, index) => { + if (child.scenario) { + isLastScenario = child.scenario.id === searchId && index === node.children.length - 1; + } + }); + return isLastScenario; +}; + +const findScenario = (node, searchId) => { + const children = node.children.find((child) => { + if (child.scenario) { + return child.scenario.id === searchId; + } + return null; + }); + return children.scenario; +}; + module.exports = { createTagComparator, createAttribute, @@ -111,4 +146,7 @@ module.exports = { getParameters, formatCodeRef, replaceParameter, + findNode, + findScenario, + detectLastScenario, }; From 237bf886272a2d51e08b931ac77ebd06dac14c4b Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 14 Jun 2022 10:19:47 +0200 Subject: [PATCH 06/21] EPMRPP-77615 || add ability provide status, description, attributes, testCaseId (#99) --- modules/constants.js | 1 + modules/cucumber-reportportal-formatter.js | 73 +++++++++++++++++++--- modules/storage.js | 7 +++ 3 files changed, 74 insertions(+), 7 deletions(-) diff --git a/modules/constants.js b/modules/constants.js index 5c3c4a5..b5ee48c 100644 --- a/modules/constants.js +++ b/modules/constants.js @@ -63,6 +63,7 @@ const CUCUMBER_MESSAGES = { TEST_CASE_STARTED: 'testCaseStarted', TEST_CASE_FINISHED: 'testCaseFinished', TEST_STEP_STARTED: 'testStepStarted', + ATTACHMENT: 'attachment', TEST_STEP_FINISHED: 'testStepFinished', TEST_RUN_FINISHED: 'testRunFinished', }; diff --git a/modules/cucumber-reportportal-formatter.js b/modules/cucumber-reportportal-formatter.js index 9381d76..ef31288 100644 --- a/modules/cucumber-reportportal-formatter.js +++ b/modules/cucumber-reportportal-formatter.js @@ -65,6 +65,8 @@ const createRPFormatterClass = (config) => { // NEW API this.storage = new Storage(); + this.customLaunchStatus = null; + options.eventBroadcaster.on('envelope', (event) => { const [key] = Object.keys(event); switch (key) { @@ -80,6 +82,8 @@ const createRPFormatterClass = (config) => { return this.onTestCaseStartedEvent(event[key]); case CUCUMBER_MESSAGES.TEST_STEP_STARTED: return this.onTestStepStartedEvent(event[key]); + case CUCUMBER_MESSAGES.ATTACHMENT: + return this.onTestStepAttachmentEvent(event[key]); case CUCUMBER_MESSAGES.TEST_STEP_FINISHED: return this.onTestStepFinishedEvent(event[key]); case CUCUMBER_MESSAGES.TEST_CASE_FINISHED: @@ -241,6 +245,49 @@ const createRPFormatterClass = (config) => { } } + onTestStepAttachmentEvent(data) { + if (data) { + const { testStepId, testCaseStartedId } = data; + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const step = this.storage.getStep(testCaseId, testStepId); + const dataObj = utils.getJSON(data.body); + + switch (data.mediaType) { + case RP_EVENTS.TEST_CASE_ID: { + this.storage.updateStep(testCaseId, testStepId, dataObj); + break; + } + case RP_EVENTS.ATTRIBUTES: { + const savedAttributes = step.attributes || []; + this.storage.updateStep(testCaseId, testStepId, { + attributes: savedAttributes.concat(dataObj.attributes), + }); + break; + } + case RP_EVENTS.DESCRIPTION: { + const savedDescription = step.description || ''; + this.storage.updateStep(testCaseId, testStepId, { + description: savedDescription + ? `${savedDescription}
${dataObj.description}` + : dataObj.description, + }); + break; + } + case RP_EVENTS.STATUS: { + if (dataObj.entity !== RP_ENTITY_LAUNCH) { + this.storage.updateStep(testCaseId, testStepId, dataObj); + } else { + this.customLaunchStatus = dataObj.status; + } + break; + } + default: { + break; + } + } + } + } + onTestStepFinishedEvent(data) { const { testCaseStartedId, testStepId, testStepResult } = data; const testCaseId = this.storage.getTestCaseId(testCaseStartedId); @@ -299,8 +346,13 @@ const createRPFormatterClass = (config) => { } if (step) { + const { attributes, description, testCaseId: customTestCaseId } = step; + status = step.status || status || testStepResult.status; this.reportportal.finishTestItem(tempStepId, { - status: status || testStepResult.status, + ...(status && { status }), + ...(attributes && { attributes }), + ...(description && { description }), + ...(customTestCaseId && { testCaseId: customTestCaseId }), endTime: this.reportportal.helpers.now(), }); } @@ -334,12 +386,19 @@ const createRPFormatterClass = (config) => { this.reportportal.finishTestItem(featureTempId, {}); const launchId = this.storage.getLaunchTempId(); - this.reportportal.getPromiseFinishAllItems(launchId).then(() => { - this.reportportal.finishLaunch(launchId, {}); - }); - this.storage.setLaunchTempId(null); - this.storage.setCurrentFeatureUri(null); - this.storage.setFeatureTempId(null); + this.reportportal + .getPromiseFinishAllItems(launchId) + .then(() => { + this.reportportal.finishLaunch(launchId, { + ...(this.customLaunchStatus && { status: this.customLaunchStatus }), + }); + }) + .then(() => { + this.storage.setLaunchTempId(null); + this.storage.setCurrentFeatureUri(null); + this.storage.setFeatureTempId(null); + this.customLaunchStatus = null; + }); } onGherkinDocument(event) { diff --git a/modules/storage.js b/modules/storage.js index 2184849..50b7515 100644 --- a/modules/storage.js +++ b/modules/storage.js @@ -105,6 +105,13 @@ module.exports = class Storage { return steps[testStepId]; } + updateStep(testCaseId, testStepId, data) { + const steps = this.steps.get(testCaseId); + const newStepsData = { ...steps }; + newStepsData[testStepId] = { ...newStepsData[testStepId], ...data }; + this.steps.set(testCaseId, newStepsData); + } + setFeatureTempId(value) { this.featureTempId = value; } From 45f567f8949244279da2a4cdf083f0ba94639cfe Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 14 Jun 2022 10:19:59 +0200 Subject: [PATCH 07/21] EPMRPP-76926 || tests for new api (#98) --- modules/cucumber-reportportal-formatter.js | 2 +- modules/storage.js | 4 +- tests/cucumber-reportportal-formatter.spec.js | 962 +++--------------- tests/cucumber-reportportal-formatter.test.js | 888 ++++++++++++++++ tests/data.js | 122 +++ tests/mocks.js | 36 - tests/storage.spec.js | 145 +++ tests/utils.spec.js | 51 + 8 files changed, 1374 insertions(+), 836 deletions(-) create mode 100644 tests/cucumber-reportportal-formatter.test.js create mode 100644 tests/data.js create mode 100644 tests/storage.spec.js create mode 100644 tests/utils.spec.js diff --git a/modules/cucumber-reportportal-formatter.js b/modules/cucumber-reportportal-formatter.js index ef31288..e657400 100644 --- a/modules/cucumber-reportportal-formatter.js +++ b/modules/cucumber-reportportal-formatter.js @@ -172,7 +172,7 @@ const createRPFormatterClass = (config) => { name: feature.name, startTime: this.reportportal.helpers.now(), type: 'SUITE', - description: feature.description.trim(), + description: (feature.description || '').trim(), attributes: utils.createAttributes(feature.tags), }; const { tempId } = this.reportportal.startTestItem(suiteData, launchTempId, ''); diff --git a/modules/storage.js b/modules/storage.js index 50b7515..1b1d27d 100644 --- a/modules/storage.js +++ b/modules/storage.js @@ -57,7 +57,7 @@ module.exports = class Storage { getFeature(uri) { const document = this.getDocument(uri); - return document.feature; + return document && document.feature; } setPickle(pickle) { @@ -102,7 +102,7 @@ module.exports = class Storage { getStep(testCaseId, testStepId) { const steps = this.steps.get(testCaseId); - return steps[testStepId]; + return steps && steps[testStepId]; } updateStep(testCaseId, testStepId, data) { diff --git a/tests/cucumber-reportportal-formatter.spec.js b/tests/cucumber-reportportal-formatter.spec.js index 071354b..c2befa5 100644 --- a/tests/cucumber-reportportal-formatter.spec.js +++ b/tests/cucumber-reportportal-formatter.spec.js @@ -1,4 +1,19 @@ -/* These tests need to be rewritten to reflect the refactoring of the agent. Plans for version 5.0.1. */ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const { createRPFormatterClass } = require('../modules'); const { ContextMock, @@ -7,882 +22,235 @@ const { getDefaultConfig, mockedDate, } = require('./mocks'); -const itemFinders = require('../modules/itemFinders'); -const utils = require('../modules/utils'); -const { AFTER_HOOK_URI_TO_SKIP, STATUSES } = require('../modules/constants'); - -const featureMock = { - description: 'feature description', - keyword: 'ft', - name: 'feature', - tags: ['@feature:value'], - children: [], -}; - -describe('Create ReportPortal formatter class', function() { +const Storage = require('../modules/storage'); +const { + gherkinDocument, + uri, + pickle, + pickleId, + testCase, + testCaseStarted, + testCaseId, + testStepId, + gherkinDocumentWithRule, + testStepStarted, + testStepFinished, + testCaseFinished, + testCaseStartedId, +} = require('./data'); + +describe('', () => { let FormatterClass; let formatter; + const config = getDefaultConfig(); + + FormatterClass = createRPFormatterClass(config); + formatter = new FormatterClass({ + parsedArgvOptions: {}, + eventBroadcaster: { + on: () => {}, + }, + }); beforeEach(() => { - const config = getDefaultConfig(); - - FormatterClass = createRPFormatterClass(config); - - formatter = new FormatterClass({ - parsedArgvOptions: {}, - eventBroadcaster: { - on: () => {}, - }, - }); - - formatter.contextState = new ContextMock(); - formatter.documentsStorage = new DocumentsStorageMock(); formatter.reportportal = new RPClientMock(); - formatter.attributesConf = []; + formatter.storage = new Storage(); }); - afterEach(() => { - jest.clearAllMocks(); - }); - - describe('onGherkinDocument', () => { - const documentEvent = { - uri: 'mockUri', - document: 'any', - pickle: null, - }; - - test('should call cacheDocument method from documents storage to cache the document', function() { - const spyCacheDocument = jest.spyOn(formatter.documentsStorage, 'cacheDocument'); - - formatter.onGherkinDocument(documentEvent); - - expect(spyCacheDocument).toHaveBeenCalledWith(documentEvent); - }); - - test('should call startLaunch method from RPClient if not launchId in the config', function() { - const launchStartObj = { - name: 'LauncherName', - startTime: mockedDate, - description: 'Launch description', - attributes: [], - rerun: undefined, - rerunOf: undefined, - }; + describe('onGherkinDocumentEvent', () => { + it('should set document to storage', () => { + formatter.onGherkinDocumentEvent(gherkinDocument); - const spyStartLaunch = jest.spyOn(formatter.reportportal, 'startLaunch'); - - formatter.onGherkinDocument(documentEvent); - - expect(spyStartLaunch).toHaveBeenCalledWith(launchStartObj); - expect(formatter.contextState.context.launchId).toBe('tempLaunchId'); - }); - - test('should not call startLaunch method from RPClient if launchId exists in the config', function() { - formatter.contextState.context.launchId = 'tempLaunchId'; - const spyStartLaunch = jest.spyOn(formatter.reportportal, 'startLaunch'); - - formatter.onGherkinDocument(documentEvent); - - expect(spyStartLaunch).toHaveBeenCalledTimes(0); + expect(formatter.storage.getDocument(uri)).toBe(gherkinDocument); }); }); - describe('onPickleAccepted', () => { - const uriMock = 'featureUri'; - const documentEvent = { - uri: uriMock, - document: 'any', - pickle: null, - }; - - beforeAll(() => { - jest.spyOn(itemFinders, 'findFeature').mockImplementation(() => featureMock); - jest.spyOn(itemFinders, 'findBackground').mockReturnValue(null); - jest.spyOn(utils, 'getUri').mockReturnValue(uriMock); - jest.spyOn(utils, 'createAttribute').mockReturnValue([{ key: 'feature', value: 'value' }]); - }); - - beforeEach(() => { - formatter.documentsStorage.pickleDocuments[uriMock] = {}; - }); - - test('should call isAcceptedPickleCached method from documents storage with event', function() { - const spyIsAcceptedPickleCached = jest.spyOn( - formatter.documentsStorage, - 'isAcceptedPickleCached', - ); - - formatter.onPickleAccepted(documentEvent); - - expect(spyIsAcceptedPickleCached).toHaveBeenCalledWith(documentEvent); - }); - - test('should call cacheAcceptedPickle method from documents storage if pickle not cached', function() { - const spyCacheAcceptedPickle = jest.spyOn(formatter.documentsStorage, 'cacheAcceptedPickle'); + describe('onPickleEvent', () => { + it('should set pickle to storage', () => { + formatter.onPickleEvent(pickle); - formatter.onPickleAccepted(documentEvent); - - expect(spyCacheAcceptedPickle).toHaveBeenCalledWith(documentEvent); + expect(formatter.storage.getPickle(pickle.id)).toBe(pickle); }); + }); - test('should not call cacheAcceptedPickle method from documents storage if pickle cached', function() { - jest.spyOn(formatter.documentsStorage, 'isAcceptedPickleCached').mockReturnValue(true); - - const spyCacheAcceptedPickle = jest.spyOn(formatter.documentsStorage, 'cacheAcceptedPickle'); - - formatter.onPickleAccepted(documentEvent); + describe('onTestRunStartedEvent', () => { + it('should set launchTempId to storage', () => { + formatter.onTestRunStartedEvent(); - expect(spyCacheAcceptedPickle).toHaveBeenCalledTimes(0); + expect(formatter.storage.getLaunchTempId()).toBe('tempLaunchId'); }); }); - describe('onTestCasePrepared', () => { - test('should set stepDefinitions and isBeforeHook for the context', function() { - const event = { - data: 'any', - }; + describe('onTestCaseEvent', () => { + it('should set steps to storage under testCaseId', () => { + const expectedRes = pickle.steps[0]; - formatter.onTestCasePrepared(event); + formatter.storage.setPickle(pickle); + formatter.onTestCaseEvent(testCase); - expect(formatter.contextState.context.stepDefinitions).toEqual(event); - expect(formatter.contextState.context.isBeforeHook).toBe(true); + expect(formatter.storage.getStep(testCase.id, testStepId)).toBe(expectedRes); }); }); - describe('onTestCaseStarted', () => { - const uriMock = 'featureUri'; - const documentEvent = { - uri: uriMock, - document: 'any', - name: 'lol', - keyword: 'loc', - description: 'description', - sourceLocation: { - uri: uriMock, - }, - }; - const pickleTags = [ - { - name: '@feature:value', - location: { - line: 1, - column: 1, - }, - }, - ]; - let spyFindScenario; - let spyGetUri; - let spyCreateAttributes; - let spyCreateTagComparator; - - beforeAll(() => { - spyFindScenario = jest - .spyOn(itemFinders, 'findScenario') - .mockImplementation(() => featureMock); - spyGetUri = jest.spyOn(utils, 'getUri').mockReturnValue(uriMock); - spyCreateAttributes = jest - .spyOn(utils, 'createAttributes') - .mockReturnValue([{ key: 'feature', value: 'value' }]); - spyCreateTagComparator = jest - .spyOn(utils, 'createTagComparator') - .mockReturnValue(() => false); - }); - + describe('onTestCaseStartedEvent', () => { beforeEach(() => { - formatter.documentsStorage.pickleDocuments[uriMock] = { - featureId: 'featureId', - tags: pickleTags, - }; - formatter.documentsStorage.gherkinDocuments[uriMock] = { - feature: { - tags: [], - }, - }; + formatter.onGherkinDocumentEvent(gherkinDocument); + formatter.onPickleEvent(pickle); + formatter.onTestRunStartedEvent(); + formatter.onTestCaseEvent(testCase); }); - test('should call findScenario with gherkinDocuments & sourceLocation', function() { - formatter.onTestCaseStarted(documentEvent); + it('should set setTestCaseStartedId-testCaseId map to storage', () => { + formatter.onTestCaseStartedEvent(testCaseStarted); - expect(spyFindScenario).toHaveBeenCalledWith( - formatter.documentsStorage.gherkinDocuments, - documentEvent.sourceLocation, - ); + expect(formatter.storage.getTestCaseId(testCaseStarted.id)).toBe(testCase.id); }); - test('should call getUri with uri from event sourceLocation', function() { - formatter.onTestCaseStarted(documentEvent); + it('should start FEATURE if no currentFeatureUri or new feature', () => { + formatter.onTestCaseStartedEvent(testCaseStarted); - expect(spyGetUri).toHaveBeenCalledWith(documentEvent.sourceLocation.uri); + expect(formatter.storage.getFeatureTempId()).toBe('testItemId'); }); - test('should call createTagComparator with pickle tag value', function() { - formatter.onTestCaseStarted(documentEvent); + it('should finish FEATURE if has currentFeatureUri', () => { + const finishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); + const tempFeatureId = 'tempFeatureId'; + formatter.storage.setFeatureTempId(tempFeatureId); + formatter.storage.setCurrentFeatureUri(pickle.uri); - expect(spyCreateTagComparator).toHaveBeenCalledWith(pickleTags[0]); - }); - - test('should call createAttributes with pickleTags', function() { - formatter.onTestCaseStarted(documentEvent); + formatter.onTestCaseStartedEvent(testCaseStarted); - expect(spyCreateAttributes).toHaveBeenCalledWith(pickleTags); + expect(finishTestItem).toHaveBeenCalledWith(tempFeatureId, {}); }); - test('should call startTestItem method from RPClient if isScenarioBasedStatistics is true', function() { - formatter.isScenarioBasedStatistics = true; - - const itemStartObj = { - name: 'ft: feature', - type: 'STEP', - startTime: mockedDate, - description: 'feature description', - attributes: [{ key: 'feature', value: 'value' }], - retry: false, - }; + it('start scenario flow', () => { + formatter.onTestCaseStartedEvent(testCaseStarted); - formatter.contextState.context.launchId = 'tempLaunchId'; - const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); - - formatter.onTestCaseStarted(documentEvent); - - expect(spyStartTestItem).toHaveBeenCalledWith(itemStartObj, 'tempLaunchId', 'featureId'); + expect(formatter.storage.getScenarioTempId()).toBe('testItemId'); }); - test('should call startTestItem method from RPClient if isScenarioBasedStatistics is false and attemptNumber from event <=2', function() { - formatter.isScenarioBasedStatistics = false; - - const itemStartObj = { - name: 'ft: feature', - type: 'TEST', - startTime: mockedDate, - description: 'feature description', - attributes: [{ key: 'feature', value: 'value' }], - retry: false, - }; - - formatter.contextState.context.launchId = 'tempLaunchId'; - - const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); - - formatter.onTestCaseStarted({ - ...documentEvent, - attemptNumber: 1, - }); + it('start rule flow', () => { + formatter.onGherkinDocumentEvent(gherkinDocumentWithRule); + formatter.onTestCaseStartedEvent(testCaseStarted); - expect(spyStartTestItem).toHaveBeenCalledWith(itemStartObj, 'tempLaunchId', 'featureId'); + expect(formatter.storage.getRuleTempId()).toBe('testItemId'); }); - test('should not call startTestItem method from RPClient if isScenarioBasedStatistics is false and attemptNumber from event >=2', function() { - formatter.isScenarioBasedStatistics = false; - + it('startTestItem should be called', () => { const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); - formatter.onTestCaseStarted({ - ...documentEvent, - attemptNumber: 2, - }); + formatter.onTestCaseStartedEvent(testCaseStarted); - expect(spyStartTestItem).toHaveBeenCalledTimes(0); + expect(spyStartTestItem).lastCalledWith( + { + attributes: [], + description: undefined, + name: 'scenario name', + startTime: mockedDate, + type: 'TEST', + }, + 'tempLaunchId', + 'testItemId', + ); }); }); - describe('onTestStepStarted', () => { - const stepMock = { - keyword: 'stepExample', - }; - const stepDefinitionMock = { - name: 'stepDefinition', - }; - const event = { - index: 0, - testCase: { - attemptNumber: 1, - }, - }; - - let spyFindStep; - let spyFindStepDefinition; - let spyGetStepType; - - beforeAll(() => { - spyFindStepDefinition = jest - .spyOn(itemFinders, 'findStepDefinition') - .mockImplementation(() => stepDefinitionMock); - spyGetStepType = jest.spyOn(utils, 'getStepType').mockReturnValue('STEP'); - }); - + describe('onTestStepStartedEvent', () => { beforeEach(() => { - spyFindStep = jest - .spyOn(formatter.contextState, 'findStep') - .mockImplementation(() => stepMock); - formatter.contextState.context.stepDefinitions = { - steps: [ - { - sourceLocation: {}, - }, - ], - }; - }); - - test('should call findStep function to find step for context', function() { - formatter.onTestStepStarted(event); - - expect(spyFindStep).toHaveBeenCalledWith(event); - expect(formatter.contextState.context.step).toEqual(stepMock); - }); - - test('should call findStepDefinition function to find step definition for context', function() { - formatter.onTestStepStarted(event); - - expect(spyFindStepDefinition).toHaveBeenCalledWith(formatter.contextState.context, event); - expect(formatter.contextState.context.stepDefinition).toEqual(stepDefinitionMock); - }); - - test('should call getStepType function to get type for step', function() { - formatter.onTestStepStarted(event); - - expect(spyGetStepType).toHaveBeenCalledWith(stepMock.keyword); - }); - - test('should call startTestItem method from RPClient', function() { - formatter.contextState.context.launchId = 'launchId'; - formatter.contextState.context.scenarioId = 'scenarioId'; - formatter.isScenarioBasedStatistics = false; - - const itemStartObj = { - name: stepMock.keyword, - type: 'STEP', - startTime: mockedDate, - description: '', - hasStats: true, - retry: false, - }; - - const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); - - formatter.onTestStepStarted(event); - - expect(spyStartTestItem).toHaveBeenCalledWith(itemStartObj, 'launchId', 'scenarioId'); - expect(formatter.contextState.context.stepId).toBe('testItemId'); + formatter.onGherkinDocumentEvent(gherkinDocument); + formatter.onPickleEvent(pickle); + formatter.onTestRunStartedEvent(); + formatter.onTestCaseEvent(testCase); + formatter.onTestCaseStartedEvent(testCaseStarted); }); - test('should not call startTestItem method and stop function execution', function() { - formatter.contextState.context.stepDefinitions = { - steps: [ - { - actionLocation: { - uri: `uri: ${AFTER_HOOK_URI_TO_SKIP}`, - }, - }, - ], - }; - + it('startTestItem should be called', () => { const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); - formatter.onTestStepStarted(event); + formatter.onTestStepStartedEvent(testStepStarted); - expect(spyFindStep).toHaveBeenCalledTimes(0); - expect(spyFindStepDefinition).toHaveBeenCalledTimes(0); - expect(spyGetStepType).toHaveBeenCalledTimes(0); - expect(spyStartTestItem).toHaveBeenCalledTimes(0); + expect(spyStartTestItem).lastCalledWith( + { name: 'I put "true"', startTime: mockedDate, type: 'STEP' }, + 'tempLaunchId', + 'testItemId', + ); }); }); - describe('onTestStepFinished', () => { - const event = { - result: { - status: 'passed', - }, - testCase: { - attemptNumber: 1, - sourceLocation: { uri: 'testCaseUri' }, - }, - }; - - let spyGetFileName; - let spyCountFailedScenarios; - + describe('onTestStepFinishedEvent', () => { beforeEach(() => { - spyGetFileName = jest.spyOn(formatter.contextState, 'getFileName'); - spyCountFailedScenarios = jest - .spyOn(formatter.contextState, 'countFailedScenarios') - .mockImplementation(() => {}); - formatter.contextState.context.stepSourceLocation = { sourceLocation: {} }; - }); - - test('should call spyGetFileName to get name for screenshot', function() { - formatter.onTestStepFinished(event); - - expect(spyGetFileName).toHaveBeenCalledTimes(1); - }); - - test('should set passed status for step and scenario in case of passed result status', function() { - formatter.onTestStepFinished(event); - - expect(formatter.contextState.context.stepStatus).toBe(STATUSES.PASSED); - expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.PASSED); - }); - - test('should call sendLog method from RPClient with WARN level in case of pending result status', function() { - event.result.status = STATUSES.PENDING; - formatter.contextState.context.stepId = 'stepId'; - formatter.onTestStepFinished(event); - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - expect(spySendLog).toHaveBeenCalledWith('stepId', { - time: mockedDate, - level: 'WARN', - message: "This step is marked as 'pending'", - }); - }); - - test('should set not_implemented status for step and failed for scenario in case of pending result status', function() { - event.result.status = STATUSES.PENDING; - formatter.contextState.context.stepId = 'stepId'; - formatter.onTestStepFinished(event); - - expect(formatter.contextState.context.stepStatus).toBe(STATUSES.NOT_IMPLEMENTED); - expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); - expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); - }); - - test('should call sendLog method from RPClient with ERROR level in case of undefined result status', function() { - event.result.status = STATUSES.UNDEFINED; - formatter.contextState.context.stepId = 'stepId'; - formatter.onTestStepFinished(event); - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - expect(spySendLog).toHaveBeenCalledWith('stepId', { - time: mockedDate, - level: 'ERROR', - message: 'There is no step definition found. Please verify and implement it.', - }); - }); - - test('should set not_found status for step and failed for scenario in case of undefined result status', function() { - event.result.status = STATUSES.UNDEFINED; - formatter.contextState.context.stepId = 'stepId'; - formatter.onTestStepFinished(event); - - expect(formatter.contextState.context.stepStatus).toBe(STATUSES.NOT_FOUND); - expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); - expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); - }); - - test('should call sendLog method from RPClient with ERROR level in case of ambiguous result status', function() { - event.result.status = STATUSES.AMBIGUOUS; - formatter.contextState.context.stepId = 'stepId'; - formatter.onTestStepFinished(event); - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - expect(spySendLog).toHaveBeenCalledWith('stepId', { - time: mockedDate, - level: 'ERROR', - message: 'There are more than one step implementation. Please verify and reimplement it.', - }); - }); - - test('should set not_found status for step and failed for scenario in case of ambiguous result status', function() { - event.result.status = STATUSES.AMBIGUOUS; - formatter.contextState.context.stepId = 'stepId'; - formatter.onTestStepFinished(event); - - expect(formatter.contextState.context.stepStatus).toBe(STATUSES.NOT_FOUND); - expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); - expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); - }); - - test('should set skipped status for step in case of skipped result status', function() { - event.result.status = STATUSES.SKIPPED; - formatter.onTestStepFinished(event); - - expect(formatter.contextState.context.stepStatus).toBe(STATUSES.SKIPPED); - }); - - test('should set skipped status for scenario if it was failed in case of skipped result status', function() { - event.result.status = STATUSES.SKIPPED; - formatter.contextState.context.scenarioStatus = STATUSES.FAILED; - formatter.onTestStepFinished(event); - - expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.SKIPPED); - }); - - test('should call sendLog method from RPClient with ERROR level in case of failed result status', function() { - event.result.status = STATUSES.FAILED; - event.result.exception = 255; - const stepDefinitionMock = { - uri: 'stepDefinition', - }; - - formatter.contextState.context.stepDefinition = stepDefinitionMock; - formatter.contextState.context.stepId = 'stepId'; - formatter.onTestStepFinished(event); - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - expect(spySendLog).toHaveBeenCalledWith('stepId', { - time: mockedDate, - level: 'ERROR', - message: `${stepDefinitionMock.uri}\n 255`, - }); - }); - - test('should set failed status for step in case of failed result status', function() { - event.result.status = STATUSES.FAILED; - formatter.contextState.context.stepDefinition = { - uri: 'stepDefinition', - }; - - formatter.onTestStepFinished(event); - - expect(formatter.contextState.context.stepStatus).toBe(STATUSES.FAILED); - expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); - }); - - test('should call finishTestItem method from RPClient', function() { - event.result.status = STATUSES.PASSED; - formatter.contextState.context.stepId = 'stepId'; - - const itemFinishObj = { - status: STATUSES.PASSED, - endTime: mockedDate, - }; - - const spyStartTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); - - formatter.onTestStepFinished(event); - - expect(spyStartTestItem).toHaveBeenCalledWith('stepId', itemFinishObj); - }); - - test('should call finishTestItem method from RPClient with ab001 issue in case of not_found step status', function() { - event.result.status = STATUSES.UNDEFINED; - formatter.contextState.context.stepId = 'stepId'; - - const itemFinishObj = { - status: STATUSES.FAILED, - endTime: mockedDate, - issue: { - issueType: 'ab001', - comment: 'STEP DEFINITION WAS NOT FOUND', - }, - }; - - const spyStartTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); - - formatter.onTestStepFinished(event); - - expect(spyStartTestItem).toHaveBeenCalledWith('stepId', itemFinishObj); - }); - - test('should call finishTestItem method from RPClient with ti001 issue in case of not_implemented step status', function() { - event.result.status = STATUSES.PENDING; - formatter.contextState.context.stepId = 'stepId'; - - const itemFinishObj = { - status: STATUSES.SKIPPED, - endTime: mockedDate, - issue: { - issueType: 'ti001', - comment: 'STEP IS PENDING IMPLEMENTATION', - }, - }; - - const spyStartTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); - - formatter.onTestStepFinished(event); - - expect(spyStartTestItem).toHaveBeenCalledWith('stepId', itemFinishObj); + formatter.onGherkinDocumentEvent(gherkinDocument); + formatter.onPickleEvent(pickle); + formatter.onTestRunStartedEvent(); + formatter.onTestCaseEvent(testCase); + formatter.onTestCaseStartedEvent(testCaseStarted); + formatter.onTestStepStartedEvent(testStepStarted); }); - test('should not call finishTestItem method and stop function execution', function() { - formatter.contextState.context.stepSourceLocation = { - actionLocation: { - uri: `uri: ${AFTER_HOOK_URI_TO_SKIP}`, - }, - }; - + it('finishTestItem should be called, clean storage', () => { const spyFinishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - formatter.onTestStepFinished(event); - - expect(spyGetFileName).toHaveBeenCalledTimes(0); - expect(spyCountFailedScenarios).toHaveBeenCalledTimes(0); - expect(spySendLog).toHaveBeenCalledTimes(0); - expect(spyFinishTestItem).toHaveBeenCalledTimes(0); - }); - }); - - describe('onTestStepAttachment', () => { - const mockFileObj = { - level: 'INFO', - message: 'file', - data: 'string', - }; - const event = { - data: [ - { - item: 'text', - }, - ], - }; - - const spyGetJSON = jest.spyOn(utils, 'getJSON'); - let spyGetFileName; - - beforeEach(() => { - spyGetFileName = jest - .spyOn(formatter.contextState, 'getFileName') - .mockImplementation(() => 'fileName'); - - formatter.contextState.context.stepStatus = STATUSES.PASSED; - formatter.contextState.context.stepId = 'stepId'; - }); - - test('should call spyGetFileName to get name for file', function() { - event.media = { - type: 'text/plain', - }; - spyGetJSON.mockImplementationOnce(() => mockFileObj); - formatter.onTestStepAttachment(event); - - expect(spyGetFileName).toHaveBeenCalledTimes(1); - }); - - test('should call sendLog method from RPClient to send log with attachment for text media type', function() { - event.media = { - type: 'text/plain', - }; - spyGetJSON.mockImplementationOnce(() => mockFileObj); - - const request = { - level: mockFileObj.level, - message: mockFileObj.message, - time: mockedDate, - }; - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - formatter.onTestStepAttachment(event); - expect(spySendLog).toHaveBeenCalledWith('stepId', request); - }); - - test('should call sendLog method from RPClient with DEBUG level log in case of invalid json data for text media type', function() { - event.media = { - type: 'text/plain', - }; - spyGetJSON.mockImplementationOnce(() => false); - - const request = { - level: 'DEBUG', - message: event.data, - time: mockedDate, - }; - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - formatter.onTestStepAttachment(event); - - expect(spySendLog).toHaveBeenCalledWith('stepId', request); - }); - - test('should call sendLog method from RPClient to send log with attachment for other media type', function() { - event.media = { - type: 'other', - }; - spyGetJSON.mockImplementationOnce(() => mockFileObj); - - const request = { - level: mockFileObj.level, - message: mockFileObj.message, - time: mockedDate, - file: { - name: mockFileObj.message, - }, - }; - const fileObj = { - name: 'fileName', - type: 'other', - content: mockFileObj.data, - }; - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); - - formatter.onTestStepAttachment(event); - - expect(spySendLog).toHaveBeenCalledWith('stepId', request, fileObj); - }); - - test('should call sendLog method from RPClient with default parameters in case of invalid json data for other media type', function() { - event.media = { - type: 'other', - }; - spyGetJSON.mockImplementationOnce(() => false); - - const request = { - level: 'DEBUG', - message: 'fileName', - time: mockedDate, - file: { - name: 'fileName', - }, - }; - const fileObj = { - name: 'fileName', - type: 'other', - content: event.data, - }; - - const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + formatter.onTestStepFinishedEvent(testStepFinished); - formatter.onTestStepAttachment(event); - - expect(spySendLog).toHaveBeenCalledWith('stepId', request, fileObj); + expect(spyFinishTestItem).toBeCalledWith('testItemId', { + endTime: mockedDate, + status: 'failed', + }); + expect(formatter.storage.getStepTempId()).toBe(null); }); }); - describe('onTestCaseFinished', () => { - const itemUri = 'itemUri'; - const event = { - sourceLocation: { - uri: itemUri, - }, - result: { - status: STATUSES.PASSED, - }, - }; - - let spyFinishTestItem; - + describe('onTestCaseFinishedEvent', () => { beforeEach(() => { - spyFinishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); - - formatter.isScenarioBasedStatistics = false; - formatter.contextState.context.scenarioId = 'scenarioId'; - formatter.contextState.context.scenariosCount[itemUri] = { - done: 0, - total: 2, - }; - - formatter.documentsStorage.pickleDocuments[itemUri] = { - featureId: 'featureId', - }; - }); - - test('should call finishTestItem method from RPClient to finish test item', function() { - formatter.onTestCaseFinished(event); - - const itemFinishObj = { - status: STATUSES.PASSED, - endTime: mockedDate, - }; - - expect(spyFinishTestItem).toHaveBeenCalledWith('scenarioId', itemFinishObj); - expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); - expect(formatter.contextState.context.scenarioId).toBe(null); - }); - - test('should call finishTestItem method from RPClient and finish test item with failed status in case of result status not passed', function() { - event.result.status = STATUSES.SKIPPED; - formatter.onTestCaseFinished(event); - - const itemFinishObj = { - status: STATUSES.FAILED, - endTime: mockedDate, - }; - - expect(spyFinishTestItem).toHaveBeenCalledWith('scenarioId', itemFinishObj); - expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); - expect(formatter.contextState.context.scenarioId).toBe(null); - }); - - test('should increase scenariosCount done in context', function() { - event.result.status = STATUSES.PASSED; - formatter.onTestCaseFinished(event); - - expect(formatter.contextState.context.scenariosCount[itemUri].done).toBe(1); - }); - - test('should call finishTestItem method from RPClient twice in case of finishing the item from suite', function() { - formatter.contextState.context.scenariosCount[itemUri].total = 1; - formatter.contextState.context.failedScenarios[itemUri] = 0; - - event.result.status = STATUSES.PASSED; - formatter.onTestCaseFinished(event); - - const finishItemObj = { - status: STATUSES.PASSED, - endTime: mockedDate, - }; - - expect(spyFinishTestItem).toHaveBeenCalledTimes(2); - expect(spyFinishTestItem).toHaveBeenNthCalledWith(2, 'featureId', finishItemObj); - }); - - test('should call finishTestItem method from RPClient second time with failed status in case of failed scenarios in suite', function() { - formatter.contextState.context.scenariosCount[itemUri].total = 1; - formatter.contextState.context.failedScenarios[itemUri] = 1; - - event.result.status = STATUSES.PASSED; - formatter.onTestCaseFinished(event); - - const finishItemObj = { - status: STATUSES.FAILED, - endTime: mockedDate, - }; - - expect(spyFinishTestItem).toHaveBeenCalledTimes(2); - expect(spyFinishTestItem).toHaveBeenNthCalledWith(2, 'featureId', finishItemObj); + formatter.onGherkinDocumentEvent(gherkinDocument); + formatter.onPickleEvent(pickle); + formatter.onTestRunStartedEvent(); + formatter.onTestCaseEvent(testCase); + formatter.onTestCaseStartedEvent(testCaseStarted); + formatter.onTestStepStartedEvent(testStepStarted); + formatter.onTestStepFinishedEvent(testStepFinished); }); - test('should not call finishTestItem method and stop function execution', function() { - formatter.isScenarioBasedStatistics = false; - event.result.retried = true; + it('finishTestItem should be called, clean storage', () => { + const spyFinishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); - formatter.onTestCaseFinished(event); + formatter.onTestCaseFinishedEvent(testCaseFinished); - expect(spyFinishTestItem).toHaveBeenCalledTimes(0); + expect(spyFinishTestItem).lastCalledWith('testItemId', {}); + expect(formatter.storage.getTestCaseId(testCaseStartedId)).toBe(undefined); + expect(formatter.storage.getStep(testCaseId, testStepId)).toBe(undefined); + expect(formatter.storage.getTestCase(testCaseId)).toBe(undefined); + expect(formatter.storage.getScenarioTempId()).toBeNull(); }); }); - describe('onTestRunFinished', () => { - let spyGetPromiseFinishAllItems; - let spyFinishLaunch; - + describe('onTestRunFinishedEvent', () => { beforeEach(() => { - spyGetPromiseFinishAllItems = jest.spyOn(formatter.reportportal, 'getPromiseFinishAllItems'); - spyFinishLaunch = jest.spyOn(formatter.reportportal, 'finishLaunch'); - }); - - test('should call getPromiseFinishAllItems method from RPClient & should not call finishLaunch method for empty launch id', function() { - formatter.contextState.context.launchId = null; - - formatter.onTestRunFinished(); - - expect(spyGetPromiseFinishAllItems).toHaveBeenCalledWith(null); - expect(spyFinishLaunch).toHaveBeenCalledTimes(0); + formatter.onGherkinDocumentEvent(gherkinDocument); + formatter.onPickleEvent(pickle); + formatter.onTestRunStartedEvent(); + formatter.onTestCaseEvent(testCase); + formatter.onTestCaseStartedEvent(testCaseStarted); + formatter.onTestStepStartedEvent(testStepStarted); + formatter.onTestStepFinishedEvent(testStepFinished); + formatter.onTestCaseFinishedEvent(testCaseFinished); }); - test('should call getPromiseFinishAllItems method from RPClient and should finish launch with corresponding id', async function() { - formatter.contextState.context.launchId = 'launchId'; - await formatter.onTestRunFinished(); - - expect(spyGetPromiseFinishAllItems).toHaveBeenCalledWith('launchId'); - expect(spyFinishLaunch).toHaveBeenCalledWith('launchId', { endTime: mockedDate }); - }); + it('finishTestItem, getPromiseFinishAllItems should be called, clean storage', () => { + const spyFinishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); + const spyGetPromiseFinishAllItems = jest.spyOn( + formatter.reportportal, + 'getPromiseFinishAllItems', + ); - test('should call resetContext method from context after finishing launch', async function() { - formatter.contextState.context.launchId = 'launchId'; - const spyResetContext = jest.spyOn(formatter.contextState, 'resetContext'); + formatter.onTestRunFinishedEvent(); - await formatter.onTestRunFinished(); + expect(spyFinishTestItem).lastCalledWith('testItemId', {}); + expect(spyGetPromiseFinishAllItems).toBeCalledWith('tempLaunchId'); - expect(spyResetContext).toHaveBeenCalledTimes(1); + expect(formatter.storage.getLaunchTempId()).toBeNull(); + expect(formatter.storage.getCurrentFeatureUri()).toBeNull(); + expect(formatter.storage.getFeatureTempId()).toBeNull(); }); }); }); diff --git a/tests/cucumber-reportportal-formatter.test.js b/tests/cucumber-reportportal-formatter.test.js new file mode 100644 index 0000000..071354b --- /dev/null +++ b/tests/cucumber-reportportal-formatter.test.js @@ -0,0 +1,888 @@ +/* These tests need to be rewritten to reflect the refactoring of the agent. Plans for version 5.0.1. */ +const { createRPFormatterClass } = require('../modules'); +const { + ContextMock, + DocumentsStorageMock, + RPClientMock, + getDefaultConfig, + mockedDate, +} = require('./mocks'); +const itemFinders = require('../modules/itemFinders'); +const utils = require('../modules/utils'); +const { AFTER_HOOK_URI_TO_SKIP, STATUSES } = require('../modules/constants'); + +const featureMock = { + description: 'feature description', + keyword: 'ft', + name: 'feature', + tags: ['@feature:value'], + children: [], +}; + +describe('Create ReportPortal formatter class', function() { + let FormatterClass; + let formatter; + + beforeEach(() => { + const config = getDefaultConfig(); + + FormatterClass = createRPFormatterClass(config); + + formatter = new FormatterClass({ + parsedArgvOptions: {}, + eventBroadcaster: { + on: () => {}, + }, + }); + + formatter.contextState = new ContextMock(); + formatter.documentsStorage = new DocumentsStorageMock(); + formatter.reportportal = new RPClientMock(); + formatter.attributesConf = []; + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('onGherkinDocument', () => { + const documentEvent = { + uri: 'mockUri', + document: 'any', + pickle: null, + }; + + test('should call cacheDocument method from documents storage to cache the document', function() { + const spyCacheDocument = jest.spyOn(formatter.documentsStorage, 'cacheDocument'); + + formatter.onGherkinDocument(documentEvent); + + expect(spyCacheDocument).toHaveBeenCalledWith(documentEvent); + }); + + test('should call startLaunch method from RPClient if not launchId in the config', function() { + const launchStartObj = { + name: 'LauncherName', + startTime: mockedDate, + description: 'Launch description', + attributes: [], + rerun: undefined, + rerunOf: undefined, + }; + + const spyStartLaunch = jest.spyOn(formatter.reportportal, 'startLaunch'); + + formatter.onGherkinDocument(documentEvent); + + expect(spyStartLaunch).toHaveBeenCalledWith(launchStartObj); + expect(formatter.contextState.context.launchId).toBe('tempLaunchId'); + }); + + test('should not call startLaunch method from RPClient if launchId exists in the config', function() { + formatter.contextState.context.launchId = 'tempLaunchId'; + const spyStartLaunch = jest.spyOn(formatter.reportportal, 'startLaunch'); + + formatter.onGherkinDocument(documentEvent); + + expect(spyStartLaunch).toHaveBeenCalledTimes(0); + }); + }); + + describe('onPickleAccepted', () => { + const uriMock = 'featureUri'; + const documentEvent = { + uri: uriMock, + document: 'any', + pickle: null, + }; + + beforeAll(() => { + jest.spyOn(itemFinders, 'findFeature').mockImplementation(() => featureMock); + jest.spyOn(itemFinders, 'findBackground').mockReturnValue(null); + jest.spyOn(utils, 'getUri').mockReturnValue(uriMock); + jest.spyOn(utils, 'createAttribute').mockReturnValue([{ key: 'feature', value: 'value' }]); + }); + + beforeEach(() => { + formatter.documentsStorage.pickleDocuments[uriMock] = {}; + }); + + test('should call isAcceptedPickleCached method from documents storage with event', function() { + const spyIsAcceptedPickleCached = jest.spyOn( + formatter.documentsStorage, + 'isAcceptedPickleCached', + ); + + formatter.onPickleAccepted(documentEvent); + + expect(spyIsAcceptedPickleCached).toHaveBeenCalledWith(documentEvent); + }); + + test('should call cacheAcceptedPickle method from documents storage if pickle not cached', function() { + const spyCacheAcceptedPickle = jest.spyOn(formatter.documentsStorage, 'cacheAcceptedPickle'); + + formatter.onPickleAccepted(documentEvent); + + expect(spyCacheAcceptedPickle).toHaveBeenCalledWith(documentEvent); + }); + + test('should not call cacheAcceptedPickle method from documents storage if pickle cached', function() { + jest.spyOn(formatter.documentsStorage, 'isAcceptedPickleCached').mockReturnValue(true); + + const spyCacheAcceptedPickle = jest.spyOn(formatter.documentsStorage, 'cacheAcceptedPickle'); + + formatter.onPickleAccepted(documentEvent); + + expect(spyCacheAcceptedPickle).toHaveBeenCalledTimes(0); + }); + }); + + describe('onTestCasePrepared', () => { + test('should set stepDefinitions and isBeforeHook for the context', function() { + const event = { + data: 'any', + }; + + formatter.onTestCasePrepared(event); + + expect(formatter.contextState.context.stepDefinitions).toEqual(event); + expect(formatter.contextState.context.isBeforeHook).toBe(true); + }); + }); + + describe('onTestCaseStarted', () => { + const uriMock = 'featureUri'; + const documentEvent = { + uri: uriMock, + document: 'any', + name: 'lol', + keyword: 'loc', + description: 'description', + sourceLocation: { + uri: uriMock, + }, + }; + const pickleTags = [ + { + name: '@feature:value', + location: { + line: 1, + column: 1, + }, + }, + ]; + let spyFindScenario; + let spyGetUri; + let spyCreateAttributes; + let spyCreateTagComparator; + + beforeAll(() => { + spyFindScenario = jest + .spyOn(itemFinders, 'findScenario') + .mockImplementation(() => featureMock); + spyGetUri = jest.spyOn(utils, 'getUri').mockReturnValue(uriMock); + spyCreateAttributes = jest + .spyOn(utils, 'createAttributes') + .mockReturnValue([{ key: 'feature', value: 'value' }]); + spyCreateTagComparator = jest + .spyOn(utils, 'createTagComparator') + .mockReturnValue(() => false); + }); + + beforeEach(() => { + formatter.documentsStorage.pickleDocuments[uriMock] = { + featureId: 'featureId', + tags: pickleTags, + }; + formatter.documentsStorage.gherkinDocuments[uriMock] = { + feature: { + tags: [], + }, + }; + }); + + test('should call findScenario with gherkinDocuments & sourceLocation', function() { + formatter.onTestCaseStarted(documentEvent); + + expect(spyFindScenario).toHaveBeenCalledWith( + formatter.documentsStorage.gherkinDocuments, + documentEvent.sourceLocation, + ); + }); + + test('should call getUri with uri from event sourceLocation', function() { + formatter.onTestCaseStarted(documentEvent); + + expect(spyGetUri).toHaveBeenCalledWith(documentEvent.sourceLocation.uri); + }); + + test('should call createTagComparator with pickle tag value', function() { + formatter.onTestCaseStarted(documentEvent); + + expect(spyCreateTagComparator).toHaveBeenCalledWith(pickleTags[0]); + }); + + test('should call createAttributes with pickleTags', function() { + formatter.onTestCaseStarted(documentEvent); + + expect(spyCreateAttributes).toHaveBeenCalledWith(pickleTags); + }); + + test('should call startTestItem method from RPClient if isScenarioBasedStatistics is true', function() { + formatter.isScenarioBasedStatistics = true; + + const itemStartObj = { + name: 'ft: feature', + type: 'STEP', + startTime: mockedDate, + description: 'feature description', + attributes: [{ key: 'feature', value: 'value' }], + retry: false, + }; + + formatter.contextState.context.launchId = 'tempLaunchId'; + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); + + formatter.onTestCaseStarted(documentEvent); + + expect(spyStartTestItem).toHaveBeenCalledWith(itemStartObj, 'tempLaunchId', 'featureId'); + }); + + test('should call startTestItem method from RPClient if isScenarioBasedStatistics is false and attemptNumber from event <=2', function() { + formatter.isScenarioBasedStatistics = false; + + const itemStartObj = { + name: 'ft: feature', + type: 'TEST', + startTime: mockedDate, + description: 'feature description', + attributes: [{ key: 'feature', value: 'value' }], + retry: false, + }; + + formatter.contextState.context.launchId = 'tempLaunchId'; + + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); + + formatter.onTestCaseStarted({ + ...documentEvent, + attemptNumber: 1, + }); + + expect(spyStartTestItem).toHaveBeenCalledWith(itemStartObj, 'tempLaunchId', 'featureId'); + }); + + test('should not call startTestItem method from RPClient if isScenarioBasedStatistics is false and attemptNumber from event >=2', function() { + formatter.isScenarioBasedStatistics = false; + + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); + + formatter.onTestCaseStarted({ + ...documentEvent, + attemptNumber: 2, + }); + + expect(spyStartTestItem).toHaveBeenCalledTimes(0); + }); + }); + + describe('onTestStepStarted', () => { + const stepMock = { + keyword: 'stepExample', + }; + const stepDefinitionMock = { + name: 'stepDefinition', + }; + const event = { + index: 0, + testCase: { + attemptNumber: 1, + }, + }; + + let spyFindStep; + let spyFindStepDefinition; + let spyGetStepType; + + beforeAll(() => { + spyFindStepDefinition = jest + .spyOn(itemFinders, 'findStepDefinition') + .mockImplementation(() => stepDefinitionMock); + spyGetStepType = jest.spyOn(utils, 'getStepType').mockReturnValue('STEP'); + }); + + beforeEach(() => { + spyFindStep = jest + .spyOn(formatter.contextState, 'findStep') + .mockImplementation(() => stepMock); + formatter.contextState.context.stepDefinitions = { + steps: [ + { + sourceLocation: {}, + }, + ], + }; + }); + + test('should call findStep function to find step for context', function() { + formatter.onTestStepStarted(event); + + expect(spyFindStep).toHaveBeenCalledWith(event); + expect(formatter.contextState.context.step).toEqual(stepMock); + }); + + test('should call findStepDefinition function to find step definition for context', function() { + formatter.onTestStepStarted(event); + + expect(spyFindStepDefinition).toHaveBeenCalledWith(formatter.contextState.context, event); + expect(formatter.contextState.context.stepDefinition).toEqual(stepDefinitionMock); + }); + + test('should call getStepType function to get type for step', function() { + formatter.onTestStepStarted(event); + + expect(spyGetStepType).toHaveBeenCalledWith(stepMock.keyword); + }); + + test('should call startTestItem method from RPClient', function() { + formatter.contextState.context.launchId = 'launchId'; + formatter.contextState.context.scenarioId = 'scenarioId'; + formatter.isScenarioBasedStatistics = false; + + const itemStartObj = { + name: stepMock.keyword, + type: 'STEP', + startTime: mockedDate, + description: '', + hasStats: true, + retry: false, + }; + + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); + + formatter.onTestStepStarted(event); + + expect(spyStartTestItem).toHaveBeenCalledWith(itemStartObj, 'launchId', 'scenarioId'); + expect(formatter.contextState.context.stepId).toBe('testItemId'); + }); + + test('should not call startTestItem method and stop function execution', function() { + formatter.contextState.context.stepDefinitions = { + steps: [ + { + actionLocation: { + uri: `uri: ${AFTER_HOOK_URI_TO_SKIP}`, + }, + }, + ], + }; + + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'startTestItem'); + + formatter.onTestStepStarted(event); + + expect(spyFindStep).toHaveBeenCalledTimes(0); + expect(spyFindStepDefinition).toHaveBeenCalledTimes(0); + expect(spyGetStepType).toHaveBeenCalledTimes(0); + expect(spyStartTestItem).toHaveBeenCalledTimes(0); + }); + }); + + describe('onTestStepFinished', () => { + const event = { + result: { + status: 'passed', + }, + testCase: { + attemptNumber: 1, + sourceLocation: { uri: 'testCaseUri' }, + }, + }; + + let spyGetFileName; + let spyCountFailedScenarios; + + beforeEach(() => { + spyGetFileName = jest.spyOn(formatter.contextState, 'getFileName'); + spyCountFailedScenarios = jest + .spyOn(formatter.contextState, 'countFailedScenarios') + .mockImplementation(() => {}); + formatter.contextState.context.stepSourceLocation = { sourceLocation: {} }; + }); + + test('should call spyGetFileName to get name for screenshot', function() { + formatter.onTestStepFinished(event); + + expect(spyGetFileName).toHaveBeenCalledTimes(1); + }); + + test('should set passed status for step and scenario in case of passed result status', function() { + formatter.onTestStepFinished(event); + + expect(formatter.contextState.context.stepStatus).toBe(STATUSES.PASSED); + expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.PASSED); + }); + + test('should call sendLog method from RPClient with WARN level in case of pending result status', function() { + event.result.status = STATUSES.PENDING; + formatter.contextState.context.stepId = 'stepId'; + formatter.onTestStepFinished(event); + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + expect(spySendLog).toHaveBeenCalledWith('stepId', { + time: mockedDate, + level: 'WARN', + message: "This step is marked as 'pending'", + }); + }); + + test('should set not_implemented status for step and failed for scenario in case of pending result status', function() { + event.result.status = STATUSES.PENDING; + formatter.contextState.context.stepId = 'stepId'; + formatter.onTestStepFinished(event); + + expect(formatter.contextState.context.stepStatus).toBe(STATUSES.NOT_IMPLEMENTED); + expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); + expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); + }); + + test('should call sendLog method from RPClient with ERROR level in case of undefined result status', function() { + event.result.status = STATUSES.UNDEFINED; + formatter.contextState.context.stepId = 'stepId'; + formatter.onTestStepFinished(event); + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + expect(spySendLog).toHaveBeenCalledWith('stepId', { + time: mockedDate, + level: 'ERROR', + message: 'There is no step definition found. Please verify and implement it.', + }); + }); + + test('should set not_found status for step and failed for scenario in case of undefined result status', function() { + event.result.status = STATUSES.UNDEFINED; + formatter.contextState.context.stepId = 'stepId'; + formatter.onTestStepFinished(event); + + expect(formatter.contextState.context.stepStatus).toBe(STATUSES.NOT_FOUND); + expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); + expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); + }); + + test('should call sendLog method from RPClient with ERROR level in case of ambiguous result status', function() { + event.result.status = STATUSES.AMBIGUOUS; + formatter.contextState.context.stepId = 'stepId'; + formatter.onTestStepFinished(event); + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + expect(spySendLog).toHaveBeenCalledWith('stepId', { + time: mockedDate, + level: 'ERROR', + message: 'There are more than one step implementation. Please verify and reimplement it.', + }); + }); + + test('should set not_found status for step and failed for scenario in case of ambiguous result status', function() { + event.result.status = STATUSES.AMBIGUOUS; + formatter.contextState.context.stepId = 'stepId'; + formatter.onTestStepFinished(event); + + expect(formatter.contextState.context.stepStatus).toBe(STATUSES.NOT_FOUND); + expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); + expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); + }); + + test('should set skipped status for step in case of skipped result status', function() { + event.result.status = STATUSES.SKIPPED; + formatter.onTestStepFinished(event); + + expect(formatter.contextState.context.stepStatus).toBe(STATUSES.SKIPPED); + }); + + test('should set skipped status for scenario if it was failed in case of skipped result status', function() { + event.result.status = STATUSES.SKIPPED; + formatter.contextState.context.scenarioStatus = STATUSES.FAILED; + formatter.onTestStepFinished(event); + + expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.SKIPPED); + }); + + test('should call sendLog method from RPClient with ERROR level in case of failed result status', function() { + event.result.status = STATUSES.FAILED; + event.result.exception = 255; + const stepDefinitionMock = { + uri: 'stepDefinition', + }; + + formatter.contextState.context.stepDefinition = stepDefinitionMock; + formatter.contextState.context.stepId = 'stepId'; + formatter.onTestStepFinished(event); + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + expect(spySendLog).toHaveBeenCalledWith('stepId', { + time: mockedDate, + level: 'ERROR', + message: `${stepDefinitionMock.uri}\n 255`, + }); + }); + + test('should set failed status for step in case of failed result status', function() { + event.result.status = STATUSES.FAILED; + formatter.contextState.context.stepDefinition = { + uri: 'stepDefinition', + }; + + formatter.onTestStepFinished(event); + + expect(formatter.contextState.context.stepStatus).toBe(STATUSES.FAILED); + expect(spyCountFailedScenarios).toHaveBeenCalledWith(event.testCase.sourceLocation.uri); + }); + + test('should call finishTestItem method from RPClient', function() { + event.result.status = STATUSES.PASSED; + formatter.contextState.context.stepId = 'stepId'; + + const itemFinishObj = { + status: STATUSES.PASSED, + endTime: mockedDate, + }; + + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); + + formatter.onTestStepFinished(event); + + expect(spyStartTestItem).toHaveBeenCalledWith('stepId', itemFinishObj); + }); + + test('should call finishTestItem method from RPClient with ab001 issue in case of not_found step status', function() { + event.result.status = STATUSES.UNDEFINED; + formatter.contextState.context.stepId = 'stepId'; + + const itemFinishObj = { + status: STATUSES.FAILED, + endTime: mockedDate, + issue: { + issueType: 'ab001', + comment: 'STEP DEFINITION WAS NOT FOUND', + }, + }; + + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); + + formatter.onTestStepFinished(event); + + expect(spyStartTestItem).toHaveBeenCalledWith('stepId', itemFinishObj); + }); + + test('should call finishTestItem method from RPClient with ti001 issue in case of not_implemented step status', function() { + event.result.status = STATUSES.PENDING; + formatter.contextState.context.stepId = 'stepId'; + + const itemFinishObj = { + status: STATUSES.SKIPPED, + endTime: mockedDate, + issue: { + issueType: 'ti001', + comment: 'STEP IS PENDING IMPLEMENTATION', + }, + }; + + const spyStartTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); + + formatter.onTestStepFinished(event); + + expect(spyStartTestItem).toHaveBeenCalledWith('stepId', itemFinishObj); + }); + + test('should not call finishTestItem method and stop function execution', function() { + formatter.contextState.context.stepSourceLocation = { + actionLocation: { + uri: `uri: ${AFTER_HOOK_URI_TO_SKIP}`, + }, + }; + + const spyFinishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + formatter.onTestStepFinished(event); + + expect(spyGetFileName).toHaveBeenCalledTimes(0); + expect(spyCountFailedScenarios).toHaveBeenCalledTimes(0); + expect(spySendLog).toHaveBeenCalledTimes(0); + expect(spyFinishTestItem).toHaveBeenCalledTimes(0); + }); + }); + + describe('onTestStepAttachment', () => { + const mockFileObj = { + level: 'INFO', + message: 'file', + data: 'string', + }; + const event = { + data: [ + { + item: 'text', + }, + ], + }; + + const spyGetJSON = jest.spyOn(utils, 'getJSON'); + let spyGetFileName; + + beforeEach(() => { + spyGetFileName = jest + .spyOn(formatter.contextState, 'getFileName') + .mockImplementation(() => 'fileName'); + + formatter.contextState.context.stepStatus = STATUSES.PASSED; + formatter.contextState.context.stepId = 'stepId'; + }); + + test('should call spyGetFileName to get name for file', function() { + event.media = { + type: 'text/plain', + }; + spyGetJSON.mockImplementationOnce(() => mockFileObj); + formatter.onTestStepAttachment(event); + + expect(spyGetFileName).toHaveBeenCalledTimes(1); + }); + + test('should call sendLog method from RPClient to send log with attachment for text media type', function() { + event.media = { + type: 'text/plain', + }; + spyGetJSON.mockImplementationOnce(() => mockFileObj); + + const request = { + level: mockFileObj.level, + message: mockFileObj.message, + time: mockedDate, + }; + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + formatter.onTestStepAttachment(event); + + expect(spySendLog).toHaveBeenCalledWith('stepId', request); + }); + + test('should call sendLog method from RPClient with DEBUG level log in case of invalid json data for text media type', function() { + event.media = { + type: 'text/plain', + }; + spyGetJSON.mockImplementationOnce(() => false); + + const request = { + level: 'DEBUG', + message: event.data, + time: mockedDate, + }; + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + formatter.onTestStepAttachment(event); + + expect(spySendLog).toHaveBeenCalledWith('stepId', request); + }); + + test('should call sendLog method from RPClient to send log with attachment for other media type', function() { + event.media = { + type: 'other', + }; + spyGetJSON.mockImplementationOnce(() => mockFileObj); + + const request = { + level: mockFileObj.level, + message: mockFileObj.message, + time: mockedDate, + file: { + name: mockFileObj.message, + }, + }; + const fileObj = { + name: 'fileName', + type: 'other', + content: mockFileObj.data, + }; + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + formatter.onTestStepAttachment(event); + + expect(spySendLog).toHaveBeenCalledWith('stepId', request, fileObj); + }); + + test('should call sendLog method from RPClient with default parameters in case of invalid json data for other media type', function() { + event.media = { + type: 'other', + }; + spyGetJSON.mockImplementationOnce(() => false); + + const request = { + level: 'DEBUG', + message: 'fileName', + time: mockedDate, + file: { + name: 'fileName', + }, + }; + const fileObj = { + name: 'fileName', + type: 'other', + content: event.data, + }; + + const spySendLog = jest.spyOn(formatter.reportportal, 'sendLog'); + + formatter.onTestStepAttachment(event); + + expect(spySendLog).toHaveBeenCalledWith('stepId', request, fileObj); + }); + }); + + describe('onTestCaseFinished', () => { + const itemUri = 'itemUri'; + const event = { + sourceLocation: { + uri: itemUri, + }, + result: { + status: STATUSES.PASSED, + }, + }; + + let spyFinishTestItem; + + beforeEach(() => { + spyFinishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); + + formatter.isScenarioBasedStatistics = false; + formatter.contextState.context.scenarioId = 'scenarioId'; + formatter.contextState.context.scenariosCount[itemUri] = { + done: 0, + total: 2, + }; + + formatter.documentsStorage.pickleDocuments[itemUri] = { + featureId: 'featureId', + }; + }); + + test('should call finishTestItem method from RPClient to finish test item', function() { + formatter.onTestCaseFinished(event); + + const itemFinishObj = { + status: STATUSES.PASSED, + endTime: mockedDate, + }; + + expect(spyFinishTestItem).toHaveBeenCalledWith('scenarioId', itemFinishObj); + expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); + expect(formatter.contextState.context.scenarioId).toBe(null); + }); + + test('should call finishTestItem method from RPClient and finish test item with failed status in case of result status not passed', function() { + event.result.status = STATUSES.SKIPPED; + formatter.onTestCaseFinished(event); + + const itemFinishObj = { + status: STATUSES.FAILED, + endTime: mockedDate, + }; + + expect(spyFinishTestItem).toHaveBeenCalledWith('scenarioId', itemFinishObj); + expect(formatter.contextState.context.scenarioStatus).toBe(STATUSES.FAILED); + expect(formatter.contextState.context.scenarioId).toBe(null); + }); + + test('should increase scenariosCount done in context', function() { + event.result.status = STATUSES.PASSED; + formatter.onTestCaseFinished(event); + + expect(formatter.contextState.context.scenariosCount[itemUri].done).toBe(1); + }); + + test('should call finishTestItem method from RPClient twice in case of finishing the item from suite', function() { + formatter.contextState.context.scenariosCount[itemUri].total = 1; + formatter.contextState.context.failedScenarios[itemUri] = 0; + + event.result.status = STATUSES.PASSED; + formatter.onTestCaseFinished(event); + + const finishItemObj = { + status: STATUSES.PASSED, + endTime: mockedDate, + }; + + expect(spyFinishTestItem).toHaveBeenCalledTimes(2); + expect(spyFinishTestItem).toHaveBeenNthCalledWith(2, 'featureId', finishItemObj); + }); + + test('should call finishTestItem method from RPClient second time with failed status in case of failed scenarios in suite', function() { + formatter.contextState.context.scenariosCount[itemUri].total = 1; + formatter.contextState.context.failedScenarios[itemUri] = 1; + + event.result.status = STATUSES.PASSED; + formatter.onTestCaseFinished(event); + + const finishItemObj = { + status: STATUSES.FAILED, + endTime: mockedDate, + }; + + expect(spyFinishTestItem).toHaveBeenCalledTimes(2); + expect(spyFinishTestItem).toHaveBeenNthCalledWith(2, 'featureId', finishItemObj); + }); + + test('should not call finishTestItem method and stop function execution', function() { + formatter.isScenarioBasedStatistics = false; + event.result.retried = true; + + formatter.onTestCaseFinished(event); + + expect(spyFinishTestItem).toHaveBeenCalledTimes(0); + }); + }); + + describe('onTestRunFinished', () => { + let spyGetPromiseFinishAllItems; + let spyFinishLaunch; + + beforeEach(() => { + spyGetPromiseFinishAllItems = jest.spyOn(formatter.reportportal, 'getPromiseFinishAllItems'); + spyFinishLaunch = jest.spyOn(formatter.reportportal, 'finishLaunch'); + }); + + test('should call getPromiseFinishAllItems method from RPClient & should not call finishLaunch method for empty launch id', function() { + formatter.contextState.context.launchId = null; + + formatter.onTestRunFinished(); + + expect(spyGetPromiseFinishAllItems).toHaveBeenCalledWith(null); + expect(spyFinishLaunch).toHaveBeenCalledTimes(0); + }); + + test('should call getPromiseFinishAllItems method from RPClient and should finish launch with corresponding id', async function() { + formatter.contextState.context.launchId = 'launchId'; + await formatter.onTestRunFinished(); + + expect(spyGetPromiseFinishAllItems).toHaveBeenCalledWith('launchId'); + expect(spyFinishLaunch).toHaveBeenCalledWith('launchId', { endTime: mockedDate }); + }); + + test('should call resetContext method from context after finishing launch', async function() { + formatter.contextState.context.launchId = 'launchId'; + const spyResetContext = jest.spyOn(formatter.contextState, 'resetContext'); + + await formatter.onTestRunFinished(); + + expect(spyResetContext).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/tests/data.js b/tests/data.js new file mode 100644 index 0000000..7385049 --- /dev/null +++ b/tests/data.js @@ -0,0 +1,122 @@ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const launchTempId = 'tempId'; +const uri = 'features/statuses/statuses.feature'; +const scenarioId = '1957ea93-e4de-4895-86e8-acb857b5b069'; +const feature = { + keyword: 'Feature', + name: 'statuses', + description: '', + children: [{ scenario: { id: scenarioId, name: 'scenario name' } }], +}; +const featureWithRule = { + keyword: 'Feature', + name: 'statuses', + description: '', + children: [{ rule: { children: [{ scenario: { id: scenarioId, name: 'scenario name' } }] } }], +}; +const gherkinDocument = { + uri, + feature, +}; +const gherkinDocumentWithRule = { + uri, + feature: featureWithRule, +}; +const stepId = '24cd555d-691e-4901-b24d-6af48d37b732'; +const step = { + id: stepId, + text: 'I put "true"', + argument: undefined, + astNodeIds: [], +}; +const pickleId = 'c544ae8c-f080-41be-a612-f3000ac46565'; +const pickle = { + id: pickleId, + uri: 'features/statuses/statuses.feature', + astNodeIds: ['1957ea93-e4de-4895-86e8-acb857b5b069'], + name: 'Given and expected value are equal', + steps: [step], +}; +const testCaseId = '16c505eb-433e-496a-82d8-7799f5dd99ce'; +const testStepId = '635a880a-73c7-440d-9c28-eee5d0353339'; +const testCase = { + pickleId, + id: testCaseId, + testSteps: [ + { + id: testStepId, + pickleStepId: stepId, + }, + ], +}; +const testCaseStartedId = '57e2a70f-a001-4774-97fa-1e6d5fdb293b'; +const testCaseStarted = { + testCaseId, + id: testCaseStartedId, + timestamp: { seconds: 1654094464, nanos: 288000000 }, +}; +const testStepStarted = { + testCaseStartedId, + testStepId, + timestamp: { seconds: 1655135466, nanos: 216000000 }, +}; +const testStepFinished = { + testCaseStartedId, + testStepId, + testStepResult: { + duration: { seconds: 0, nanos: 1677291 }, + status: 'FAILED', + message: 'error message', + }, + timestamp: { seconds: 1655135607, nanos: 153000000 }, +}; +const testCaseFinished = { + testCaseStartedId, + timestamp: { seconds: 1655136254, nanos: 966000000 }, + willBeRetried: false, +}; + +const featureTempId = 'featureTempId'; +const scenarioTempId = 'scenarioTempId'; +const stepTempId = 'stepTempId'; +const ruleTempId = 'ruleTempId'; + +module.exports = { + launchTempId, + gherkinDocument, + gherkinDocumentWithRule, + scenarioId, + feature, + featureWithRule, + pickleId, + uri, + pickle, + testCase, + testCaseId, + testCaseStarted, + testCaseStartedId, + testStepId, + testStepStarted, + testStepFinished, + testCaseFinished, + step, + featureTempId, + scenarioTempId, + stepTempId, + ruleTempId, +}; diff --git a/tests/mocks.js b/tests/mocks.js index 493bc84..50788e9 100644 --- a/tests/mocks.js +++ b/tests/mocks.js @@ -1,39 +1,5 @@ -// eslint-disable-next-line max-classes-per-file -const { cleanContext } = require('../modules/utils'); - const mockedDate = Date.now(); -class ContextMock { - constructor() { - this.context = cleanContext(); - - this.findStep = jest.fn().mockReturnValue({ - keyword: 'anyKeyWord', - }); - - this.countFailedScenarios = jest.fn(); - - this.getFileName = jest.fn().mockReturnValue('fileName'); - - this.resetContext = jest.fn(); - } -} - -class DocumentsStorageMock { - constructor() { - this.gherkinDocuments = {}; - this.pickleDocuments = {}; - - this.cacheDocument = jest.fn().mockReturnValue({ - keyword: 'anyKeyWord', - }); - - this.cacheAcceptedPickle = jest.fn(); - - this.isAcceptedPickleCached = jest.fn().mockReturnValue(false); - } -} - class RPClientMock { constructor(config) { this.config = config; @@ -79,8 +45,6 @@ const getDefaultConfig = () => ({ }); module.exports = { - ContextMock, - DocumentsStorageMock, RPClientMock, getDefaultConfig, mockedDate, diff --git a/tests/storage.spec.js b/tests/storage.spec.js new file mode 100644 index 0000000..4e0be02 --- /dev/null +++ b/tests/storage.spec.js @@ -0,0 +1,145 @@ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const Storage = require('../modules/storage'); +const { + launchTempId, + gherkinDocument, + feature, + pickleId, + uri, + pickle, + testCase, + testCaseId, + testCaseStarted, + testCaseStartedId, + testStepId, + step, + featureTempId, + scenarioTempId, + stepTempId, + ruleTempId, +} = require('./data'); + +describe('test Storage', () => { + let storage; + beforeEach(() => { + storage = new Storage(); + }); + + it('set/getLaunchTempId', () => { + storage.setLaunchTempId(launchTempId); + + expect(storage.getLaunchTempId()).toBe(launchTempId); + }); + + it('set/getCurrentFeatureUri', () => { + storage.setCurrentFeatureUri(uri); + + expect(storage.getCurrentFeatureUri()).toBe(uri); + }); + + it('set/getDocument', () => { + storage.setDocument(gherkinDocument); + + expect(storage.getDocument(uri)).toEqual(gherkinDocument); + }); + + it('set/getFeature', () => { + storage.setDocument(gherkinDocument); + + expect(storage.getFeature(uri)).toEqual(feature); + }); + + it('set/getPickle', () => { + storage.setPickle(pickle); + + expect(storage.getPickle(pickleId)).toEqual(pickle); + }); + + it('set/getTestCase', () => { + storage.setTestCase(testCase); + + expect(storage.getTestCase(testCaseId)).toEqual(testCase); + }); + + it('removeTestCase', () => { + storage.setTestCase(testCase); + storage.removeTestCase(testCaseId); + + expect(storage.getTestCase(testCaseId)).toBeUndefined(); + }); + + it('setTestCaseStartedId and getTestCaseId by testCaseStartedId', () => { + storage.setTestCaseStartedId(testCaseStartedId, testCaseStarted.testCaseId); + + expect(storage.getTestCaseId(testCaseStartedId)).toEqual(testCaseId); + }); + + it('removeTestCaseStartedId', () => { + storage.setTestCaseStartedId(testCaseStartedId, testCaseStarted.testCaseId); + storage.removeTestCaseStartedId(testCaseStartedId); + + expect(storage.getTestCaseId(testCaseStartedId)).toBeUndefined(); + }); + + it('set/getStep', () => { + storage.setSteps(testCaseId, { + [testStepId]: step, + }); + + expect(storage.getStep(testCaseId, testStepId)).toEqual(step); + }); + + it('removeSteps', () => { + storage.setSteps(testCaseId, { + [testStepId]: step, + }); + storage.removeSteps(testCaseId); + + expect(storage.getStep(testCaseId, testStepId)).toBeUndefined(); + }); + + it('set/getFeatureTempId', () => { + storage.setFeatureTempId(featureTempId); + + expect(storage.getFeatureTempId()).toBe(featureTempId); + }); + + it('set/getScenarioTempId', () => { + storage.setScenarioTempId(scenarioTempId); + + expect(storage.getScenarioTempId()).toBe(scenarioTempId); + }); + + it('set/getStepTempId', () => { + storage.setStepTempId(stepTempId); + + expect(storage.getStepTempId()).toBe(stepTempId); + }); + + it('set/getRuleTempId', () => { + storage.setRuleTempId(ruleTempId); + + expect(storage.getRuleTempId()).toBe(ruleTempId); + }); + + it('set/getLastScenario value', () => { + storage.setLastScenario(true); + + expect(storage.getLastScenario()).toBe(true); + }); +}); diff --git a/tests/utils.spec.js b/tests/utils.spec.js new file mode 100644 index 0000000..535d1f3 --- /dev/null +++ b/tests/utils.spec.js @@ -0,0 +1,51 @@ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const utils = require('../modules/utils'); +const { scenarioId, featureWithRule, feature } = require('./data'); + +describe('utils', () => { + it('detectLastScenario should return true', () => { + const node = featureWithRule.children[0].rule; + expect(utils.detectLastScenario(node, scenarioId)).toBe(true); + }); + + it('detectLastScenario should return false', () => { + const node = featureWithRule.children[0].rule; + node.children.push({ scenario: { id: 'abc' } }); + + expect(utils.detectLastScenario(node, scenarioId)).toBe(false); + }); + + it('findNode return node by scenario id', () => { + const expectedRes = feature.children[0]; + + expect(utils.findNode(feature, scenarioId)).toBe(expectedRes); + }); + + it('findNode return node by scenario id from feature with rule', () => { + const expectedRes = featureWithRule.children[0]; + + expect(utils.findNode(featureWithRule, scenarioId)).toBe(expectedRes); + }); + + it('findScenario return scenario obj by scenario id', () => { + const node = featureWithRule.children[0].rule; + const expectedRes = node.children[0].scenario; + + expect(utils.findScenario(node, scenarioId)).toBe(expectedRes); + }); +}); From 3db1b09e06468afeca43fca3a77a60f5b5425d4a Mon Sep 17 00:00:00 2001 From: tr1ble <43150561+tr1ble@users.noreply.github.com> Date: Tue, 9 Aug 2022 11:58:46 +0300 Subject: [PATCH 08/21] EPMRPP-78019 || Security fixes (#100) Co-authored-by: Artsiom Sadouski --- package-lock.json | 4823 +++++++++++++++++---------------------------- package.json | 2 +- 2 files changed, 1776 insertions(+), 3049 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8f0762..7473142 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,16 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -13,193 +23,208 @@ "@babel/highlight": "^7.8.3" } }, + "@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true + }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "ms": "^2.1.1" + "@babel/highlight": "^7.18.6" } }, - "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 - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } } } }, "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", + "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", "dev": true, "requires": { - "@babel/types": "^7.9.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } } } }, - "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + } } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.18.6" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, "@babel/helper-validator-identifier": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { @@ -214,9 +239,9 @@ } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz", + "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -238,12 +263,21 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", - "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "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.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -256,12 +290,12 @@ } }, "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz", - "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -274,12 +308,12 @@ } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -309,6 +343,24 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/runtime": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", @@ -318,40 +370,86 @@ } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz", + "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" + "globals": "^11.1.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "ms": "^2.1.1" + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, "globals": { @@ -359,24 +457,26 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true - }, - "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 } } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + } } }, "@bcoe/v8-coverage": { @@ -385,24 +485,15 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", + "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, @@ -465,38 +556,38 @@ } }, "@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": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.4.0.tgz", - "integrity": "sha512-CfE0erx4hdJ6t7RzAcE1wLG6ZzsHSmybvIBQDoCkDM1QaSeWL9wJMzID/2BbHHa7ll9SsbbK43HjbERbBaFX2A==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "chalk": "^3.0.0", - "jest-message-util": "^25.4.0", - "jest-util": "^25.4.0", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", "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==", + "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": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -525,9 +616,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -536,55 +627,61 @@ } }, "@jest/core": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.4.0.tgz", - "integrity": "sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", + "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/reporters": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^28.1.3", + "@jest/reporters": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.4.0", - "jest-config": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-resolve-dependencies": "^25.4.0", - "jest-runner": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", - "jest-watcher": "^25.4.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^28.1.3", + "jest-config": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-resolve-dependencies": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "jest-watcher": "^28.1.3", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -606,34 +703,31 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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 }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -642,75 +736,113 @@ } }, "@jest/environment": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.4.0.tgz", - "integrity": "sha512-KDctiak4mu7b4J6BIoN/+LUL3pscBzoUCP+EtSPd2tK9fqyDY5OF+CmkBywkFWezS9tyH5ACOQNtpjtueEDH6Q==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + } + }, + "@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", "dev": true, "requires": { - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0" + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + } + }, + "@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2" } }, "@jest/fake-timers": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.4.0.tgz", - "integrity": "sha512-lI9z+VOmVX4dPPFzyj0vm+UtaB8dCJJ852lcDnY0uCPRvZAaVGnMwBBc1wxtf+h7Vz6KszoOvKAt4QijDnHDkg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@sinonjs/fake-timers": "^9.1.2", + "@types/node": "*", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" + } + }, + "@jest/globals": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", - "lolex": "^5.0.0" + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" } }, "@jest/reporters": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.4.0.tgz", - "integrity": "sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", + "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", - "chalk": "^3.0.0", + "@jest/console": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "@types/node": "*", + "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^25.4.0", - "jest-resolve": "^25.4.0", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", - "node-notifier": "^6.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^3.1.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.1.3" + "v8-to-istanbul": "^9.0.1" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -732,16 +864,31 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -749,79 +896,102 @@ } } }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.13", "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" + "graceful-fs": "^4.2.9" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "@jest/test-result": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.4.0.tgz", - "integrity": "sha512-8BAKPaMCHlL941eyfqhWbmp3MebtzywlxzV+qtngQ3FH+RBqnoSAhNEPj4MG7d2NVUrMOVfrwuzGpVIK+QnMAA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.4.0.tgz", - "integrity": "sha512-240cI+nsM3attx2bMp9uGjjHrwrpvxxrZi8Tyqp/cfOzl98oZXVakXBgxODGyBYAy/UGXPKXLvNc2GaqItrsJg==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", "dev": true, "requires": { - "@jest/test-result": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-runner": "^25.4.0", - "jest-runtime": "^25.4.0" + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + } } }, "@jest/transform": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.4.0.tgz", - "integrity": "sha512-t1w2S6V1sk++1HHsxboWxPEuSpN8pxEvNrZN+Ud/knkROWtf8LeUmz73A4ezE8476a5AM00IZr9a8FO9x1+j3g==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.4.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", + "@babel/core": "^7.11.6", + "@jest/types": "^28.1.3", + "@jridgewell/trace-mapping": "^0.3.13", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.4.0", - "jest-regex-util": "^25.2.6", - "jest-util": "^25.4.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "write-file-atomic": "^4.0.1" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -843,6 +1013,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -850,9 +1026,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -861,31 +1037,32 @@ } }, "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, "requires": { + "@jest/schemas": "^28.1.3", "@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": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "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==", + "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": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -914,9 +1091,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -924,6 +1101,44 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@reportportal/client-javascript": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/@reportportal/client-javascript/-/client-javascript-5.0.6.tgz", @@ -951,19 +1166,34 @@ } } }, + "@sinclair/typebox": { + "version": "0.24.27", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.27.tgz", + "integrity": "sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==", + "dev": true + }, "@sinonjs/commons": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", - "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@types/babel__core": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", - "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -974,18 +1204,18 @@ } }, "@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==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "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==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -993,9 +1223,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", - "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "version": "7.17.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", + "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1007,10 +1237,19 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@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": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { @@ -1023,52 +1262,45 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, - "@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==", + "@types/node": { + "version": "18.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.3.tgz", + "integrity": "sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==", "dev": true }, "@types/prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.4.tgz", + "integrity": "sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw==", "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "@types/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", "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 - }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "acorn": { @@ -1077,40 +1309,16 @@ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, "acorn-jsx": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true - }, "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1135,11 +1343,6 @@ } } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -1150,9 +1353,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -1168,30 +1371,6 @@ "sprintf-js": "~1.0.2" } }, - "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-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, "array-includes": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", @@ -1203,12 +1382,6 @@ "is-string": "^1.0.5" } }, - "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 - }, "array.prototype.flat": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", @@ -1232,12 +1405,6 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "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 - }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -1249,12 +1416,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "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 - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1283,34 +1444,33 @@ } }, "babel-jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.4.0.tgz", - "integrity": "sha512-p+epx4K0ypmHuCnd8BapfyOwWwosNCYhedetQey1awddtfmEX0MmdxctGl956uwUmjwXR5VSS5xJcGX9DvdIog==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", + "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", "dev": true, "requires": { - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.4.0", - "chalk": "^3.0.0", + "@jest/transform": "^28.1.3", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", "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==", + "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": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1332,6 +1492,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1339,9 +1505,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -1350,53 +1516,58 @@ } }, "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==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "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", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.4.0.tgz", - "integrity": "sha512-M3a10JCtTyKevb0MjuH6tU+cP/NVQZ82QPADqI1RQYY1OphztsCeIeQmTsHmF/NS6m0E51Zl4QNsI3odXSQF5w==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", "dev": true, "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "babel-preset-current-node-syntax": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", - "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", + "version": "1.0.1", + "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": { "@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-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, "babel-preset-jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.4.0.tgz", - "integrity": "sha512-PwFiEWflHdu3JCeTr0Pb9NcHHE34qWFnPQRVPvqQITx4CsDCzs6o05923I10XvLvn9nNsRHuiVgB72wG/90ZHQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^25.4.0", - "babel-preset-current-node-syntax": "^0.1.2" + "babel-plugin-jest-hoist": "^28.1.3", + "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { @@ -1404,61 +1575,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "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" - } - } - } - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1485,27 +1601,16 @@ "fill-range": "^7.0.1" } }, - "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-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "bser": { @@ -1518,28 +1623,11 @@ } }, "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "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" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1552,14 +1640,11 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "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" - } + "caniuse-lite": { + "version": "1.0.30001374", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz", + "integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==", + "dev": true }, "caseless": { "version": "0.12.0", @@ -1577,6 +1662,12 @@ "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 + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -1584,33 +1675,16 @@ "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==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "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": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "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" - } - } - } + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true }, "cli-cursor": { "version": "3.1.0", @@ -1638,23 +1712,29 @@ "dev": true }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -1662,7 +1742,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "collect-v8-coverage": { @@ -1671,16 +1751,6 @@ "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=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1710,12 +1780,6 @@ "delayed-stream": "~1.0.0" } }, - "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", @@ -1734,24 +1798,18 @@ "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==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, - "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-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "cross-spawn": { "version": "6.0.5", @@ -1774,29 +1832,6 @@ } } }, - "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.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", - "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 - } - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1805,17 +1840,6 @@ "assert-plus": "^1.0.0" } }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -1831,16 +1855,10 @@ } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "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=", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "deep-is": { @@ -1864,47 +1882,6 @@ "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": { - "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" - } - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1917,9 +1894,9 @@ "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==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", "dev": true }, "doctrine": { @@ -1931,15 +1908,6 @@ "esutils": "^2.0.2" } }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1949,20 +1917,23 @@ "safer-buffer": "^2.1.0" } }, + "electron-to-chromium": { + "version": "1.4.211", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz", + "integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==", + "dev": true + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "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==" }, - "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": { - "once": "^1.4.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2002,25 +1973,18 @@ "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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=", "dev": true }, - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, "eslint": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", @@ -2307,144 +2271,99 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "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==", - "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": { - "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=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "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" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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": { - "ms": "2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "mimic-fn": "^2.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expect": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.4.0.tgz", - "integrity": "sha512-7BDIX99BTi12/sNGJXA9KMRcby4iAmu1xccBOhyKCyEhjcVKS3hPmHdA/4nSI9QGIOkUropKqr3vv7WMDM5lvQ==", - "dev": true, - "requires": { - "@jest/types": "^25.4.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-regex-util": "^25.2.6" - }, - "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" + "shebang-regex": "^3.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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": { - "color-name": "~1.1.4" + "isexe": "^2.0.0" } - }, - "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 } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", "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" - } - } + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -2456,80 +2375,15 @@ "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "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" - }, - "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", - "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" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -2622,15 +2476,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" }, "forever-agent": { "version": "0.6.1", @@ -2647,24 +2495,15 @@ "mime-types": "^2.1.12" } }, - "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": { - "map-cache": "^0.2.2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "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 }, @@ -2681,9 +2520,9 @@ "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==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { @@ -2692,6 +2531,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": 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 + }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", @@ -2699,18 +2544,9 @@ "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==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "getpass": { @@ -2736,9 +2572,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -2759,13 +2595,6 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "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 - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2801,79 +2630,12 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "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" - } - }, - "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": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "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-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" - } - } - } - }, - "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" - } - } - } - }, "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==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2891,9 +2653,9 @@ } }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { @@ -2922,9 +2684,9 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -3080,6 +2842,14 @@ "dev": true, "requires": { "ansi-regex": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } } }, "supports-color": { @@ -3093,38 +2863,6 @@ } } }, - "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": { - "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 - }, - "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", @@ -3137,39 +2875,13 @@ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "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-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "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 - }, - "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" - } - } + "has": "^1.0.3" } }, "is-date-object": { @@ -3178,31 +2890,6 @@ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, - "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-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", @@ -3235,15 +2922,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "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-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -3265,9 +2943,9 @@ "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==" }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { @@ -3290,19 +2968,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "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.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3315,35 +2980,27 @@ "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=" }, "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==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, @@ -3365,9 +3022,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -3376,37 +3033,20 @@ } }, "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==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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 - } } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -3414,30 +3054,30 @@ } }, "jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.4.0.tgz", - "integrity": "sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", + "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", "dev": true, "requires": { - "@jest/core": "^25.4.0", + "@jest/core": "^28.1.3", + "@jest/types": "^28.1.3", "import-local": "^3.0.2", - "jest-cli": "^25.4.0" + "jest-cli": "^28.1.3" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -3459,6 +3099,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3466,30 +3112,29 @@ "dev": true }, "jest-cli": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.4.0.tgz", - "integrity": "sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", + "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", "dev": true, "requires": { - "@jest/core": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", - "chalk": "^3.0.0", + "@jest/core": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", + "jest-config": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", "prompts": "^2.0.1", - "realpath-native": "^2.0.0", - "yargs": "^15.3.1" + "yargs": "^17.3.1" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -3498,147 +3143,156 @@ } }, "jest-changed-files": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.4.0.tgz", - "integrity": "sha512-VR/rfJsEs4BVMkwOTuStRyS630fidFVekdw/lBaBQjx9KK3VZFOZ2c0fsom2fRp8pMCrCTP6LGna00o/DXGlqA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", + "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "execa": "^3.2.0", - "throat": "^5.0.0" + "execa": "^5.0.0", + "p-limit": "^3.1.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "yocto-queue": "^0.1.0" } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + } + } + }, + "jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", + "p-limit": "^3.1.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "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": { - "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", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "color-convert": "^2.0.1" } }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "pump": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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": { - "path-key": "^3.0.0" + "color-name": "~1.1.4" } }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "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 }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "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 }, - "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==", + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "yocto-queue": "^0.1.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 - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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": { - "isexe": "^2.0.0" + "has-flag": "^4.0.0" } } } }, "jest-config": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.4.0.tgz", - "integrity": "sha512-egT9aKYxMyMSQV1aqTgam0SkI5/I2P9qrKexN5r2uuM2+68ypnc+zPGmfUxK7p1UhE7dYH9SLBS7yb+TtmT1AA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", + "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.4.0", - "@jest/types": "^25.4.0", - "babel-jest": "^25.4.0", - "chalk": "^3.0.0", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.3", + "@jest/types": "^28.1.3", + "babel-jest": "^28.1.3", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "jest-environment-jsdom": "^25.4.0", - "jest-environment-node": "^25.4.0", - "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.4.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", - "micromatch": "^4.0.2", - "pretty-format": "^25.4.0", - "realpath-native": "^2.0.0" + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^28.1.3", + "jest-environment-node": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-runner": "^28.1.3", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -3660,16 +3314,40 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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 }, + "parse-json": { + "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", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -3678,31 +3356,30 @@ } }, "jest-diff": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.4.0.tgz", - "integrity": "sha512-kklLbJVXW0y8UKOWOdYhI6TH5MG6QAxrWiBMgQaPIuhj3dNFGirKCd+/xfplBXICQ7fI+3QcqHm9p9lWu1N6ug==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", "dev": true, "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -3731,9 +3408,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -3742,41 +3419,40 @@ } }, "jest-docblock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", - "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.4.0.tgz", - "integrity": "sha512-lwRIJ8/vQU/6vq3nnSSUw1Y3nz5tkYSFIywGCZpUBd6WcRgpn8NmJoQICojbpZmsJOJNHm0BKdyuJ6Xdx+eDQQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", - "jest-util": "^25.4.0", - "pretty-format": "^25.4.0" + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", + "jest-util": "^28.1.3", + "pretty-format": "^28.1.3" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -3805,9 +3481,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -3815,110 +3491,89 @@ } } }, - "jest-environment-jsdom": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.4.0.tgz", - "integrity": "sha512-KTitVGMDrn2+pt7aZ8/yUTuS333w3pWt1Mf88vMntw7ZSBNDkRS6/4XLbFpWXYfWfp1FjcjQTOKzbK20oIehWQ==", - "dev": true, - "requires": { - "@jest/environment": "^25.4.0", - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", - "jsdom": "^15.2.1" - } - }, "jest-environment-node": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.4.0.tgz", - "integrity": "sha512-wryZ18vsxEAKFH7Z74zi/y/SyI1j6UkVZ6QsllBuT/bWlahNfQjLNwFsgh/5u7O957dYFoXj4yfma4n4X6kU9A==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", "dev": true, "requires": { - "@jest/environment": "^25.4.0", - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", - "semver": "^6.3.0" + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3", + "jest-util": "^28.1.3" } }, "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==", + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", "dev": true }, "jest-haste-map": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.4.0.tgz", - "integrity": "sha512-5EoCe1gXfGC7jmXbKzqxESrgRcaO3SzWXGCnvp9BcT0CFMyrB1Q6LIsjl9RmvmJGQgW297TCfrdgiy574Rl9HQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "dependencies": { - "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" - } + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true } } }, - "jest-jasmine2": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.4.0.tgz", - "integrity": "sha512-QccxnozujVKYNEhMQ1vREiz859fPN/XklOzfQjm2j9IGytAkUbSwjFRBtQbHaNZ88cItMpw02JnHGsIdfdpwxQ==", + "jest-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.4.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", - "chalk": "^3.0.0", - "co": "^4.6.0", - "expect": "^25.4.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^25.4.0", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "pretty-format": "^25.4.0", - "throat": "^5.0.0" + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -3947,9 +3602,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -3957,46 +3612,90 @@ } } }, - "jest-leak-detector": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.4.0.tgz", - "integrity": "sha512-7Y6Bqfv2xWsB+7w44dvZuLs5SQ//fzhETgOGG7Gq3TTGFdYvAgXGwV8z159RFZ6fXiCPm/szQ90CyfVos9JIFQ==", - "dev": true, - "requires": { - "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" - } - }, - "jest-matcher-utils": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.4.0.tgz", - "integrity": "sha512-yPMdtj7YDgXhnGbc66bowk8AkQ0YwClbbwk3Kzhn5GVDrciiCr27U4NJRbrqXbTdtxjImONITg2LiRIw650k5A==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "jest-diff": "^25.4.0", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "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==", + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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" + } + } } }, "color-convert": { @@ -4014,52 +3713,72 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, - "jest-message-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.4.0.tgz", - "integrity": "sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ==", + "jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.4.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" + "@jest/types": "^28.1.3", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true + }, + "jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.3", + "jest-validate": "^28.1.3", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "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==", + "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": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4081,16 +3800,33 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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 }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4098,57 +3834,58 @@ } } }, - "jest-mock": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.4.0.tgz", - "integrity": "sha512-MdazSfcYAUjJjuVTTnusLPzE0pE4VXpOUzWdj8sbM+q6abUjm3bATVPXFqTXrxSieR8ocpvQ9v/QaQCftioQFg==", + "jest-resolve-dependencies": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", + "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", "dev": true, "requires": { - "@jest/types": "^25.4.0" + "jest-regex-util": "^28.0.2", + "jest-snapshot": "^28.1.3" } }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", - "dev": true - }, - "jest-regex-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", - "dev": true - }, - "jest-resolve": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.4.0.tgz", - "integrity": "sha512-wOsKqVDFWUiv8BtLMCC6uAJ/pHZkfFgoBTgPtmYlsprAjkxrr2U++ZnB3l5ykBMd2O24lXvf30SMAjJIW6k2aA==", - "dev": true, - "requires": { - "@jest/types": "^25.4.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "read-pkg-up": "^7.0.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1", - "slash": "^3.0.0" + "jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/environment": "^28.1.3", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "graceful-fs": "^4.2.9", + "jest-docblock": "^28.1.1", + "jest-environment-node": "^28.1.3", + "jest-haste-map": "^28.1.3", + "jest-leak-detector": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-resolve": "^28.1.3", + "jest-runtime": "^28.1.3", + "jest-util": "^28.1.3", + "jest-watcher": "^28.1.3", + "jest-worker": "^28.1.3", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4170,15 +3907,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -4186,182 +3919,19 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "p-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": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.4.0.tgz", - "integrity": "sha512-A0eoZXx6kLiuG1Ui7wITQPl04HwjLErKIJTt8GR3c7UoDAtzW84JtCrgrJ6Tkw6c6MwHEyAaLk7dEPml5pf48A==", - "dev": true, - "requires": { - "@jest/types": "^25.4.0", - "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.4.0" - } - }, - "jest-runner": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.4.0.tgz", - "integrity": "sha512-wWQSbVgj2e/1chFdMRKZdvlmA6p1IPujhpLT7TKNtCSl1B0PGBGvJjCaiBal/twaU2yfk8VKezHWexM8IliBfA==", - "dev": true, - "requires": { - "@jest/console": "^25.4.0", - "@jest/environment": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", - "chalk": "^3.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.4.0", - "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.4.0", - "jest-jasmine2": "^25.4.0", - "jest-leak-detector": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-resolve": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", - "source-map-support": "^0.5.6", - "throat": "^5.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": "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "yocto-queue": "^0.1.0" } }, - "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.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4370,52 +3940,48 @@ } }, "jest-runtime": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.4.0.tgz", - "integrity": "sha512-lgNJlCDULtXu9FumnwCyWlOub8iytijwsPNa30BKrSNtgoT6NUMXOPrZvsH06U6v0wgD/Igwz13nKA2wEKU2VA==", - "dev": true, - "requires": { - "@jest/console": "^25.4.0", - "@jest/environment": "^25.4.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/fake-timers": "^28.1.3", + "@jest/globals": "^28.1.3", + "@jest/source-map": "^28.1.2", + "@jest/test-result": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", + "execa": "^5.0.0", "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", - "realpath-native": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-mock": "^28.1.3", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.3", + "jest-snapshot": "^28.1.3", + "jest-util": "^28.1.3", "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" + "strip-bom": "^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==", + "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": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4437,6 +4003,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4450,9 +4022,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4460,48 +4032,50 @@ } } }, - "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true - }, "jest-snapshot": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.4.0.tgz", - "integrity": "sha512-J4CJ0X2SaGheYRZdLz9CRHn9jUknVmlks4UBeu270hPAvdsauFXOhx9SQP2JtRzhnR3cvro/9N9KP83/uvFfRg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.4.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.4.0", - "jest-diff": "^25.4.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-resolve": "^25.4.0", - "make-dir": "^3.0.0", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", "natural-compare": "^1.4.0", - "pretty-format": "^25.4.0", - "semver": "^6.3.0" + "pretty-format": "^28.1.3", + "semver": "^7.3.5" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4523,16 +4097,31 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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 }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4541,31 +4130,32 @@ } }, "jest-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.4.0.tgz", - "integrity": "sha512-WSZD59sBtAUjLv1hMeKbNZXmMcrLRWcYqpO8Dz8b4CeCTZpfNQw2q9uwrYAD+BbJoLJlu4ezVPwtAmM/9/SlZA==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "make-dir": "^3.0.0" + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4587,6 +4177,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4594,9 +4190,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4605,33 +4201,38 @@ } }, "jest-validate": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.4.0.tgz", - "integrity": "sha512-hvjmes/EFVJSoeP1yOl8qR8mAtMR3ToBkZeXrD/ZS9VxRyWDqQ/E1C5ucMTeSmEOGLipvdlyipiGbHJ+R1MQ0g==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", + "@jest/types": "^28.1.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^28.0.2", "leven": "^3.1.0", - "pretty-format": "^25.4.0" + "pretty-format": "^28.1.3" }, "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" } }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4660,9 +4261,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4671,33 +4272,34 @@ } }, "jest-watcher": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.4.0.tgz", - "integrity": "sha512-36IUfOSRELsKLB7k25j/wutx0aVuHFN6wO94gPNjQtQqFPa2rkOymmx9rM5EzbF3XBZZ2oqD9xbRVoYa2w86gw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", "dev": true, "requires": { - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.4.0", - "string-length": "^3.1.0" + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" }, "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" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4726,9 +4328,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4737,13 +4339,14 @@ } }, "jest-worker": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", - "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -4753,9 +4356,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -4784,69 +4387,22 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "json-parse-even-better-errors": { + "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": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -4865,31 +4421,22 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -4913,9 +4460,9 @@ } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "load-json-file": { @@ -4949,24 +4496,18 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "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": { - "@sinonjs/commons": "^1.7.0" + "yallist": "^4.0.0" } }, "make-dir": { @@ -4979,27 +4520,12 @@ } }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "object-visit": "^1.0.0" + "tmpl": "1.0.5" } }, "merge-stream": { @@ -5009,13 +4535,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime-db": { @@ -5046,36 +4572,15 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "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" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -5093,25 +4598,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5127,29 +4613,15 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, - "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", - "shellwords": "^0.1.1", - "which": "^1.3.1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -5177,20 +4649,22 @@ "dev": true }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "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": "^2.0.0" + "path-key": "^3.0.0" + }, + "dependencies": { + "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 + } } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -5201,43 +4675,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "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" - } - }, - "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 - }, - "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" - } - } - } - }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -5250,15 +4687,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -5283,15 +4711,6 @@ "has": "^1.0.3" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "object.values": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", @@ -5341,18 +4760,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "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==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -5395,18 +4802,6 @@ "error-ex": "^1.2.0" } }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -5425,9 +4820,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -5452,20 +4847,23 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true }, "pkg-dir": { "version": "2.0.0", @@ -5476,18 +4874,6 @@ "find-up": "^2.1.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -5510,40 +4896,27 @@ } }, "pretty-format": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.4.0.tgz", - "integrity": "sha512-PI/2dpGjXK5HyXexLPZU/jw5T9Q6S1YVXxxVxco+LIqzUFHXIbKZKdUVt7GcX7QUCr31+3fzhi4gN4/wUYPVxQ==", + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.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" - } + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, - "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==", + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } @@ -5555,13 +4928,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.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.4" + "sisteransi": "^1.0.5" } }, "psl": { @@ -5569,16 +4942,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5590,9 +4953,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "read-pkg": { @@ -5616,51 +4979,17 @@ "read-pkg": "^2.0.0" } }, - "realpath-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", - "dev": true - }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -5688,36 +5017,10 @@ "uuid": "^3.3.2" } }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "resolve": { @@ -5752,10 +5055,10 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", "dev": true }, "restore-cursor": { @@ -5768,17 +5071,14 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } }, "run-async": { "version": "2.4.0", @@ -5803,211 +5103,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "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" - }, - "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" - } - } - } - }, - "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", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.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" - } - } - } - }, - "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-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" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "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": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "dev": true, - "requires": { - "xmlchars": "^2.1.1" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "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" - } - } - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -6023,13 +5129,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -6040,158 +5139,30 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^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" - } - }, - "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" - } - } - } + "dev": true }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true - }, - "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" - } } } }, @@ -6201,35 +5172,16 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.18.tgz", - "integrity": "sha512-9luZr/BZ2QeU6tO2uG8N2aZpVSli4TSAOAqFOyTO51AJcD9P99c0K1h6dD6r6qo5dyT44BR5exweOaLLeldTkQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -6262,15 +5214,6 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6294,46 +5237,47 @@ } }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "escape-string-regexp": "^2.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" - } + "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 } } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "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": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "string-width": { @@ -6349,10 +5293,7 @@ "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" } } }, @@ -6408,9 +5349,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true } } @@ -6421,12 +5362,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -6449,9 +5384,9 @@ } }, "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -6465,9 +5400,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -6475,10 +5410,10 @@ } } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, "table": { @@ -6545,12 +5480,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -6567,55 +5496,17 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6634,15 +5525,6 @@ "punycode": "^2.1.1" } }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -6683,27 +5565,6 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "uniqid": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz", @@ -6719,66 +5580,24 @@ "uuid": "^3.0.0" } }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "escalade": "^3.1.1", + "picocolors": "^1.0.0" } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -6791,22 +5610,14 @@ "dev": true }, "v8-to-istanbul": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", - "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "convert-source-map": "^1.6.0" } }, "validate-npm-package-license": { @@ -6822,72 +5633,20 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "makeerror": "1.0.12" } }, "which": { @@ -6899,12 +5658,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -6912,9 +5665,9 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -6922,13 +5675,18 @@ "strip-ansi": "^6.0.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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" } }, @@ -6948,12 +5706,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -6973,120 +5731,89 @@ } }, "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", + "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" + }, + "dependencies": { + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + } } }, - "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "p-try": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "ansi-regex": "^5.0.1" } - }, - "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 - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true } } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.0.tgz", + "integrity": "sha512-xzm2t63xTV/f7+bGMSRzLhUNk1ajv/tDoaD5OeGyC3cFo2fl7My9Z4hS3q2VdQ7JaLvTxErO8Jp5pRIFGMD/zg==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index f5720c6..11c6dcf 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "eslint-plugin-node": "^5.1.1", "eslint-plugin-prettier": "^3.1.2", "eslint-plugin-promise": "^3.5.0", - "jest": "^25.4.0", + "jest": "^28.1.3", "prettier": "^1.19.1" }, "peerDependencies": { From d59af049c4f7b1739ed2171d79c966032fd7b1af Mon Sep 17 00:00:00 2001 From: Ilya Date: Fri, 14 Oct 2022 12:42:05 +0300 Subject: [PATCH 09/21] EPMRPP-80089 || Logs and attachments reporting support for Cucumber 7+ (#103) * EPMRPP-80089 || Logs and attachments reporting support for Cucumber 7+ * EPMRPP-80089 || Update TODO comment --- modules/context.js | 1 - modules/cucumber-reportportal-formatter.js | 45 ++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/modules/context.js b/modules/context.js index aa6c64e..0bf3fbc 100644 --- a/modules/context.js +++ b/modules/context.js @@ -15,7 +15,6 @@ */ const { STATUSES } = require('./constants'); -const itemFinders = require('./itemFinders'); class Context { constructor() { diff --git a/modules/cucumber-reportportal-formatter.js b/modules/cucumber-reportportal-formatter.js index e657400..5b609b9 100644 --- a/modules/cucumber-reportportal-formatter.js +++ b/modules/cucumber-reportportal-formatter.js @@ -281,7 +281,52 @@ const createRPFormatterClass = (config) => { } break; } + case 'text/plain': { + const request = { + time: this.reportportal.helpers.now(), + }; + let tempStepId = this.storage.getStepTempId(); + + if (dataObj) { + request.level = dataObj.level; + request.message = dataObj.message; + if (dataObj.entity === RP_ENTITY_LAUNCH) { + tempStepId = this.storage.getLaunchTempId(); + } + } else { + request.level = LOG_LEVELS.DEBUG; + request.message = data.body; + } + this.reportportal.sendLog(tempStepId, request); + break; + } default: { + const fileName = 'file'; // TODO: generate human valuable file name here if possible + const request = { + time: this.reportportal.helpers.now(), + level: + this.context.stepStatus === STATUSES.PASSED ? LOG_LEVELS.DEBUG : LOG_LEVELS.ERROR, + message: fileName, + file: { + name: fileName, + }, + }; + let tempStepId = this.storage.getStepTempId(); + + if (dataObj) { + request.level = dataObj.level; + request.message = dataObj.message; + request.file.name = dataObj.message; + if (dataObj.entity === RP_ENTITY_LAUNCH) { + tempStepId = this.storage.getLaunchTempId(); + } + } + const fileObj = { + name: fileName, + type: data.mediaType, + content: (dataObj && dataObj.data) || data.body, + }; + this.reportportal.sendLog(tempStepId, request, fileObj); break; } } From b0fcffba9c557d7d3cfa33d5f2cd088ea516cd2e Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Wed, 26 Oct 2022 16:19:34 +0300 Subject: [PATCH 10/21] EPMRPP-80220 || split agent implementation by supported cucumber versions (#104) * EPMRPP-80220 || split agent versions * EPMRPP-80220 || tests * EPMRPP-80220 || code review fixes - 1 --- modules/api/current.js | 368 +++++++ modules/api/deprecated.js | 551 +++++++++++ modules/cucumber-reportportal-formatter.js | 934 +----------------- modules/utils.js | 9 + tests/cucumber-reportportal-formatter.spec.js | 4 +- tests/utils.spec.js | 14 + 6 files changed, 962 insertions(+), 918 deletions(-) create mode 100644 modules/api/current.js create mode 100644 modules/api/deprecated.js diff --git a/modules/api/current.js b/modules/api/current.js new file mode 100644 index 0000000..61cae4b --- /dev/null +++ b/modules/api/current.js @@ -0,0 +1,368 @@ +const pjson = require('../../package.json'); +const utils = require('../utils'); +const { + RP_EVENTS, + RP_ENTITY_LAUNCH, + LOG_LEVELS, + STATUSES, + CUCUMBER_MESSAGES, +} = require('../constants'); +const Storage = require('../storage'); + +module.exports = { + init() { + this.storage = new Storage(); + this.customLaunchStatus = null; + + this.options.eventBroadcaster.on('envelope', (event) => { + const [key] = Object.keys(event); + switch (key) { + case CUCUMBER_MESSAGES.GHERKIN_DOCUMENT: + return this.onGherkinDocumentEvent(event[key]); + case CUCUMBER_MESSAGES.PICKLE: + return this.onPickleEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_RUN_STARTED: + return this.onTestRunStartedEvent(); + case CUCUMBER_MESSAGES.TEST_CASE: + return this.onTestCaseEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_CASE_STARTED: + return this.onTestCaseStartedEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_STEP_STARTED: + return this.onTestStepStartedEvent(event[key]); + case CUCUMBER_MESSAGES.ATTACHMENT: + return this.onTestStepAttachmentEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_STEP_FINISHED: + return this.onTestStepFinishedEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_CASE_FINISHED: + return this.onTestCaseFinishedEvent(event[key]); + case CUCUMBER_MESSAGES.TEST_RUN_FINISHED: + return this.onTestRunFinishedEvent(event[key]); + default: + return null; + } + }); + }, + onGherkinDocumentEvent(data) { + this.storage.setDocument(data); + }, + onPickleEvent(data) { + this.storage.setPickle(data); + }, + onTestRunStartedEvent() { + const startLaunchData = { + name: this.config.launch, + startTime: this.reportportal.helpers.now(), + description: this.config.description || '', + attributes: [ + ...this.attributesConf, + { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, + ], + rerun: this.isRerun, + rerunOf: this.rerunOf, + }; + const { tempId } = this.reportportal.startLaunch(startLaunchData); + this.storage.setLaunchTempId(tempId); + }, + onTestCaseEvent(data) { + const { id: testCaseId, pickleId, testSteps } = data; + this.storage.setTestCase(data); + + // prepare steps + const stepsMap = {}; + testSteps.forEach((step) => { + const { pickleStepId, id } = step; + // skip hookId + if (pickleStepId) { + const { steps } = this.storage.getPickle(pickleId); + stepsMap[id] = steps.find((item) => item.id === pickleStepId); + } + }); + this.storage.setSteps(testCaseId, stepsMap); + }, + onTestCaseStartedEvent(data) { + const { id, testCaseId } = data; + this.storage.setTestCaseStartedId(id, testCaseId); + const { pickleId } = this.storage.getTestCase(testCaseId); + const { + uri: pickleFeatureUri, + astNodeIds: [scenarioId], + } = this.storage.getPickle(pickleId); + const currentFeatureUri = this.storage.getCurrentFeatureUri(); + const feature = this.storage.getFeature(pickleFeatureUri); + const launchTempId = this.storage.getLaunchTempId(); + + // start FEATURE if no currentFeatureUri or new feature + // else finish old one + if (!currentFeatureUri && currentFeatureUri !== pickleFeatureUri) { + this.storage.setCurrentFeatureUri(pickleFeatureUri); + const suiteData = { + name: feature.name, + startTime: this.reportportal.helpers.now(), + type: 'SUITE', + description: (feature.description || '').trim(), + attributes: utils.createAttributes(feature.tags), + }; + const { tempId } = this.reportportal.startTestItem(suiteData, launchTempId, ''); + this.storage.setFeatureTempId(tempId); + } else { + const tempFeatureId = this.storage.getFeatureTempId(); + this.reportportal.finishTestItem(tempFeatureId, {}); + } + + // current feature node rule || scenario + const currentNode = utils.findNode(feature, scenarioId); + + let scenario; + let ruleTempId = this.storage.getRuleTempId(); + if (currentNode.rule && !ruleTempId) { + // start RULE + const { rule } = currentNode; + const testData = { + startTime: this.reportportal.helpers.now(), + type: 'SUITE', + name: rule.name, + description: rule.description, + attributes: utils.createAttributes(rule.tags), + }; + const parentId = this.storage.getFeatureTempId(); + const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); + ruleTempId = tempId; + this.storage.setRuleTempId(tempId); + + scenario = utils.findScenario(rule, scenarioId); + const isLastScenario = utils.detectLastScenario(currentNode.rule, scenarioId); + this.storage.setLastScenario(isLastScenario); + } else if (currentNode.rule && ruleTempId) { + scenario = utils.findScenario(currentNode.rule, scenarioId); + const isLastScenario = utils.detectLastScenario(currentNode.rule, scenarioId); + this.storage.setLastScenario(isLastScenario); + } else { + scenario = currentNode.scenario; + } + + const testData = { + startTime: this.reportportal.helpers.now(), + type: 'TEST', + name: scenario.name, + description: scenario.description, + attributes: utils.createAttributes(scenario.tags), + }; + + const parentId = ruleTempId || this.storage.getFeatureTempId(); + const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); + this.storage.setScenarioTempId(tempId); + }, + onTestStepStartedEvent(data) { + const { testCaseStartedId, testStepId } = data; + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const step = this.storage.getStep(testCaseId, testStepId); + + // start step + if (step) { + const stepData = { + name: step.text, + startTime: this.reportportal.helpers.now(), + type: 'STEP', + }; + const launchTempId = this.storage.getLaunchTempId(); + const parentId = this.storage.getScenarioTempId(); + const { tempId } = this.reportportal.startTestItem(stepData, launchTempId, parentId); + this.storage.setStepTempId(tempId); + } + }, + onTestStepAttachmentEvent(data) { + if (data) { + const { testStepId, testCaseStartedId } = data; + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const step = this.storage.getStep(testCaseId, testStepId); + if (!step) return; + const dataObj = utils.getJSON(data.body); + + switch (data.mediaType) { + case RP_EVENTS.TEST_CASE_ID: { + this.storage.updateStep(testCaseId, testStepId, dataObj); + break; + } + case RP_EVENTS.ATTRIBUTES: { + const savedAttributes = step.attributes || []; + this.storage.updateStep(testCaseId, testStepId, { + attributes: savedAttributes.concat(dataObj.attributes), + }); + break; + } + case RP_EVENTS.DESCRIPTION: { + const savedDescription = step.description || ''; + this.storage.updateStep(testCaseId, testStepId, { + description: savedDescription + ? `${savedDescription}
${dataObj.description}` + : dataObj.description, + }); + break; + } + case RP_EVENTS.STATUS: { + if (dataObj.entity !== RP_ENTITY_LAUNCH) { + this.storage.updateStep(testCaseId, testStepId, dataObj); + } else { + this.customLaunchStatus = dataObj.status; + } + break; + } + case 'text/plain': { + const request = { + time: this.reportportal.helpers.now(), + }; + let tempStepId = this.storage.getStepTempId(); + + if (dataObj) { + request.level = dataObj.level; + request.message = dataObj.message; + if (dataObj.entity === RP_ENTITY_LAUNCH) { + tempStepId = this.storage.getLaunchTempId(); + } + } else { + request.level = LOG_LEVELS.DEBUG; + request.message = data.body; + } + this.reportportal.sendLog(tempStepId, request); + break; + } + default: { + const fileName = 'file'; // TODO: generate human valuable file name here if possible + const request = { + time: this.reportportal.helpers.now(), + level: LOG_LEVELS.INFO, + message: fileName, + file: { + name: fileName, + }, + }; + let tempStepId = this.storage.getStepTempId(); + + if (dataObj) { + if (dataObj.level) { + request.level = dataObj.level; + } + request.message = dataObj.message; + request.file.name = dataObj.message; + if (dataObj.entity === RP_ENTITY_LAUNCH) { + tempStepId = this.storage.getLaunchTempId(); + } + } + const fileObj = { + name: fileName, + type: data.mediaType, + content: (dataObj && dataObj.data) || data.body, + }; + this.reportportal.sendLog(tempStepId, request, fileObj); + break; + } + } + } + }, + onTestStepFinishedEvent(data) { + const { testCaseStartedId, testStepId, testStepResult } = data; + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const step = this.storage.getStep(testCaseId, testStepId); + if (!step) return; + const tempStepId = this.storage.getStepTempId(); + let status; + + switch (testStepResult.status.toLowerCase()) { + case STATUSES.PASSED: { + status = STATUSES.PASSED; + break; + } + case STATUSES.PENDING: { + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'WARN', + message: "This step is marked as 'pending'", + }); + status = STATUSES.FAILED; + break; + } + case STATUSES.UNDEFINED: { + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: 'There is no step definition found. Please verify and implement it.', + }); + status = STATUSES.FAILED; + break; + } + case STATUSES.AMBIGUOUS: { + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: 'There are more than one step implementation. Please verify and reimplement it.', + }); + status = STATUSES.FAILED; + break; + } + case STATUSES.SKIPPED: { + status = STATUSES.SKIPPED; + break; + } + case STATUSES.FAILED: { + status = STATUSES.FAILED; + this.reportportal.sendLog(tempStepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: testStepResult.message, + }); + break; + } + default: + break; + } + + if (step) { + const { attributes, description, testCaseId: customTestCaseId } = step; + status = step.status || status || testStepResult.status; + this.reportportal.finishTestItem(tempStepId, { + ...(status && { status }), + ...(attributes && { attributes }), + ...(description && { description }), + ...(customTestCaseId && { testCaseId: customTestCaseId }), + endTime: this.reportportal.helpers.now(), + }); + } + + this.storage.setStepTempId(null); + }, + onTestCaseFinishedEvent(data) { + const { testCaseStartedId } = data; + const scenarioTempId = this.storage.getScenarioTempId(); + this.reportportal.finishTestItem(scenarioTempId, {}); + + // finish RULE if it's exist and if it's last scenario + const isLastScenario = this.storage.getLastScenario(); + const ruleTempId = this.storage.getRuleTempId(); + if (ruleTempId && isLastScenario) { + this.reportportal.finishTestItem(ruleTempId, {}); + this.storage.setRuleTempId(null); + this.storage.setLastScenario(false); + } + + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + this.storage.removeTestCaseStartedId(testCaseStartedId); + this.storage.removeSteps(testCaseId); + this.storage.removeTestCase(testCaseId); + this.storage.setScenarioTempId(null); + }, + onTestRunFinishedEvent() { + const featureTempId = this.storage.getFeatureTempId(); + this.reportportal.finishTestItem(featureTempId, {}); + + const launchId = this.storage.getLaunchTempId(); + this.reportportal.getPromiseFinishAllItems(launchId).then(() => { + this.reportportal.finishLaunch(launchId, { + ...(this.customLaunchStatus && { status: this.customLaunchStatus }), + }); + this.storage.setLaunchTempId(null); + this.storage.setCurrentFeatureUri(null); + this.storage.setFeatureTempId(null); + this.customLaunchStatus = null; + }); + }, +}; diff --git a/modules/api/deprecated.js b/modules/api/deprecated.js new file mode 100644 index 0000000..5b7da83 --- /dev/null +++ b/modules/api/deprecated.js @@ -0,0 +1,551 @@ +const Table = require('cli-table3'); +const utils = require('../utils'); +const itemFinders = require('../itemFinders'); +const { + STATUSES, + AFTER_HOOK_URI_TO_SKIP, + TABLE_CONFIG, + RP_EVENTS, + RP_ENTITY_LAUNCH, + LOG_LEVELS, + CUCUMBER_EVENTS, +} = require('../constants'); +const Context = require('../context'); +const DocumentStorage = require('../documents-storage'); +const pjson = require('../../package.json'); + +module.exports = { + init() { + this.context = new Context(); + this.documentsStorage = new DocumentStorage(); + + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.GHERKIN_DOCUMENT, (event) => + this.onGherkinDocument(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.PICKLE_ACCEPTED, (event) => + this.onPickleAccepted(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.TEST_CASE_PREPARED, (event) => + this.onTestCasePrepared(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.TEST_CASE_STARTED, (event) => + this.onTestCaseStarted(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.TEST_STEP_STARTED, (event) => + this.onTestStepStarted(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.TEST_STEP_FINISHED, (event) => + this.onTestStepFinished(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.TEST_STEP_ATTACHMENT, (event) => + this.onTestStepAttachment(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.TEST_CASE_FINISHED, (event) => + this.onTestCaseFinished(event), + ); + this.options.eventBroadcaster.on(CUCUMBER_EVENTS.TEST_RUN_FINISHED, (event) => + this.onTestRunFinished(event), + ); + }, + onGherkinDocument(event) { + this.documentsStorage.cacheDocument(event); + + // BeforeFeatures + if (!this.context.launchId) { + const launch = this.reportportal.startLaunch({ + name: this.config.launch, + startTime: this.reportportal.helpers.now(), + description: !this.config.description ? '' : this.config.description, + attributes: [ + ...this.attributesConf, + { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, + ], + rerun: this.isRerun, + rerunOf: this.rerunOf, + }); + this.context.launchId = launch.tempId; + } + }, + onPickleAccepted(event) { + const featureUri = utils.getUri(event.uri); + if (!this.documentsStorage.isFeatureDataCached(featureUri)) { + this.documentsStorage.createCachedFeature(featureUri); + + const feature = this.documentsStorage.featureData[featureUri]; + const featureDocument = itemFinders.findFeature( + this.documentsStorage.gherkinDocuments, + event, + ); + feature.description = featureDocument.description || featureUri; + const { name } = featureDocument; + feature.name = name; + feature.itemAttributes = utils.createAttributes(featureDocument.tags); + } + }, + onTestCasePrepared(event) { + const featureUri = utils.getUri(event.sourceLocation.uri); + const feature = this.documentsStorage.featureData[featureUri]; + // If this is the first scenario in the feature, start the feature in RP + if (!feature.featureId) { + feature.featureId = this.reportportal.startTestItem( + { + name: feature.name, + startTime: this.reportportal.helpers.now(), + type: this.isScenarioBasedStatistics ? 'TEST' : 'SUITE', + codeRef: utils.formatCodeRef(featureUri, feature.name), + description: feature.description, + attributes: feature.itemAttributes, + }, + this.context.launchId, + ).tempId; + } + // If this is the first feature in the run, set the currentFeatureUri + if (!this.context.currentFeatureUri) { + this.context.currentFeatureUri = featureUri; + } + // If this is a new feature, finish the previous feature in RP. + // does not work for the final feature in the run. that is finished in onTestRunFinished + if (this.context.currentFeatureUri !== featureUri) { + const previousFeature = this.documentsStorage.featureData[this.context.currentFeatureUri]; + // If this is a new feature, finish the previous feature + this.reportportal.finishTestItem(previousFeature.featureId, { + status: previousFeature.featureStatus, + endTime: this.reportportal.helpers.now(), + }); + // Now that the previous feature is finished, assign the new current feature + this.context.currentFeatureUri = featureUri; + } + this.context.stepDefinitions = event; + let hookType = 'Before'; + this.context.stepDefinitions.steps.forEach((step) => { + if (step.sourceLocation) { + hookType = 'After'; + return; + } + // eslint-disable-next-line no-param-reassign + step.hookType = hookType; + }); + }, + onTestCaseStarted(event) { + const featureDocument = itemFinders.findFeature( + this.documentsStorage.gherkinDocuments, + event.sourceLocation, + ); + this.context.scenario = itemFinders.findScenario( + this.documentsStorage.gherkinDocuments, + event.sourceLocation, + ); + this.context.scenarioStatus = STATUSES.STARTED; + this.context.background = itemFinders.findBackground(featureDocument); + const featureTags = featureDocument.tags; + const keyword = this.context.scenario.keyword + ? this.context.scenario.keyword + : this.context.scenario.type; + let name = [keyword, this.context.scenario.name].join(': '); + const eventTags = this.context.scenario.tags + ? this.context.scenario.tags.filter( + (tag) => !featureTags.find(utils.createTagComparator(tag)), + ) + : []; + const itemAttributes = utils.createAttributes(eventTags); + const description = + this.context.scenario.description || + [utils.getUri(event.sourceLocation.uri), event.sourceLocation.line].join(':'); + const { featureId } = this.documentsStorage.featureData[event.sourceLocation.uri]; + + if (this.context.lastScenarioDescription !== name) { + this.context.lastScenarioDescription = name; + this.context.outlineRow = 0; + } else if (event.attemptNumber < 2) { + this.context.outlineRow += 1; + name += ` [${this.context.outlineRow}]`; + } + + // BeforeScenario + if (this.isScenarioBasedStatistics || event.attemptNumber < 2) { + this.context.scenarioId = this.reportportal.startTestItem( + { + name, + startTime: this.reportportal.helpers.now(), + type: this.isScenarioBasedStatistics ? 'STEP' : 'TEST', + description, + codeRef: utils.formatCodeRef(event.sourceLocation.uri, name), + parameters: this.context.scenario.parameters, + attributes: itemAttributes, + retry: this.isScenarioBasedStatistics && event.attemptNumber > 1, + }, + this.context.launchId, + featureId, + ).tempId; + } + }, + onTestStepStarted(event) { + this.context.stepStatus = STATUSES.FAILED; + this.context.stepId = null; + + this.context.stepSourceLocation = this.context.stepDefinitions.steps[event.index]; + + // skip After Hook added by protractor-cucumber-framework + if ( + !this.context.stepSourceLocation.sourceLocation && + this.context.stepSourceLocation.actionLocation.uri.includes(AFTER_HOOK_URI_TO_SKIP) + ) + return; + + this.context.step = this.context.findStep(event); + this.context.stepDefinition = itemFinders.findStepDefinition(this.context, event); + + let description; + let name = this.context.step.text + ? `${this.context.step.keyword} ${this.context.step.text}` + : this.context.step.keyword; + + if (this.context.step.argument) { + let stepArguments; + if (this.context.step.argument.content) { + stepArguments = `"""\n${this.context.step.argument.content}\n"""`; + } + + if (this.context.step.argument.rows) { + const rows = this.context.step.argument.rows.map((row) => + row.cells.map((cell) => { + // Added an if statement to only replace step parameters if this is a Scenario Outline + let tempStepValue = cell.value; + if (this.context.scenario.parameters) { + this.context.scenario.parameters.forEach((parameter) => { + if (cell.value.includes(`<${parameter.key}>`)) { + tempStepValue = utils.replaceParameter( + cell.value, + parameter.key, + parameter.value, + ); + } + }); + } + return tempStepValue; + }), + ); + const datatable = new Table(TABLE_CONFIG); + datatable.push(...rows); + stepArguments = datatable.toString(); + } + if (this.isScenarioBasedStatistics) { + name += `\n${stepArguments}`; + } else { + description = stepArguments; + } + } + + let type = 'STEP'; + let isHook = false; + if (this.context.step.keyword === 'Before') { + type = 'BEFORE_TEST'; + isHook = true; + } else if (this.context.step.keyword === 'After') { + type = 'AFTER_TEST'; + isHook = true; + } + + // hooks are described in cucumber's library core + const codeRef = + this.context.stepDefinition && !isHook + ? utils.formatCodeRef(this.context.stepDefinition.uri, name) + : undefined; + + this.context.stepId = this.reportportal.startTestItem( + { + name, + description, + startTime: this.reportportal.helpers.now(), + type, + codeRef, + parameters: this.context.step.parameters, + hasStats: !this.isScenarioBasedStatistics, + retry: !this.isScenarioBasedStatistics && event.testCase.attemptNumber > 1, + }, + this.context.launchId, + this.context.scenarioId, + ).tempId; + }, + onTestStepFinished(event) { + // skip After Hook added by protractor-cucumber-framework + if ( + !this.context.stepSourceLocation.sourceLocation && + this.context.stepSourceLocation.actionLocation.uri.includes(AFTER_HOOK_URI_TO_SKIP) + ) + return; + + // StepResult + const sceenshotName = this.context.getFileName(); + + switch (event.result.status) { + case STATUSES.PASSED: { + this.context.stepStatus = STATUSES.PASSED; + if (this.context.scenarioStatus !== STATUSES.FAILED) { + this.context.scenarioStatus = STATUSES.PASSED; + } + break; + } + case STATUSES.PENDING: { + this.reportportal.sendLog(this.context.stepId, { + time: this.reportportal.helpers.now(), + level: 'WARN', + message: "This step is marked as 'pending'", + }); + this.context.stepStatus = STATUSES.NOT_IMPLEMENTED; + this.context.scenarioStatus = STATUSES.FAILED; + this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); + break; + } + case STATUSES.UNDEFINED: { + this.reportportal.sendLog(this.context.stepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: 'There is no step definition found. Please verify and implement it.', + }); + this.context.stepStatus = STATUSES.NOT_FOUND; + this.context.scenarioStatus = STATUSES.FAILED; + this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); + break; + } + case STATUSES.AMBIGUOUS: { + this.reportportal.sendLog(this.context.stepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: 'There are more than one step implementation. Please verify and reimplement it.', + }); + this.context.stepStatus = STATUSES.NOT_FOUND; + this.context.scenarioStatus = STATUSES.FAILED; + this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); + break; + } + case STATUSES.SKIPPED: { + this.context.stepStatus = STATUSES.SKIPPED; + if (this.context.scenarioStatus === STATUSES.FAILED) { + this.context.scenarioStatus = STATUSES.SKIPPED; + } + + if ( + this.context.scenarioStatus === STATUSES.STARTED || + this.context.scenarioStatus === STATUSES.PASSED + ) { + this.context.scenarioStatus = STATUSES.SKIPPED; + } else { + this.context.scenarioStatus = STATUSES.FAILED; + if ( + // eslint-disable-next-line no-prototype-builtins + this.config.hasOwnProperty('reportSkippedCucumberStepsOnFailedTest') && + !this.config.reportSkippedCucumberStepsOnFailedTest + ) { + this.context.stepStatus = STATUSES.CANCELLED; + } + } + + break; + } + case STATUSES.FAILED: { + this.context.stepStatus = STATUSES.FAILED; + this.context.scenarioStatus = STATUSES.FAILED; + this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); + const errorMessage = `${ + this.context.stepDefinition.uri + }\n ${event.result.exception.toString()}`; + this.reportportal.sendLog(this.context.stepId, { + time: this.reportportal.helpers.now(), + level: 'ERROR', + message: errorMessage, + }); + if ( + global.browser && + this.config.takeScreenshot && + this.config.takeScreenshot === 'onFailure' + ) { + const request = { + time: this.reportportal.helpers.now(), + level: 'ERROR', + file: { name: sceenshotName }, + message: sceenshotName, + }; + global.browser.takeScreenshot().then((png) => { + const fileObj = { + name: sceenshotName, + type: 'image/png', + content: png, + }; + this.reportportal.sendLog(this.context.stepId, request, fileObj); + }); + } + break; + } + default: + break; + } + + const itemParams = this.context.itemsParams[this.context.stepId]; + + // AfterStep + const request = { + status: this.context.stepStatus, + endTime: this.reportportal.helpers.now(), + ...itemParams, + }; + if (request.status === STATUSES.NOT_FOUND) { + request.status = STATUSES.FAILED; + request.issue = { + issueType: 'ab001', + comment: 'STEP DEFINITION WAS NOT FOUND', + }; + } else if (request.status === STATUSES.NOT_IMPLEMENTED) { + request.status = STATUSES.SKIPPED; + request.issue = { + issueType: 'ti001', + comment: 'STEP IS PENDING IMPLEMENTATION', + }; + } + + this.reportportal.finishTestItem(this.context.stepId, request); + }, + + updateItemParams(id, newParams) { + this.context.itemsParams[id] = { + ...this.context.itemsParams[id], + ...newParams, + }; + }, + getItemParams(id) { + return this.context.itemsParams[id] || {}; + }, + onTestStepAttachment(event) { + const fileName = this.context.getFileName(); + if ( + event.data && + event.data.length && + (this.context.stepStatus === STATUSES.PASSED || this.context.stepStatus === STATUSES.FAILED) + ) { + const dataObj = utils.getJSON(event.data); + let itemId = this.context.stepId; + + switch (event.media.type) { + case RP_EVENTS.TEST_CASE_ID: { + this.updateItemParams(itemId, { testCaseId: dataObj.testCaseId }); + break; + } + case RP_EVENTS.ATTRIBUTES: { + const savedAttributes = this.getItemParams(itemId).attributes || []; + this.updateItemParams(itemId, { + attributes: savedAttributes.concat(dataObj.attributes), + }); + break; + } + case RP_EVENTS.DESCRIPTION: { + const savedDescription = this.getItemParams(itemId).description || ''; + this.updateItemParams(itemId, { + description: savedDescription + ? `${savedDescription}
${dataObj.description}` + : dataObj.description, + }); + break; + } + case RP_EVENTS.STATUS: { + if (dataObj.entity !== RP_ENTITY_LAUNCH) { + this.updateItemParams(itemId, { + status: dataObj.status, + }); + } else { + this.context.launchStatus = dataObj.status; + } + break; + } + case 'text/plain': { + const request = { + time: this.reportportal.helpers.now(), + }; + if (dataObj) { + request.level = dataObj.level; + request.message = dataObj.message; + if (dataObj.entity === RP_ENTITY_LAUNCH) { + itemId = this.context.launchId; + } + } else { + request.level = LOG_LEVELS.DEBUG; + request.message = event.data; + } + this.reportportal.sendLog(itemId, request); + break; + } + default: { + const request = { + time: this.reportportal.helpers.now(), + level: + this.context.stepStatus === STATUSES.PASSED ? LOG_LEVELS.DEBUG : LOG_LEVELS.ERROR, + message: fileName, + file: { + name: fileName, + }, + }; + if (dataObj) { + request.level = dataObj.level; + request.message = dataObj.message; + request.file.name = dataObj.message; + if (dataObj.entity === RP_ENTITY_LAUNCH) { + itemId = this.context.launchId; + } + } + const fileObj = { + name: fileName, + type: event.media.type, + content: (dataObj && dataObj.data) || event.data, + }; + this.reportportal.sendLog(itemId, request, fileObj); + break; + } + } + } + }, + onTestCaseFinished(event) { + if (!this.isScenarioBasedStatistics && event.result.retried) { + return; + } + const isFailed = event.result.status !== STATUSES.PASSED; + // ScenarioResult + this.reportportal.finishTestItem(this.context.scenarioId, { + status: isFailed ? STATUSES.FAILED : STATUSES.PASSED, + endTime: this.reportportal.helpers.now(), + }); + this.context.scenarioId = null; + const featureUri = event.sourceLocation.uri; + + this.documentsStorage.featureData[featureUri].featureStatus = + this.context.failedScenarios[featureUri] > 0 ? STATUSES.FAILED : STATUSES.PASSED; + }, + onTestRunFinished(event) { + // Finish the final feature in the run + const finalFeature = this.documentsStorage.featureData[this.context.currentFeatureUri]; + this.reportportal.finishTestItem(finalFeature.featureId, { + status: finalFeature.featureStatus, + endTime: this.reportportal.helpers.now(), + }); + // AfterFeatures + const promise = this.reportportal.getPromiseFinishAllItems(this.context.launchId); + return promise.then(() => { + if (this.context.launchId) { + const finishLaunchRQ = { + endTime: this.reportportal.helpers.now(), + status: event.result.success ? STATUSES.PASSED : STATUSES.FAILED, + }; + + if (this.context.launchStatus) { + finishLaunchRQ.status = this.context.launchStatus; + } + + const launchFinishPromise = this.reportportal.finishLaunch( + this.context.launchId, + finishLaunchRQ, + ).promise; + launchFinishPromise.then(() => { + this.context.resetContext(); + }); + } + }); + }, +}; diff --git a/modules/cucumber-reportportal-formatter.js b/modules/cucumber-reportportal-formatter.js index 5b609b9..5073c29 100644 --- a/modules/cucumber-reportportal-formatter.js +++ b/modules/cucumber-reportportal-formatter.js @@ -15,943 +15,45 @@ */ const ReportPortalClient = require('@reportportal/client-javascript'); -const Table = require('cli-table3'); const utils = require('./utils'); -const Context = require('./context'); -const DocumentStorage = require('./documents-storage'); const pjson = require('../package.json'); -const itemFinders = require('./itemFinders'); -const { - AFTER_HOOK_URI_TO_SKIP, - RP_ENTITY_LAUNCH, - STATUSES, - LOG_LEVELS, - CUCUMBER_EVENTS, - RP_EVENTS, - TABLE_CONFIG, - CUCUMBER_MESSAGES, -} = require('./constants'); -const Storage = require('./storage'); const createRPFormatterClass = (config) => { let Formatter; + let module; try { // eslint-disable-next-line global-require Formatter = require('@cucumber/cucumber').Formatter; + // eslint-disable-next-line global-require + module = require('./api/current'); } catch (e) { // eslint-disable-next-line global-require Formatter = require('cucumber').Formatter; + // eslint-disable-next-line global-require + module = require('./api/deprecated'); } - const documentsStorage = new DocumentStorage(); - const reportportal = new ReportPortalClient(config, { name: pjson.name, version: pjson.version }); - const attributesConf = !config.attributes ? [] : config.attributes; - const isScenarioBasedStatistics = - typeof config.scenarioBasedStatistics === 'boolean' ? config.scenarioBasedStatistics : false; return class CucumberReportPortalFormatter extends Formatter { constructor(options) { super(options); - this.context = new Context(); - this.documentsStorage = documentsStorage; - this.reportportal = reportportal; - this.attributesConf = attributesConf; - + this.options = options; + this.config = config; + this.reportportal = new ReportPortalClient(config, { + name: pjson.name, + version: pjson.version, + }); + this.attributesConf = config.attributes || []; const { rerun, rerunOf } = options.parsedArgvOptions || {}; - this.isRerun = rerun || config.rerun; this.rerunOf = rerunOf || config.rerunOf; + this.isScenarioBasedStatistics = + typeof this.config.scenarioBasedStatistics === 'boolean' + ? this.config.scenarioBasedStatistics + : false; - this.registerListeners(options.eventBroadcaster); - - // NEW API - this.storage = new Storage(); - this.customLaunchStatus = null; - - options.eventBroadcaster.on('envelope', (event) => { - const [key] = Object.keys(event); - switch (key) { - case CUCUMBER_MESSAGES.GHERKIN_DOCUMENT: - return this.onGherkinDocumentEvent(event[key]); - case CUCUMBER_MESSAGES.PICKLE: - return this.onPickleEvent(event[key]); - case CUCUMBER_MESSAGES.TEST_RUN_STARTED: - return this.onTestRunStartedEvent(); - case CUCUMBER_MESSAGES.TEST_CASE: - return this.onTestCaseEvent(event[key]); - case CUCUMBER_MESSAGES.TEST_CASE_STARTED: - return this.onTestCaseStartedEvent(event[key]); - case CUCUMBER_MESSAGES.TEST_STEP_STARTED: - return this.onTestStepStartedEvent(event[key]); - case CUCUMBER_MESSAGES.ATTACHMENT: - return this.onTestStepAttachmentEvent(event[key]); - case CUCUMBER_MESSAGES.TEST_STEP_FINISHED: - return this.onTestStepFinishedEvent(event[key]); - case CUCUMBER_MESSAGES.TEST_CASE_FINISHED: - return this.onTestCaseFinishedEvent(event[key]); - case CUCUMBER_MESSAGES.TEST_RUN_FINISHED: - return this.onTestRunFinishedEvent(event[key]); - default: - return null; - } - }); - } - - registerListeners(eventBroadcaster) { - eventBroadcaster.on(CUCUMBER_EVENTS.GHERKIN_DOCUMENT, this.onGherkinDocument.bind(this)); - eventBroadcaster.on(CUCUMBER_EVENTS.PICKLE_ACCEPTED, this.onPickleAccepted.bind(this)); - eventBroadcaster.on(CUCUMBER_EVENTS.TEST_CASE_PREPARED, this.onTestCasePrepared.bind(this)); - eventBroadcaster.on(CUCUMBER_EVENTS.TEST_CASE_STARTED, this.onTestCaseStarted.bind(this)); - eventBroadcaster.on(CUCUMBER_EVENTS.TEST_STEP_STARTED, this.onTestStepStarted.bind(this)); - eventBroadcaster.on(CUCUMBER_EVENTS.TEST_STEP_FINISHED, this.onTestStepFinished.bind(this)); - eventBroadcaster.on( - CUCUMBER_EVENTS.TEST_STEP_ATTACHMENT, - this.onTestStepAttachment.bind(this), - ); - eventBroadcaster.on(CUCUMBER_EVENTS.TEST_CASE_FINISHED, this.onTestCaseFinished.bind(this)); - eventBroadcaster.on(CUCUMBER_EVENTS.TEST_RUN_FINISHED, this.onTestRunFinished.bind(this)); - } - - onGherkinDocumentEvent(data) { - this.storage.setDocument(data); - } - - onPickleEvent(data) { - this.storage.setPickle(data); - } - - onTestRunStartedEvent() { - const startLaunchData = { - name: config.launch, - startTime: this.reportportal.helpers.now(), - description: !config.description ? '' : config.description, - attributes: [ - ...this.attributesConf, - { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, - ], - rerun: this.isRerun, - rerunOf: this.rerunOf, - }; - const { tempId } = this.reportportal.startLaunch(startLaunchData); - this.storage.setLaunchTempId(tempId); - } - - onTestCaseEvent(data) { - const { id: testCaseId, pickleId, testSteps } = data; - this.storage.setTestCase(data); - - // prepare steps - const stepsMap = {}; - testSteps.forEach((step) => { - const { pickleStepId, id } = step; - // skip hookId - if (pickleStepId) { - const { steps } = this.storage.getPickle(pickleId); - stepsMap[id] = steps.find((item) => item.id === pickleStepId); - } - }); - this.storage.setSteps(testCaseId, stepsMap); - } - - onTestCaseStartedEvent(data) { - const { id, testCaseId } = data; - this.storage.setTestCaseStartedId(id, testCaseId); - const { pickleId } = this.storage.getTestCase(testCaseId); - const { - uri: pickleFeatureUri, - astNodeIds: [scenarioId], - } = this.storage.getPickle(pickleId); - const currentFeatureUri = this.storage.getCurrentFeatureUri(); - const feature = this.storage.getFeature(pickleFeatureUri); - const launchTempId = this.storage.getLaunchTempId(); - - // start FEATURE if no currentFeatureUri or new feature - // else finish old one - if (!currentFeatureUri && currentFeatureUri !== pickleFeatureUri) { - this.storage.setCurrentFeatureUri(pickleFeatureUri); - const suiteData = { - name: feature.name, - startTime: this.reportportal.helpers.now(), - type: 'SUITE', - description: (feature.description || '').trim(), - attributes: utils.createAttributes(feature.tags), - }; - const { tempId } = this.reportportal.startTestItem(suiteData, launchTempId, ''); - this.storage.setFeatureTempId(tempId); - } else { - const tempFeatureId = this.storage.getFeatureTempId(); - this.reportportal.finishTestItem(tempFeatureId, {}); - } - - // current feature node rule || scenario - const currentNode = utils.findNode(feature, scenarioId); - - let scenario; - let ruleTempId = this.storage.getRuleTempId(); - if (currentNode.rule && !ruleTempId) { - // start RULE - const { rule } = currentNode; - const testData = { - startTime: this.reportportal.helpers.now(), - type: 'SUITE', - name: rule.name, - description: rule.description, - attributes: utils.createAttributes(rule.tags), - }; - const parentId = this.storage.getFeatureTempId(); - const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); - ruleTempId = tempId; - this.storage.setRuleTempId(tempId); - - scenario = utils.findScenario(rule, scenarioId); - const isLastScenario = utils.detectLastScenario(currentNode.rule, scenarioId); - this.storage.setLastScenario(isLastScenario); - } else if (currentNode.rule && ruleTempId) { - scenario = utils.findScenario(currentNode.rule, scenarioId); - const isLastScenario = utils.detectLastScenario(currentNode.rule, scenarioId); - this.storage.setLastScenario(isLastScenario); - } else { - scenario = currentNode.scenario; - } - - const testData = { - startTime: this.reportportal.helpers.now(), - type: 'TEST', - name: scenario.name, - description: scenario.description, - attributes: utils.createAttributes(scenario.tags), - }; - - const parentId = ruleTempId || this.storage.getFeatureTempId(); - const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); - this.storage.setScenarioTempId(tempId); - } - - onTestStepStartedEvent(data) { - const { testCaseStartedId, testStepId } = data; - const testCaseId = this.storage.getTestCaseId(testCaseStartedId); - const step = this.storage.getStep(testCaseId, testStepId); - - // start step - if (step) { - const stepData = { - name: step.text, - startTime: this.reportportal.helpers.now(), - type: 'STEP', - }; - const launchTempId = this.storage.getLaunchTempId(); - const parentId = this.storage.getScenarioTempId(); - const { tempId } = this.reportportal.startTestItem(stepData, launchTempId, parentId); - this.storage.setStepTempId(tempId); - } - } - - onTestStepAttachmentEvent(data) { - if (data) { - const { testStepId, testCaseStartedId } = data; - const testCaseId = this.storage.getTestCaseId(testCaseStartedId); - const step = this.storage.getStep(testCaseId, testStepId); - const dataObj = utils.getJSON(data.body); - - switch (data.mediaType) { - case RP_EVENTS.TEST_CASE_ID: { - this.storage.updateStep(testCaseId, testStepId, dataObj); - break; - } - case RP_EVENTS.ATTRIBUTES: { - const savedAttributes = step.attributes || []; - this.storage.updateStep(testCaseId, testStepId, { - attributes: savedAttributes.concat(dataObj.attributes), - }); - break; - } - case RP_EVENTS.DESCRIPTION: { - const savedDescription = step.description || ''; - this.storage.updateStep(testCaseId, testStepId, { - description: savedDescription - ? `${savedDescription}
${dataObj.description}` - : dataObj.description, - }); - break; - } - case RP_EVENTS.STATUS: { - if (dataObj.entity !== RP_ENTITY_LAUNCH) { - this.storage.updateStep(testCaseId, testStepId, dataObj); - } else { - this.customLaunchStatus = dataObj.status; - } - break; - } - case 'text/plain': { - const request = { - time: this.reportportal.helpers.now(), - }; - let tempStepId = this.storage.getStepTempId(); - - if (dataObj) { - request.level = dataObj.level; - request.message = dataObj.message; - if (dataObj.entity === RP_ENTITY_LAUNCH) { - tempStepId = this.storage.getLaunchTempId(); - } - } else { - request.level = LOG_LEVELS.DEBUG; - request.message = data.body; - } - this.reportportal.sendLog(tempStepId, request); - break; - } - default: { - const fileName = 'file'; // TODO: generate human valuable file name here if possible - const request = { - time: this.reportportal.helpers.now(), - level: - this.context.stepStatus === STATUSES.PASSED ? LOG_LEVELS.DEBUG : LOG_LEVELS.ERROR, - message: fileName, - file: { - name: fileName, - }, - }; - let tempStepId = this.storage.getStepTempId(); - - if (dataObj) { - request.level = dataObj.level; - request.message = dataObj.message; - request.file.name = dataObj.message; - if (dataObj.entity === RP_ENTITY_LAUNCH) { - tempStepId = this.storage.getLaunchTempId(); - } - } - const fileObj = { - name: fileName, - type: data.mediaType, - content: (dataObj && dataObj.data) || data.body, - }; - this.reportportal.sendLog(tempStepId, request, fileObj); - break; - } - } - } - } - - onTestStepFinishedEvent(data) { - const { testCaseStartedId, testStepId, testStepResult } = data; - const testCaseId = this.storage.getTestCaseId(testCaseStartedId); - const step = this.storage.getStep(testCaseId, testStepId); - const tempStepId = this.storage.getStepTempId(); - let status; - - switch (testStepResult.status.toLowerCase()) { - case STATUSES.PASSED: { - status = STATUSES.PASSED; - break; - } - case STATUSES.PENDING: { - this.reportportal.sendLog(tempStepId, { - time: this.reportportal.helpers.now(), - level: 'WARN', - message: "This step is marked as 'pending'", - }); - status = STATUSES.FAILED; - break; - } - case STATUSES.UNDEFINED: { - this.reportportal.sendLog(tempStepId, { - time: this.reportportal.helpers.now(), - level: 'ERROR', - message: 'There is no step definition found. Please verify and implement it.', - }); - status = STATUSES.FAILED; - break; - } - case STATUSES.AMBIGUOUS: { - this.reportportal.sendLog(tempStepId, { - time: this.reportportal.helpers.now(), - level: 'ERROR', - message: - 'There are more than one step implementation. Please verify and reimplement it.', - }); - status = STATUSES.FAILED; - break; - } - case STATUSES.SKIPPED: { - status = STATUSES.SKIPPED; - break; - } - case STATUSES.FAILED: { - status = STATUSES.FAILED; - this.reportportal.sendLog(tempStepId, { - time: this.reportportal.helpers.now(), - level: 'ERROR', - message: testStepResult.message, - }); - break; - } - default: - break; - } - - if (step) { - const { attributes, description, testCaseId: customTestCaseId } = step; - status = step.status || status || testStepResult.status; - this.reportportal.finishTestItem(tempStepId, { - ...(status && { status }), - ...(attributes && { attributes }), - ...(description && { description }), - ...(customTestCaseId && { testCaseId: customTestCaseId }), - endTime: this.reportportal.helpers.now(), - }); - } - - this.storage.setStepTempId(null); - } - - onTestCaseFinishedEvent(data) { - const { testCaseStartedId } = data; - const scenarioTempId = this.storage.getScenarioTempId(); - this.reportportal.finishTestItem(scenarioTempId, {}); - - // finish RULE if it's exist and if it's last scenario - const isLastScenario = this.storage.getLastScenario(); - const ruleTempId = this.storage.getRuleTempId(); - if (ruleTempId && isLastScenario) { - this.reportportal.finishTestItem(ruleTempId, {}); - this.storage.setRuleTempId(null); - this.storage.setLastScenario(false); - } - - const testCaseId = this.storage.getTestCaseId(testCaseStartedId); - this.storage.removeTestCaseStartedId(testCaseStartedId); - this.storage.removeSteps(testCaseId); - this.storage.removeTestCase(testCaseId); - this.storage.setScenarioTempId(null); - } - - onTestRunFinishedEvent() { - const featureTempId = this.storage.getFeatureTempId(); - this.reportportal.finishTestItem(featureTempId, {}); - - const launchId = this.storage.getLaunchTempId(); - this.reportportal - .getPromiseFinishAllItems(launchId) - .then(() => { - this.reportportal.finishLaunch(launchId, { - ...(this.customLaunchStatus && { status: this.customLaunchStatus }), - }); - }) - .then(() => { - this.storage.setLaunchTempId(null); - this.storage.setCurrentFeatureUri(null); - this.storage.setFeatureTempId(null); - this.customLaunchStatus = null; - }); - } + utils.bindToClass(module, this); - onGherkinDocument(event) { - this.documentsStorage.cacheDocument(event); - - // BeforeFeatures - if (!this.context.launchId) { - const launch = this.reportportal.startLaunch({ - name: config.launch, - startTime: this.reportportal.helpers.now(), - description: !config.description ? '' : config.description, - attributes: [ - ...this.attributesConf, - { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, - ], - rerun: this.isRerun, - rerunOf: this.rerunOf, - }); - this.context.launchId = launch.tempId; - } - } - - onPickleAccepted(event) { - const featureUri = utils.getUri(event.uri); - if (!this.documentsStorage.isFeatureDataCached(featureUri)) { - this.documentsStorage.createCachedFeature(featureUri); - - const feature = this.documentsStorage.featureData[featureUri]; - const featureDocument = itemFinders.findFeature( - this.documentsStorage.gherkinDocuments, - event, - ); - feature.description = featureDocument.description || featureUri; - const { name } = featureDocument; - feature.name = name; - feature.itemAttributes = utils.createAttributes(featureDocument.tags); - } - } - - onTestCasePrepared(event) { - const featureUri = utils.getUri(event.sourceLocation.uri); - const feature = this.documentsStorage.featureData[featureUri]; - // If this is the first scenario in the feature, start the feature in RP - if (!feature.featureId) { - feature.featureId = this.reportportal.startTestItem( - { - name: feature.name, - startTime: this.reportportal.helpers.now(), - type: isScenarioBasedStatistics ? 'TEST' : 'SUITE', - codeRef: utils.formatCodeRef(featureUri, feature.name), - description: feature.description, - attributes: feature.itemAttributes, - }, - this.context.launchId, - ).tempId; - } - // If this is the first feature in the run, set the currentFeatureUri - if (!this.context.currentFeatureUri) { - this.context.currentFeatureUri = featureUri; - } - // If this is a new feature, finish the previous feature in RP. - // does not work for the final feature in the run. that is finished in onTestRunFinished - if (this.context.currentFeatureUri !== featureUri) { - const previousFeature = this.documentsStorage.featureData[this.context.currentFeatureUri]; - // If this is a new feature, finish the previous feature - reportportal.finishTestItem(previousFeature.featureId, { - status: previousFeature.featureStatus, - endTime: reportportal.helpers.now(), - }); - // Now that the previous feature is finished, assign the new current feature - this.context.currentFeatureUri = featureUri; - } - this.context.stepDefinitions = event; - let hookType = 'Before'; - this.context.stepDefinitions.steps.forEach((step) => { - if (step.sourceLocation) { - hookType = 'After'; - return; - } - // eslint-disable-next-line no-param-reassign - step.hookType = hookType; - }); - } - - onTestCaseStarted(event) { - const featureDocument = itemFinders.findFeature( - this.documentsStorage.gherkinDocuments, - event.sourceLocation, - ); - this.context.scenario = itemFinders.findScenario( - this.documentsStorage.gherkinDocuments, - event.sourceLocation, - ); - this.context.scenarioStatus = STATUSES.STARTED; - this.context.background = itemFinders.findBackground(featureDocument); - const featureTags = featureDocument.tags; - const keyword = this.context.scenario.keyword - ? this.context.scenario.keyword - : this.context.scenario.type; - let name = [keyword, this.context.scenario.name].join(': '); - const eventTags = this.context.scenario.tags - ? this.context.scenario.tags.filter( - (tag) => !featureTags.find(utils.createTagComparator(tag)), - ) - : []; - const itemAttributes = utils.createAttributes(eventTags); - const description = - this.context.scenario.description || - [utils.getUri(event.sourceLocation.uri), event.sourceLocation.line].join(':'); - const { featureId } = this.documentsStorage.featureData[event.sourceLocation.uri]; - - if (this.context.lastScenarioDescription !== name) { - this.context.lastScenarioDescription = name; - this.context.outlineRow = 0; - } else if (event.attemptNumber < 2) { - this.context.outlineRow += 1; - name += ` [${this.context.outlineRow}]`; - } - - // BeforeScenario - if (isScenarioBasedStatistics || event.attemptNumber < 2) { - this.context.scenarioId = this.reportportal.startTestItem( - { - name, - startTime: this.reportportal.helpers.now(), - type: isScenarioBasedStatistics ? 'STEP' : 'TEST', - description, - codeRef: utils.formatCodeRef(event.sourceLocation.uri, name), - parameters: this.context.scenario.parameters, - attributes: itemAttributes, - retry: isScenarioBasedStatistics && event.attemptNumber > 1, - }, - this.context.launchId, - featureId, - ).tempId; - } - } - - onTestStepStarted(event) { - this.context.stepStatus = STATUSES.FAILED; - this.context.stepId = null; - - this.context.stepSourceLocation = this.context.stepDefinitions.steps[event.index]; - - // skip After Hook added by protractor-cucumber-framework - if ( - !this.context.stepSourceLocation.sourceLocation && - this.context.stepSourceLocation.actionLocation.uri.includes(AFTER_HOOK_URI_TO_SKIP) - ) - return; - - this.context.step = this.context.findStep(event); - this.context.stepDefinition = itemFinders.findStepDefinition(this.context, event); - - let description; - let name = this.context.step.text - ? `${this.context.step.keyword} ${this.context.step.text}` - : this.context.step.keyword; - - if (this.context.step.argument) { - let stepArguments; - if (this.context.step.argument.content) { - stepArguments = `"""\n${this.context.step.argument.content}\n"""`; - } - - if (this.context.step.argument.rows) { - const rows = this.context.step.argument.rows.map((row) => - row.cells.map((cell) => { - // Added an if statement to only replace step parameters if this is a Scenario Outline - let tempStepValue = cell.value; - if (this.context.scenario.parameters) { - this.context.scenario.parameters.forEach((parameter) => { - if (cell.value.includes(`<${parameter.key}>`)) { - tempStepValue = utils.replaceParameter( - cell.value, - parameter.key, - parameter.value, - ); - } - }); - } - return tempStepValue; - }), - ); - const datatable = new Table(TABLE_CONFIG); - datatable.push(...rows); - stepArguments = datatable.toString(); - } - if (isScenarioBasedStatistics) { - name += `\n${stepArguments}`; - } else { - description = stepArguments; - } - } - - let type = 'STEP'; - let isHook = false; - if (this.context.step.keyword === 'Before') { - type = 'BEFORE_TEST'; - isHook = true; - } else if (this.context.step.keyword === 'After') { - type = 'AFTER_TEST'; - isHook = true; - } - - // hooks are described in cucumber's library core - const codeRef = - this.context.stepDefinition && !isHook - ? utils.formatCodeRef(this.context.stepDefinition.uri, name) - : undefined; - - this.context.stepId = this.reportportal.startTestItem( - { - name, - description, - startTime: this.reportportal.helpers.now(), - type, - codeRef, - parameters: this.context.step.parameters, - hasStats: !isScenarioBasedStatistics, - retry: !isScenarioBasedStatistics && event.testCase.attemptNumber > 1, - }, - this.context.launchId, - this.context.scenarioId, - ).tempId; - } - - onTestStepFinished(event) { - // skip After Hook added by protractor-cucumber-framework - if ( - !this.context.stepSourceLocation.sourceLocation && - this.context.stepSourceLocation.actionLocation.uri.includes(AFTER_HOOK_URI_TO_SKIP) - ) - return; - - // StepResult - const sceenshotName = this.context.getFileName(); - - switch (event.result.status) { - case STATUSES.PASSED: { - this.context.stepStatus = STATUSES.PASSED; - if (this.context.scenarioStatus !== STATUSES.FAILED) { - this.context.scenarioStatus = STATUSES.PASSED; - } - break; - } - case STATUSES.PENDING: { - this.reportportal.sendLog(this.context.stepId, { - time: this.reportportal.helpers.now(), - level: 'WARN', - message: "This step is marked as 'pending'", - }); - this.context.stepStatus = STATUSES.NOT_IMPLEMENTED; - this.context.scenarioStatus = STATUSES.FAILED; - this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); - break; - } - case STATUSES.UNDEFINED: { - this.reportportal.sendLog(this.context.stepId, { - time: this.reportportal.helpers.now(), - level: 'ERROR', - message: 'There is no step definition found. Please verify and implement it.', - }); - this.context.stepStatus = STATUSES.NOT_FOUND; - this.context.scenarioStatus = STATUSES.FAILED; - this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); - break; - } - case STATUSES.AMBIGUOUS: { - this.reportportal.sendLog(this.context.stepId, { - time: this.reportportal.helpers.now(), - level: 'ERROR', - message: - 'There are more than one step implementation. Please verify and reimplement it.', - }); - this.context.stepStatus = STATUSES.NOT_FOUND; - this.context.scenarioStatus = STATUSES.FAILED; - this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); - break; - } - case STATUSES.SKIPPED: { - this.context.stepStatus = STATUSES.SKIPPED; - if (this.context.scenarioStatus === STATUSES.FAILED) { - this.context.scenarioStatus = STATUSES.SKIPPED; - } - - if ( - this.context.scenarioStatus === STATUSES.STARTED || - this.context.scenarioStatus === STATUSES.PASSED - ) { - this.context.scenarioStatus = STATUSES.SKIPPED; - } else { - this.context.scenarioStatus = STATUSES.FAILED; - if ( - // eslint-disable-next-line no-prototype-builtins - config.hasOwnProperty('reportSkippedCucumberStepsOnFailedTest') && - !config.reportSkippedCucumberStepsOnFailedTest - ) { - this.context.stepStatus = STATUSES.CANCELLED; - } - } - - break; - } - case STATUSES.FAILED: { - this.context.stepStatus = STATUSES.FAILED; - this.context.scenarioStatus = STATUSES.FAILED; - this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); - const errorMessage = `${ - this.context.stepDefinition.uri - }\n ${event.result.exception.toString()}`; - this.reportportal.sendLog(this.context.stepId, { - time: this.reportportal.helpers.now(), - level: 'ERROR', - message: errorMessage, - }); - if (global.browser && config.takeScreenshot && config.takeScreenshot === 'onFailure') { - const request = { - time: this.reportportal.helpers.now(), - level: 'ERROR', - file: { name: sceenshotName }, - message: sceenshotName, - }; - global.browser.takeScreenshot().then((png) => { - const fileObj = { - name: sceenshotName, - type: 'image/png', - content: png, - }; - this.reportportal.sendLog(this.context.stepId, request, fileObj); - }); - } - break; - } - default: - break; - } - - const itemParams = this.context.itemsParams[this.context.stepId]; - - // AfterStep - const request = { - status: this.context.stepStatus, - endTime: this.reportportal.helpers.now(), - ...itemParams, - }; - if (request.status === STATUSES.NOT_FOUND) { - request.status = STATUSES.FAILED; - request.issue = { - issueType: 'ab001', - comment: 'STEP DEFINITION WAS NOT FOUND', - }; - } else if (request.status === STATUSES.NOT_IMPLEMENTED) { - request.status = STATUSES.SKIPPED; - request.issue = { - issueType: 'ti001', - comment: 'STEP IS PENDING IMPLEMENTATION', - }; - } - - this.reportportal.finishTestItem(this.context.stepId, request); - } - - updateItemParams(id, newParams) { - this.context.itemsParams[id] = { - ...this.context.itemsParams[id], - ...newParams, - }; - } - - getItemParams(id) { - return this.context.itemsParams[id] || {}; - } - - onTestStepAttachment(event) { - const fileName = this.context.getFileName(); - if ( - event.data && - event.data.length && - (this.context.stepStatus === STATUSES.PASSED || this.context.stepStatus === STATUSES.FAILED) - ) { - const dataObj = utils.getJSON(event.data); - let itemId = this.context.stepId; - - switch (event.media.type) { - case RP_EVENTS.TEST_CASE_ID: { - this.updateItemParams(itemId, { testCaseId: dataObj.testCaseId }); - break; - } - case RP_EVENTS.ATTRIBUTES: { - const savedAttributes = this.getItemParams(itemId).attributes || []; - this.updateItemParams(itemId, { - attributes: savedAttributes.concat(dataObj.attributes), - }); - break; - } - case RP_EVENTS.DESCRIPTION: { - const savedDescription = this.getItemParams(itemId).description || ''; - this.updateItemParams(itemId, { - description: savedDescription - ? `${savedDescription}
${dataObj.description}` - : dataObj.description, - }); - break; - } - case RP_EVENTS.STATUS: { - if (dataObj.entity !== RP_ENTITY_LAUNCH) { - this.updateItemParams(itemId, { - status: dataObj.status, - }); - } else { - this.context.launchStatus = dataObj.status; - } - break; - } - case 'text/plain': { - const request = { - time: this.reportportal.helpers.now(), - }; - if (dataObj) { - request.level = dataObj.level; - request.message = dataObj.message; - if (dataObj.entity === RP_ENTITY_LAUNCH) { - itemId = this.context.launchId; - } - } else { - request.level = LOG_LEVELS.DEBUG; - request.message = event.data; - } - this.reportportal.sendLog(itemId, request); - break; - } - default: { - const request = { - time: this.reportportal.helpers.now(), - level: - this.context.stepStatus === STATUSES.PASSED ? LOG_LEVELS.DEBUG : LOG_LEVELS.ERROR, - message: fileName, - file: { - name: fileName, - }, - }; - if (dataObj) { - request.level = dataObj.level; - request.message = dataObj.message; - request.file.name = dataObj.message; - if (dataObj.entity === RP_ENTITY_LAUNCH) { - itemId = this.context.launchId; - } - } - const fileObj = { - name: fileName, - type: event.media.type, - content: (dataObj && dataObj.data) || event.data, - }; - this.reportportal.sendLog(itemId, request, fileObj); - break; - } - } - } - } - - onTestCaseFinished(event) { - if (!isScenarioBasedStatistics && event.result.retried) { - return; - } - const isFailed = event.result.status !== STATUSES.PASSED; - // ScenarioResult - this.reportportal.finishTestItem(this.context.scenarioId, { - status: isFailed ? STATUSES.FAILED : STATUSES.PASSED, - endTime: this.reportportal.helpers.now(), - }); - this.context.scenarioId = null; - const featureUri = event.sourceLocation.uri; - - this.documentsStorage.featureData[featureUri].featureStatus = - this.context.failedScenarios[featureUri] > 0 ? STATUSES.FAILED : STATUSES.PASSED; - } - - onTestRunFinished(event) { - // Finish the final feature in the run - const finalFeature = this.documentsStorage.featureData[this.context.currentFeatureUri]; - reportportal.finishTestItem(finalFeature.featureId, { - status: finalFeature.featureStatus, - endTime: reportportal.helpers.now(), - }); - // AfterFeatures - const promise = this.reportportal.getPromiseFinishAllItems(this.context.launchId); - return promise.then(() => { - if (this.context.launchId) { - const finishLaunchRQ = { - endTime: this.reportportal.helpers.now(), - status: event.result.success ? STATUSES.PASSED : STATUSES.FAILED, - }; - - if (this.context.launchStatus) { - finishLaunchRQ.status = this.context.launchStatus; - } - - const launchFinishPromise = this.reportportal.finishLaunch( - this.context.launchId, - finishLaunchRQ, - ).promise; - launchFinishPromise.then(() => { - this.context.resetContext(); - }); - } - }); + this.init(); } }; }; diff --git a/modules/utils.js b/modules/utils.js index ef4ca30..8743739 100644 --- a/modules/utils.js +++ b/modules/utils.js @@ -136,6 +136,14 @@ const findScenario = (node, searchId) => { return children.scenario; }; +const bindToClass = (module, thisClass) => { + const that = thisClass; + Object.entries(module).forEach((method) => { + const [key, value] = method; + that[key] = value.bind(that); + }); +}; + module.exports = { createTagComparator, createAttribute, @@ -149,4 +157,5 @@ module.exports = { findNode, findScenario, detectLastScenario, + bindToClass, }; diff --git a/tests/cucumber-reportportal-formatter.spec.js b/tests/cucumber-reportportal-formatter.spec.js index c2befa5..1ef93b8 100644 --- a/tests/cucumber-reportportal-formatter.spec.js +++ b/tests/cucumber-reportportal-formatter.spec.js @@ -236,14 +236,14 @@ describe('', () => { formatter.onTestCaseFinishedEvent(testCaseFinished); }); - it('finishTestItem, getPromiseFinishAllItems should be called, clean storage', () => { + it('finishTestItem, getPromiseFinishAllItems should be called, clean storage', async () => { const spyFinishTestItem = jest.spyOn(formatter.reportportal, 'finishTestItem'); const spyGetPromiseFinishAllItems = jest.spyOn( formatter.reportportal, 'getPromiseFinishAllItems', ); - formatter.onTestRunFinishedEvent(); + await formatter.onTestRunFinishedEvent(); expect(spyFinishTestItem).lastCalledWith('testItemId', {}); expect(spyGetPromiseFinishAllItems).toBeCalledWith('tempLaunchId'); diff --git a/tests/utils.spec.js b/tests/utils.spec.js index 535d1f3..0f3d59d 100644 --- a/tests/utils.spec.js +++ b/tests/utils.spec.js @@ -48,4 +48,18 @@ describe('utils', () => { expect(utils.findScenario(node, scenarioId)).toBe(expectedRes); }); + + it('bindToClass should add method to class', () => { + const module = { + newMethod() {}, + }; + class Test { + constructor() { + utils.bindToClass(module, this); + } + } + const instance = new Test(); + + expect(instance.newMethod).toBeTruthy(); + }); }); From e0459f51d325dbdb1506f34f5d7c893230897208 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Wed, 26 Oct 2022 18:34:27 +0300 Subject: [PATCH 11/21] EPMRPP-80194 || strip ansi characters (#105) --- modules/api/current.js | 3 +- modules/api/deprecated.js | 7 +++-- package-lock.json | 65 +++++++++++++++++++++++++++++---------- package.json | 3 +- 4 files changed, 56 insertions(+), 22 deletions(-) diff --git a/modules/api/current.js b/modules/api/current.js index 61cae4b..d8b985f 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -1,3 +1,4 @@ +const stripAnsi = require('strip-ansi'); const pjson = require('../../package.json'); const utils = require('../utils'); const { @@ -308,7 +309,7 @@ module.exports = { this.reportportal.sendLog(tempStepId, { time: this.reportportal.helpers.now(), level: 'ERROR', - message: testStepResult.message, + message: stripAnsi(testStepResult.message), }); break; } diff --git a/modules/api/deprecated.js b/modules/api/deprecated.js index 5b7da83..6c0b417 100644 --- a/modules/api/deprecated.js +++ b/modules/api/deprecated.js @@ -1,3 +1,4 @@ +const stripAnsi = require('strip-ansi'); const Table = require('cli-table3'); const utils = require('../utils'); const itemFinders = require('../itemFinders'); @@ -347,9 +348,9 @@ module.exports = { this.context.stepStatus = STATUSES.FAILED; this.context.scenarioStatus = STATUSES.FAILED; this.context.incrementFailedScenariosCount(event.testCase.sourceLocation.uri); - const errorMessage = `${ - this.context.stepDefinition.uri - }\n ${event.result.exception.toString()}`; + const errorMessage = stripAnsi( + `${this.context.stepDefinition.uri}\n ${event.result.exception.toString()}`, + ); this.reportportal.sendLog(this.context.stepId, { time: this.reportportal.helpers.now(), level: 'ERROR', diff --git a/package-lock.json b/package-lock.json index 7473142..4bd0fa0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1343,6 +1343,11 @@ } } }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -1809,7 +1814,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-spawn": { "version": "6.0.5", @@ -2030,6 +2035,12 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -2044,6 +2055,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -2378,7 +2398,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "3.1.3", @@ -5293,7 +5313,10 @@ "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } } } }, @@ -5340,20 +5363,11 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - } + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -5428,6 +5442,12 @@ "string-width": "^3.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -5449,6 +5469,17 @@ "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } } } @@ -5633,7 +5664,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", diff --git a/package.json b/package.json index 11c6dcf..12d47eb 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "spec": "cucumber version >=4.x <=6.x", "dependencies": { "@reportportal/client-javascript": "^5.0.6", - "cli-table3": "^0.6.0" + "cli-table3": "^0.6.0", + "strip-ansi": "^6.0.1" }, "devDependencies": { "eslint": "^6.8.0", From b56d5dd7d287fc4946d639591e2eecac1f7fad15 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Thu, 27 Oct 2022 12:23:20 +0300 Subject: [PATCH 12/21] EPMRPP-80196 || add support isScenarioBasedStatistics flag (#106) * EPMRPP-80196 || add support isScenarioBasedStatistics flag * EPMRPP-80196 || code review fixes - 1 --- modules/api/current.js | 31 ++++++++++++----- modules/storage.js | 6 ++++ tests/cucumber-reportportal-formatter.spec.js | 34 +++++++++---------- 3 files changed, 45 insertions(+), 26 deletions(-) diff --git a/modules/api/current.js b/modules/api/current.js index d8b985f..0d78edd 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -99,7 +99,7 @@ module.exports = { const suiteData = { name: feature.name, startTime: this.reportportal.helpers.now(), - type: 'SUITE', + type: this.isScenarioBasedStatistics ? 'TEST' : 'SUITE', description: (feature.description || '').trim(), attributes: utils.createAttributes(feature.tags), }; @@ -107,7 +107,9 @@ module.exports = { this.storage.setFeatureTempId(tempId); } else { const tempFeatureId = this.storage.getFeatureTempId(); - this.reportportal.finishTestItem(tempFeatureId, {}); + this.reportportal.finishTestItem(tempFeatureId, { + endTime: this.reportportal.helpers.now(), + }); } // current feature node rule || scenario @@ -120,7 +122,7 @@ module.exports = { const { rule } = currentNode; const testData = { startTime: this.reportportal.helpers.now(), - type: 'SUITE', + type: this.isScenarioBasedStatistics ? 'TEST' : 'SUITE', name: rule.name, description: rule.description, attributes: utils.createAttributes(rule.tags), @@ -143,7 +145,7 @@ module.exports = { const testData = { startTime: this.reportportal.helpers.now(), - type: 'TEST', + type: this.isScenarioBasedStatistics ? 'STEP' : 'TEST', name: scenario.name, description: scenario.description, attributes: utils.createAttributes(scenario.tags), @@ -164,6 +166,7 @@ module.exports = { name: step.text, startTime: this.reportportal.helpers.now(), type: 'STEP', + ...(this.isScenarioBasedStatistics && { hasStats: false }), }; const launchTempId = this.storage.getLaunchTempId(); const parentId = this.storage.getScenarioTempId(); @@ -329,23 +332,33 @@ module.exports = { }); } + if (this.isScenarioBasedStatistics && status !== STATUSES.PASSED) { + this.storage.updateTestCase(testCaseId, { status: STATUSES.FAILED }); + } + this.storage.setStepTempId(null); }, onTestCaseFinishedEvent(data) { const { testCaseStartedId } = data; + const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const testCase = this.storage.getTestCase(testCaseId); const scenarioTempId = this.storage.getScenarioTempId(); - this.reportportal.finishTestItem(scenarioTempId, {}); + this.reportportal.finishTestItem(scenarioTempId, { + endTime: this.reportportal.helpers.now(), + ...(this.isScenarioBasedStatistics && { status: testCase.status || STATUSES.PASSED }), + }); // finish RULE if it's exist and if it's last scenario const isLastScenario = this.storage.getLastScenario(); const ruleTempId = this.storage.getRuleTempId(); if (ruleTempId && isLastScenario) { - this.reportportal.finishTestItem(ruleTempId, {}); + this.reportportal.finishTestItem(ruleTempId, { + endTime: this.reportportal.helpers.now(), + }); this.storage.setRuleTempId(null); this.storage.setLastScenario(false); } - const testCaseId = this.storage.getTestCaseId(testCaseStartedId); this.storage.removeTestCaseStartedId(testCaseStartedId); this.storage.removeSteps(testCaseId); this.storage.removeTestCase(testCaseId); @@ -353,7 +366,9 @@ module.exports = { }, onTestRunFinishedEvent() { const featureTempId = this.storage.getFeatureTempId(); - this.reportportal.finishTestItem(featureTempId, {}); + this.reportportal.finishTestItem(featureTempId, { + endTime: this.reportportal.helpers.now(), + }); const launchId = this.storage.getLaunchTempId(); this.reportportal.getPromiseFinishAllItems(launchId).then(() => { diff --git a/modules/storage.js b/modules/storage.js index 1b1d27d..a74a7f6 100644 --- a/modules/storage.js +++ b/modules/storage.js @@ -76,6 +76,12 @@ module.exports = class Storage { return this.testCases.get(id); } + updateTestCase(id, data) { + const testCase = this.testCases.get(id); + const newTestCaseData = { ...testCase, ...data }; + this.testCases.set(id, newTestCaseData); + } + removeTestCase(id) { this.testCases.delete(id); } diff --git a/tests/cucumber-reportportal-formatter.spec.js b/tests/cucumber-reportportal-formatter.spec.js index 1ef93b8..ea9b6a0 100644 --- a/tests/cucumber-reportportal-formatter.spec.js +++ b/tests/cucumber-reportportal-formatter.spec.js @@ -15,19 +15,12 @@ */ const { createRPFormatterClass } = require('../modules'); -const { - ContextMock, - DocumentsStorageMock, - RPClientMock, - getDefaultConfig, - mockedDate, -} = require('./mocks'); +const { RPClientMock, getDefaultConfig, mockedDate } = require('./mocks'); const Storage = require('../modules/storage'); const { gherkinDocument, uri, pickle, - pickleId, testCase, testCaseStarted, testCaseId, @@ -38,14 +31,12 @@ const { testCaseFinished, testCaseStartedId, } = require('./data'); +const { STATUSES } = require('../modules/constants'); -describe('', () => { - let FormatterClass; - let formatter; +describe('cucumber-reportportal-formatter', () => { const config = getDefaultConfig(); - - FormatterClass = createRPFormatterClass(config); - formatter = new FormatterClass({ + const FormatterClass = createRPFormatterClass(config); + const formatter = new FormatterClass({ parsedArgvOptions: {}, eventBroadcaster: { on: () => {}, @@ -120,7 +111,9 @@ describe('', () => { formatter.onTestCaseStartedEvent(testCaseStarted); - expect(finishTestItem).toHaveBeenCalledWith(tempFeatureId, {}); + expect(finishTestItem).toHaveBeenCalledWith(tempFeatureId, { + endTime: mockedDate, + }); }); it('start scenario flow', () => { @@ -194,7 +187,7 @@ describe('', () => { expect(spyFinishTestItem).toBeCalledWith('testItemId', { endTime: mockedDate, - status: 'failed', + status: STATUSES.FAILED, }); expect(formatter.storage.getStepTempId()).toBe(null); }); @@ -216,7 +209,10 @@ describe('', () => { formatter.onTestCaseFinishedEvent(testCaseFinished); - expect(spyFinishTestItem).lastCalledWith('testItemId', {}); + expect(spyFinishTestItem).toBeCalledWith('testItemId', { + endTime: mockedDate, + status: STATUSES.FAILED, + }); expect(formatter.storage.getTestCaseId(testCaseStartedId)).toBe(undefined); expect(formatter.storage.getStep(testCaseId, testStepId)).toBe(undefined); expect(formatter.storage.getTestCase(testCaseId)).toBe(undefined); @@ -245,7 +241,9 @@ describe('', () => { await formatter.onTestRunFinishedEvent(); - expect(spyFinishTestItem).lastCalledWith('testItemId', {}); + expect(spyFinishTestItem).lastCalledWith('testItemId', { + endTime: mockedDate, + }); expect(spyGetPromiseFinishAllItems).toBeCalledWith('tempLaunchId'); expect(formatter.storage.getLaunchTempId()).toBeNull(); From 87f4a8705c68f9d37e8b8405c8f84830ad01f8c1 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Thu, 27 Oct 2022 16:18:42 +0300 Subject: [PATCH 13/21] EPMRPP-80198 || add error log to step description (#107) --- modules/api/current.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/api/current.js b/modules/api/current.js index 0d78edd..a2b2dcd 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -323,10 +323,13 @@ module.exports = { if (step) { const { attributes, description, testCaseId: customTestCaseId } = step; status = step.status || status || testStepResult.status; + const errorMessage = + testStepResult.message && `\`\`\`error\n${stripAnsi(testStepResult.message)}\n\`\`\``; + const descriptionToSend = errorMessage ? `${description}\n${errorMessage}` : description; this.reportportal.finishTestItem(tempStepId, { ...(status && { status }), ...(attributes && { attributes }), - ...(description && { description }), + ...(description && { description: descriptionToSend }), ...(customTestCaseId && { testCaseId: customTestCaseId }), endTime: this.reportportal.helpers.now(), }); From c22c4ad26b648257bebfc8de7bbd52f60d11b85f Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Fri, 28 Oct 2022 17:21:07 +0300 Subject: [PATCH 14/21] EPMRPP-80193 || add support reporting before/after hooks (#108) * EPMRPP-80193 || add support reporting before/after hooks * EPMRPP-80193 || code review fixes - 1 --- modules/api/current.js | 35 ++++++++++++++++++++++++----------- modules/constants.js | 10 ++++++++++ modules/storage.js | 9 +++++++++ tests/data.js | 7 +++++++ tests/storage.spec.js | 25 +++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 11 deletions(-) diff --git a/modules/api/current.js b/modules/api/current.js index a2b2dcd..1e792ee 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -7,6 +7,7 @@ const { LOG_LEVELS, STATUSES, CUCUMBER_MESSAGES, + TEST_ITEM_TYPES, } = require('../constants'); const Storage = require('../storage'); @@ -22,6 +23,8 @@ module.exports = { return this.onGherkinDocumentEvent(event[key]); case CUCUMBER_MESSAGES.PICKLE: return this.onPickleEvent(event[key]); + case CUCUMBER_MESSAGES.HOOK: + return this.onHookEvent(event[key]); case CUCUMBER_MESSAGES.TEST_RUN_STARTED: return this.onTestRunStartedEvent(); case CUCUMBER_MESSAGES.TEST_CASE: @@ -46,6 +49,10 @@ module.exports = { onGherkinDocumentEvent(data) { this.storage.setDocument(data); }, + onHookEvent(data) { + const { id } = data; + this.storage.setHook(id, data); + }, onPickleEvent(data) { this.storage.setPickle(data); }, @@ -70,12 +77,20 @@ module.exports = { // prepare steps const stepsMap = {}; - testSteps.forEach((step) => { - const { pickleStepId, id } = step; - // skip hookId + testSteps.forEach((step, index) => { + const { pickleStepId, id, hookId } = step; + if (pickleStepId) { - const { steps } = this.storage.getPickle(pickleId); - stepsMap[id] = steps.find((item) => item.id === pickleStepId); + const { steps: stepsData } = this.storage.getPickle(pickleId); + const stepData = stepsData.find((item) => item.id === pickleStepId); + stepsMap[id] = { ...stepData, type: TEST_ITEM_TYPES.STEP }; + } else if (hookId) { + const isBeforeHook = index === 0; + const { name } = this.storage.getHook(hookId); + stepsMap[id] = { + text: name || (isBeforeHook ? 'Before' : 'After'), + type: isBeforeHook ? TEST_ITEM_TYPES.BEFORE_TEST : TEST_ITEM_TYPES.AFTER_TEST, + }; } }); this.storage.setSteps(testCaseId, stepsMap); @@ -99,7 +114,7 @@ module.exports = { const suiteData = { name: feature.name, startTime: this.reportportal.helpers.now(), - type: this.isScenarioBasedStatistics ? 'TEST' : 'SUITE', + type: this.isScenarioBasedStatistics ? TEST_ITEM_TYPES.TEST : TEST_ITEM_TYPES.SUITE, description: (feature.description || '').trim(), attributes: utils.createAttributes(feature.tags), }; @@ -122,7 +137,7 @@ module.exports = { const { rule } = currentNode; const testData = { startTime: this.reportportal.helpers.now(), - type: this.isScenarioBasedStatistics ? 'TEST' : 'SUITE', + type: this.isScenarioBasedStatistics ? TEST_ITEM_TYPES.TEST : TEST_ITEM_TYPES.SUITE, name: rule.name, description: rule.description, attributes: utils.createAttributes(rule.tags), @@ -145,7 +160,7 @@ module.exports = { const testData = { startTime: this.reportportal.helpers.now(), - type: this.isScenarioBasedStatistics ? 'STEP' : 'TEST', + type: this.isScenarioBasedStatistics ? TEST_ITEM_TYPES.STEP : TEST_ITEM_TYPES.TEST, name: scenario.name, description: scenario.description, attributes: utils.createAttributes(scenario.tags), @@ -165,7 +180,7 @@ module.exports = { const stepData = { name: step.text, startTime: this.reportportal.helpers.now(), - type: 'STEP', + type: step.type, ...(this.isScenarioBasedStatistics && { hasStats: false }), }; const launchTempId = this.storage.getLaunchTempId(); @@ -179,7 +194,6 @@ module.exports = { const { testStepId, testCaseStartedId } = data; const testCaseId = this.storage.getTestCaseId(testCaseStartedId); const step = this.storage.getStep(testCaseId, testStepId); - if (!step) return; const dataObj = utils.getJSON(data.body); switch (data.mediaType) { @@ -267,7 +281,6 @@ module.exports = { const { testCaseStartedId, testStepId, testStepResult } = data; const testCaseId = this.storage.getTestCaseId(testCaseStartedId); const step = this.storage.getStep(testCaseId, testStepId); - if (!step) return; const tempStepId = this.storage.getStepTempId(); let status; diff --git a/modules/constants.js b/modules/constants.js index b5ee48c..2d7461a 100644 --- a/modules/constants.js +++ b/modules/constants.js @@ -57,6 +57,7 @@ const CUCUMBER_EVENTS = { const CUCUMBER_MESSAGES = { GHERKIN_DOCUMENT: 'gherkinDocument', + HOOK: 'hook', PICKLE: 'pickle', TEST_RUN_STARTED: 'testRunStarted', TEST_CASE: 'testCase', @@ -68,6 +69,14 @@ const CUCUMBER_MESSAGES = { TEST_RUN_FINISHED: 'testRunFinished', }; +const TEST_ITEM_TYPES = { + SUITE: 'SUITE', + STEP: 'STEP', + TEST: 'TEST', + BEFORE_TEST: 'BEFORE_TEST', + AFTER_TEST: 'AFTER_TEST', +}; + const RP_EVENTS = { TEST_CASE_ID: 'rp/testCaseId', ATTRIBUTES: 'rp/attributes', @@ -106,4 +115,5 @@ module.exports = { RP_EVENTS, TABLE_CONFIG, CUCUMBER_MESSAGES, + TEST_ITEM_TYPES, }; diff --git a/modules/storage.js b/modules/storage.js index a74a7f6..e0bbfbb 100644 --- a/modules/storage.js +++ b/modules/storage.js @@ -19,6 +19,7 @@ module.exports = class Storage { this.launchTempId = null; this.documents = new Map(); this.pickles = new Map(); + this.hooks = new Map(); this.testCases = new Map(); this.testCaseStartedIds = new Map(); this.steps = new Map(); @@ -68,6 +69,14 @@ module.exports = class Storage { return this.pickles.get(id); } + setHook(id, data) { + this.hooks.set(id, data); + } + + getHook(id) { + return this.hooks.get(id); + } + setTestCase(testCase) { this.testCases.set(testCase.id, testCase); } diff --git a/tests/data.js b/tests/data.js index 7385049..cefa4ee 100644 --- a/tests/data.js +++ b/tests/data.js @@ -52,6 +52,11 @@ const pickle = { name: 'Given and expected value are equal', steps: [step], }; +const hookId = '2b9c9732-acbd-4fa0-8408-42875800d92e'; +const hook = { + id: hookId, + name: 'Hook name', +}; const testCaseId = '16c505eb-433e-496a-82d8-7799f5dd99ce'; const testStepId = '635a880a-73c7-440d-9c28-eee5d0353339'; const testCase = { @@ -106,6 +111,8 @@ module.exports = { pickleId, uri, pickle, + hookId, + hook, testCase, testCaseId, testCaseStarted, diff --git a/tests/storage.spec.js b/tests/storage.spec.js index 4e0be02..5ca018a 100644 --- a/tests/storage.spec.js +++ b/tests/storage.spec.js @@ -32,6 +32,8 @@ const { scenarioTempId, stepTempId, ruleTempId, + hookId, + hook, } = require('./data'); describe('test Storage', () => { @@ -70,12 +72,25 @@ describe('test Storage', () => { expect(storage.getPickle(pickleId)).toEqual(pickle); }); + it('set/getHook', () => { + storage.setHook(hookId, hook); + + expect(storage.getHook(hookId)).toEqual(hook); + }); + it('set/getTestCase', () => { storage.setTestCase(testCase); expect(storage.getTestCase(testCaseId)).toEqual(testCase); }); + it('updateTestCase', () => { + const newData = { newField: true }; + storage.updateTestCase(testCaseId, newData); + + expect(storage.getTestCase(testCaseId)).toMatchObject(newData); + }); + it('removeTestCase', () => { storage.setTestCase(testCase); storage.removeTestCase(testCaseId); @@ -113,6 +128,16 @@ describe('test Storage', () => { expect(storage.getStep(testCaseId, testStepId)).toBeUndefined(); }); + it('updateStep', () => { + const newData = { newStepField: true }; + storage.setSteps(testCaseId, { + [testStepId]: step, + }); + storage.updateStep(testCaseId, testStepId, newData); + + expect(storage.getStep(testCaseId, testStepId)).toMatchObject(newData); + }); + it('set/getFeatureTempId', () => { storage.setFeatureTempId(featureTempId); From 587da26477a707b480028100a1096b290a302fdb Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Fri, 11 Nov 2022 10:39:07 +0200 Subject: [PATCH 15/21] EPMRPP-80197 || provide skippedIssue flag support (#109) * EPMRPP-80197 || provide skippedIssue flag support * EPMRPP-80197 || code review fixes - 1 --- modules/api/current.js | 31 ++++++++++++++++--- modules/api/deprecated.js | 16 ++++++++++ tests/cucumber-reportportal-formatter.spec.js | 6 ++-- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/modules/api/current.js b/modules/api/current.js index 1e792ee..d5e1c82 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -1,3 +1,19 @@ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const stripAnsi = require('strip-ansi'); const pjson = require('../../package.json'); const utils = require('../utils'); @@ -57,14 +73,19 @@ module.exports = { this.storage.setPickle(data); }, onTestRunStartedEvent() { + const attributes = [ + ...this.attributesConf, + { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, + ]; + if (this.config.skippedIssue === false) { + const skippedIssueAttribute = { key: 'skippedIssue', value: 'false', system: true }; + attributes.push(skippedIssueAttribute); + } const startLaunchData = { name: this.config.launch, startTime: this.reportportal.helpers.now(), description: this.config.description || '', - attributes: [ - ...this.attributesConf, - { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, - ], + attributes, rerun: this.isRerun, rerunOf: this.rerunOf, }; @@ -339,11 +360,13 @@ module.exports = { const errorMessage = testStepResult.message && `\`\`\`error\n${stripAnsi(testStepResult.message)}\n\`\`\``; const descriptionToSend = errorMessage ? `${description}\n${errorMessage}` : description; + const withoutIssue = status === STATUSES.SKIPPED && this.config.skippedIssue === false; this.reportportal.finishTestItem(tempStepId, { ...(status && { status }), ...(attributes && { attributes }), ...(description && { description: descriptionToSend }), ...(customTestCaseId && { testCaseId: customTestCaseId }), + ...(withoutIssue && { issue: { issueType: 'NOT_ISSUE' } }), endTime: this.reportportal.helpers.now(), }); } diff --git a/modules/api/deprecated.js b/modules/api/deprecated.js index 6c0b417..21e2752 100644 --- a/modules/api/deprecated.js +++ b/modules/api/deprecated.js @@ -1,3 +1,19 @@ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const stripAnsi = require('strip-ansi'); const Table = require('cli-table3'); const utils = require('../utils'); diff --git a/tests/cucumber-reportportal-formatter.spec.js b/tests/cucumber-reportportal-formatter.spec.js index ea9b6a0..6f43153 100644 --- a/tests/cucumber-reportportal-formatter.spec.js +++ b/tests/cucumber-reportportal-formatter.spec.js @@ -31,7 +31,7 @@ const { testCaseFinished, testCaseStartedId, } = require('./data'); -const { STATUSES } = require('../modules/constants'); +const { STATUSES, TEST_ITEM_TYPES } = require('../modules/constants'); describe('cucumber-reportportal-formatter', () => { const config = getDefaultConfig(); @@ -74,12 +74,12 @@ describe('cucumber-reportportal-formatter', () => { describe('onTestCaseEvent', () => { it('should set steps to storage under testCaseId', () => { - const expectedRes = pickle.steps[0]; + const expectedRes = { ...pickle.steps[0], type: TEST_ITEM_TYPES.STEP }; formatter.storage.setPickle(pickle); formatter.onTestCaseEvent(testCase); - expect(formatter.storage.getStep(testCase.id, testStepId)).toBe(expectedRes); + expect(formatter.storage.getStep(testCase.id, testStepId)).toEqual(expectedRes); }); }); From 3f216c2ef9750432722ffd52d52c0e13982e9379 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 15 Nov 2022 12:19:39 +0200 Subject: [PATCH 16/21] EPMRPP-80725 || add support parameters (#110) --- modules/api/current.js | 24 +++++++++++++++++++++++- modules/storage.js | 9 +++++++++ modules/utils.js | 20 ++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/modules/api/current.js b/modules/api/current.js index d5e1c82..b905e17 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -122,7 +122,7 @@ module.exports = { const { pickleId } = this.storage.getTestCase(testCaseId); const { uri: pickleFeatureUri, - astNodeIds: [scenarioId], + astNodeIds: [scenarioId, parametersId], } = this.storage.getPickle(pickleId); const currentFeatureUri = this.storage.getCurrentFeatureUri(); const feature = this.storage.getFeature(pickleFeatureUri); @@ -187,6 +187,15 @@ module.exports = { attributes: utils.createAttributes(scenario.tags), }; + if (parametersId) { + const [{ tableHeader, tableBody }] = scenario.examples; + const params = utils.collectParams({ tableHeader, tableBody }); + Object.keys(params).forEach((paramKey) => { + this.storage.setParameters(paramKey, params[paramKey]); + }); + testData.parameters = this.storage.getParameters(parametersId); + } + const parentId = ruleTempId || this.storage.getFeatureTempId(); const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); this.storage.setScenarioTempId(tempId); @@ -204,6 +213,19 @@ module.exports = { type: step.type, ...(this.isScenarioBasedStatistics && { hasStats: false }), }; + + if (!this.isScenarioBasedStatistics && step.astNodeIds && step.astNodeIds.length > 1) { + const testCase = this.storage.getTestCase(testCaseId); + const { testSteps } = testCase; + const testStep = testSteps.find((item) => item.id === testStepId); + const argumentsMap = testStep.stepMatchArgumentsLists[0].stepMatchArguments.map((arg) => + arg.group.value.slice(1, -1), + ); + const parametersId = step.astNodeIds[1]; + const params = this.storage.getParameters(parametersId); + stepData.parameters = params.filter((param) => argumentsMap.includes(param.value)); + } + const launchTempId = this.storage.getLaunchTempId(); const parentId = this.storage.getScenarioTempId(); const { tempId } = this.reportportal.startTestItem(stepData, launchTempId, parentId); diff --git a/modules/storage.js b/modules/storage.js index e0bbfbb..7fca3b1 100644 --- a/modules/storage.js +++ b/modules/storage.js @@ -23,6 +23,7 @@ module.exports = class Storage { this.testCases = new Map(); this.testCaseStartedIds = new Map(); this.steps = new Map(); + this.parameters = new Map(); this.currentFeatureUri = null; this.featureTempId = null; this.ruleTempId = null; @@ -127,6 +128,14 @@ module.exports = class Storage { this.steps.set(testCaseId, newStepsData); } + setParameters(id, data) { + this.parameters.set(id, data); + } + + getParameters(id) { + return this.parameters.get(id); + } + setFeatureTempId(value) { this.featureTempId = value; } diff --git a/modules/utils.js b/modules/utils.js index 8743739..5736466 100644 --- a/modules/utils.js +++ b/modules/utils.js @@ -144,6 +144,25 @@ const bindToClass = (module, thisClass) => { }); }; +const collectParams = ({ tableHeader, tableBody }) => { + const { cells: headerCells } = tableHeader; + return tableBody.reduce((map, row) => { + const { id, cells: rowCells } = row; + + const rowData = rowCells.reduce((acc, cell, i) => { + return { + ...acc, + [id]: [...(acc[id] || []), { key: headerCells[i].value, value: cell.value }], + }; + }, {}); + + return { + ...map, + ...rowData, + }; + }, {}); +}; + module.exports = { createTagComparator, createAttribute, @@ -158,4 +177,5 @@ module.exports = { findScenario, detectLastScenario, bindToClass, + collectParams, }; From ec606e82b7a9e88748a47f99c0cf1885a6af8c80 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 15 Nov 2022 12:47:06 +0200 Subject: [PATCH 17/21] EPMRPP-80752 || add codeRef, add index to name to test with params (#111) * EPMRPP-80752 || add codeRef, add index to name to test with params * EPMRPP-80752 || code review fixes - 1 --- modules/api/current.js | 39 +++++++++++++++---- tests/cucumber-reportportal-formatter.spec.js | 17 +++++++- tests/data.js | 6 ++- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/modules/api/current.js b/modules/api/current.js index b905e17..d2e8ba6 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -31,6 +31,7 @@ module.exports = { init() { this.storage = new Storage(); this.customLaunchStatus = null; + this.codeRefIndexesMap = new Map(); this.options.eventBroadcaster.on('envelope', (event) => { const [key] = Object.keys(event); @@ -130,6 +131,7 @@ module.exports = { // start FEATURE if no currentFeatureUri or new feature // else finish old one + const featureCodeRef = utils.formatCodeRef(pickleFeatureUri, feature.name); if (!currentFeatureUri && currentFeatureUri !== pickleFeatureUri) { this.storage.setCurrentFeatureUri(pickleFeatureUri); const suiteData = { @@ -138,6 +140,7 @@ module.exports = { type: this.isScenarioBasedStatistics ? TEST_ITEM_TYPES.TEST : TEST_ITEM_TYPES.SUITE, description: (feature.description || '').trim(), attributes: utils.createAttributes(feature.tags), + codeRef: featureCodeRef, }; const { tempId } = this.reportportal.startTestItem(suiteData, launchTempId, ''); this.storage.setFeatureTempId(tempId); @@ -156,12 +159,15 @@ module.exports = { if (currentNode.rule && !ruleTempId) { // start RULE const { rule } = currentNode; + const { name, description, tags } = rule; + const currentNodeCodeRef = utils.formatCodeRef(featureCodeRef, name); const testData = { startTime: this.reportportal.helpers.now(), type: this.isScenarioBasedStatistics ? TEST_ITEM_TYPES.TEST : TEST_ITEM_TYPES.SUITE, - name: rule.name, - description: rule.description, - attributes: utils.createAttributes(rule.tags), + name, + description, + attributes: utils.createAttributes(tags), + codeRef: currentNodeCodeRef, }; const parentId = this.storage.getFeatureTempId(); const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); @@ -179,12 +185,22 @@ module.exports = { scenario = currentNode.scenario; } + const { name: scenarioName } = scenario; + const currentNodeCodeRef = + (ruleTempId && utils.formatCodeRef(featureCodeRef, currentNode.rule.name)) || featureCodeRef; + const scenarioCodeRefIndexValue = this.codeRefIndexesMap.get(currentNodeCodeRef); + this.codeRefIndexesMap.set(currentNodeCodeRef, (scenarioCodeRefIndexValue || 0) + 1); + const name = scenarioCodeRefIndexValue + ? `${scenarioName} [${scenarioCodeRefIndexValue}]` + : scenarioName; + const scenarioCodeRef = utils.formatCodeRef(currentNodeCodeRef, name); const testData = { startTime: this.reportportal.helpers.now(), type: this.isScenarioBasedStatistics ? TEST_ITEM_TYPES.STEP : TEST_ITEM_TYPES.TEST, - name: scenario.name, + name, description: scenario.description, attributes: utils.createAttributes(scenario.tags), + codeRef: scenarioCodeRef, }; if (parametersId) { @@ -199,23 +215,31 @@ module.exports = { const parentId = ruleTempId || this.storage.getFeatureTempId(); const { tempId } = this.reportportal.startTestItem(testData, launchTempId, parentId); this.storage.setScenarioTempId(tempId); + this.storage.updateTestCase(testCaseId, { codeRef: scenarioCodeRef }); }, onTestStepStartedEvent(data) { const { testCaseStartedId, testStepId } = data; const testCaseId = this.storage.getTestCaseId(testCaseStartedId); + const testCase = this.storage.getTestCase(testCaseId); const step = this.storage.getStep(testCaseId, testStepId); // start step if (step) { + const { text: stepName, type } = step; + const codeRef = utils.formatCodeRef(testCase.codeRef, stepName); + const stepCodeRefIndexValue = this.codeRefIndexesMap.get(codeRef); + this.codeRefIndexesMap.set(codeRef, (stepCodeRefIndexValue || 0) + 1); + const name = stepCodeRefIndexValue ? `${stepName} [${stepCodeRefIndexValue}]` : stepName; + const stepData = { - name: step.text, + name, startTime: this.reportportal.helpers.now(), - type: step.type, + type, + codeRef, ...(this.isScenarioBasedStatistics && { hasStats: false }), }; if (!this.isScenarioBasedStatistics && step.astNodeIds && step.astNodeIds.length > 1) { - const testCase = this.storage.getTestCase(testCaseId); const { testSteps } = testCase; const testStep = testSteps.find((item) => item.id === testStepId); const argumentsMap = testStep.stepMatchArgumentsLists[0].stepMatchArguments.map((arg) => @@ -418,6 +442,7 @@ module.exports = { }); this.storage.setRuleTempId(null); this.storage.setLastScenario(false); + this.codeRefIndexesMap.clear(); } this.storage.removeTestCaseStartedId(testCaseStartedId); diff --git a/tests/cucumber-reportportal-formatter.spec.js b/tests/cucumber-reportportal-formatter.spec.js index 6f43153..e420e60 100644 --- a/tests/cucumber-reportportal-formatter.spec.js +++ b/tests/cucumber-reportportal-formatter.spec.js @@ -30,6 +30,9 @@ const { testStepFinished, testCaseFinished, testCaseStartedId, + feature, + scenario, + step, } = require('./data'); const { STATUSES, TEST_ITEM_TYPES } = require('../modules/constants'); @@ -48,6 +51,10 @@ describe('cucumber-reportportal-formatter', () => { formatter.storage = new Storage(); }); + afterEach(() => { + formatter.codeRefIndexesMap.clear(); + }); + describe('onGherkinDocumentEvent', () => { it('should set document to storage', () => { formatter.onGherkinDocumentEvent(gherkinDocument); @@ -138,9 +145,10 @@ describe('cucumber-reportportal-formatter', () => { { attributes: [], description: undefined, - name: 'scenario name', + name: scenario.name, startTime: mockedDate, type: 'TEST', + codeRef: `${uri}/${feature.name}/${scenario.name}`, }, 'tempLaunchId', 'testItemId', @@ -163,7 +171,12 @@ describe('cucumber-reportportal-formatter', () => { formatter.onTestStepStartedEvent(testStepStarted); expect(spyStartTestItem).lastCalledWith( - { name: 'I put "true"', startTime: mockedDate, type: 'STEP' }, + { + name: step.text, + startTime: mockedDate, + type: 'STEP', + codeRef: `${uri}/${feature.name}/${scenario.name}/${step.text}`, + }, 'tempLaunchId', 'testItemId', ); diff --git a/tests/data.js b/tests/data.js index cefa4ee..e71aafc 100644 --- a/tests/data.js +++ b/tests/data.js @@ -17,17 +17,18 @@ const launchTempId = 'tempId'; const uri = 'features/statuses/statuses.feature'; const scenarioId = '1957ea93-e4de-4895-86e8-acb857b5b069'; +const scenario = { id: scenarioId, name: 'scenario name' }; const feature = { keyword: 'Feature', name: 'statuses', description: '', - children: [{ scenario: { id: scenarioId, name: 'scenario name' } }], + children: [{ scenario }], }; const featureWithRule = { keyword: 'Feature', name: 'statuses', description: '', - children: [{ rule: { children: [{ scenario: { id: scenarioId, name: 'scenario name' } }] } }], + children: [{ rule: { children: [{ scenario }] } }], }; const gherkinDocument = { uri, @@ -107,6 +108,7 @@ module.exports = { gherkinDocumentWithRule, scenarioId, feature, + scenario, featureWithRule, pickleId, uri, From 844c4e79b9a624b8b238ac693bd04fddb350e936 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 22 Nov 2022 14:37:10 +0200 Subject: [PATCH 18/21] EPMRPP-80779 || Add retries support (#112) Co-authored-by: Mikhail Sidarkevich --- modules/api/current.js | 57 +++++++++++++------ tests/cucumber-reportportal-formatter.spec.js | 5 ++ 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/modules/api/current.js b/modules/api/current.js index d2e8ba6..87a9836 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -32,6 +32,7 @@ module.exports = { this.storage = new Storage(); this.customLaunchStatus = null; this.codeRefIndexesMap = new Map(); + this.isRetry = false; this.options.eventBroadcaster.on('envelope', (event) => { const [key] = Object.keys(event); @@ -118,7 +119,7 @@ module.exports = { this.storage.setSteps(testCaseId, stepsMap); }, onTestCaseStartedEvent(data) { - const { id, testCaseId } = data; + const { id, testCaseId, attempt } = data; this.storage.setTestCaseStartedId(id, testCaseId); const { pickleId } = this.storage.getTestCase(testCaseId); const { @@ -185,15 +186,27 @@ module.exports = { scenario = currentNode.scenario; } + if (attempt > 0) { + this.isRetry = true; + + if (!this.isScenarioBasedStatistics) return; + } + const { name: scenarioName } = scenario; - const currentNodeCodeRef = - (ruleTempId && utils.formatCodeRef(featureCodeRef, currentNode.rule.name)) || featureCodeRef; + const currentNodeCodeRef = utils.formatCodeRef( + featureCodeRef, + ruleTempId ? currentNode.rule.name : scenarioName, + ); const scenarioCodeRefIndexValue = this.codeRefIndexesMap.get(currentNodeCodeRef); this.codeRefIndexesMap.set(currentNodeCodeRef, (scenarioCodeRefIndexValue || 0) + 1); - const name = scenarioCodeRefIndexValue - ? `${scenarioName} [${scenarioCodeRefIndexValue}]` - : scenarioName; - const scenarioCodeRef = utils.formatCodeRef(currentNodeCodeRef, name); + const name = + scenarioCodeRefIndexValue && !this.isRetry + ? `${scenarioName} [${scenarioCodeRefIndexValue}]` + : scenarioName; + const scenarioCodeRef = + scenarioCodeRefIndexValue && !this.isRetry + ? `${currentNodeCodeRef} [${scenarioCodeRefIndexValue}]` + : currentNodeCodeRef; const testData = { startTime: this.reportportal.helpers.now(), type: this.isScenarioBasedStatistics ? TEST_ITEM_TYPES.STEP : TEST_ITEM_TYPES.TEST, @@ -201,6 +214,7 @@ module.exports = { description: scenario.description, attributes: utils.createAttributes(scenario.tags), codeRef: scenarioCodeRef, + retry: this.isScenarioBasedStatistics && attempt > 0, }; if (parametersId) { @@ -229,14 +243,18 @@ module.exports = { const codeRef = utils.formatCodeRef(testCase.codeRef, stepName); const stepCodeRefIndexValue = this.codeRefIndexesMap.get(codeRef); this.codeRefIndexesMap.set(codeRef, (stepCodeRefIndexValue || 0) + 1); - const name = stepCodeRefIndexValue ? `${stepName} [${stepCodeRefIndexValue}]` : stepName; + const name = + stepCodeRefIndexValue && !this.isRetry + ? `${stepName} [${stepCodeRefIndexValue}]` + : stepName; const stepData = { name, startTime: this.reportportal.helpers.now(), type, codeRef, - ...(this.isScenarioBasedStatistics && { hasStats: false }), + hasStats: !this.isScenarioBasedStatistics, + retry: !this.isScenarioBasedStatistics && this.isRetry, }; if (!this.isScenarioBasedStatistics && step.astNodeIds && step.astNodeIds.length > 1) { @@ -401,16 +419,18 @@ module.exports = { } if (step) { - const { attributes, description, testCaseId: customTestCaseId } = step; + const { attributes, description = '', testCaseId: customTestCaseId } = step; status = step.status || status || testStepResult.status; const errorMessage = testStepResult.message && `\`\`\`error\n${stripAnsi(testStepResult.message)}\n\`\`\``; - const descriptionToSend = errorMessage ? `${description}\n${errorMessage}` : description; + const descriptionToSend = errorMessage + ? `${description}${description ? '\n' : ''}${errorMessage}` + : description; const withoutIssue = status === STATUSES.SKIPPED && this.config.skippedIssue === false; this.reportportal.finishTestItem(tempStepId, { ...(status && { status }), ...(attributes && { attributes }), - ...(description && { description: descriptionToSend }), + ...(descriptionToSend && { description: descriptionToSend }), ...(customTestCaseId && { testCaseId: customTestCaseId }), ...(withoutIssue && { issue: { issueType: 'NOT_ISSUE' } }), endTime: this.reportportal.helpers.now(), @@ -424,7 +444,7 @@ module.exports = { this.storage.setStepTempId(null); }, onTestCaseFinishedEvent(data) { - const { testCaseStartedId } = data; + const { testCaseStartedId, willBeRetried } = data; const testCaseId = this.storage.getTestCaseId(testCaseStartedId); const testCase = this.storage.getTestCase(testCaseId); const scenarioTempId = this.storage.getScenarioTempId(); @@ -445,10 +465,13 @@ module.exports = { this.codeRefIndexesMap.clear(); } - this.storage.removeTestCaseStartedId(testCaseStartedId); - this.storage.removeSteps(testCaseId); - this.storage.removeTestCase(testCaseId); - this.storage.setScenarioTempId(null); + if (!willBeRetried) { + this.storage.removeTestCaseStartedId(testCaseStartedId); + this.storage.removeSteps(testCaseId); + this.storage.removeTestCase(testCaseId); + this.storage.setScenarioTempId(null); + this.isRetry = false; + } }, onTestRunFinishedEvent() { const featureTempId = this.storage.getFeatureTempId(); diff --git a/tests/cucumber-reportportal-formatter.spec.js b/tests/cucumber-reportportal-formatter.spec.js index e420e60..7bff660 100644 --- a/tests/cucumber-reportportal-formatter.spec.js +++ b/tests/cucumber-reportportal-formatter.spec.js @@ -149,6 +149,7 @@ describe('cucumber-reportportal-formatter', () => { startTime: mockedDate, type: 'TEST', codeRef: `${uri}/${feature.name}/${scenario.name}`, + retry: false, }, 'tempLaunchId', 'testItemId', @@ -176,6 +177,8 @@ describe('cucumber-reportportal-formatter', () => { startTime: mockedDate, type: 'STEP', codeRef: `${uri}/${feature.name}/${scenario.name}/${step.text}`, + hasStats: true, + retry: false, }, 'tempLaunchId', 'testItemId', @@ -201,6 +204,7 @@ describe('cucumber-reportportal-formatter', () => { expect(spyFinishTestItem).toBeCalledWith('testItemId', { endTime: mockedDate, status: STATUSES.FAILED, + description: '```error\nerror message\n```', }); expect(formatter.storage.getStepTempId()).toBe(null); }); @@ -225,6 +229,7 @@ describe('cucumber-reportportal-formatter', () => { expect(spyFinishTestItem).toBeCalledWith('testItemId', { endTime: mockedDate, status: STATUSES.FAILED, + description: '```error\nerror message\n```', }); expect(formatter.storage.getTestCaseId(testCaseStartedId)).toBe(undefined); expect(formatter.storage.getStep(testCaseId, testStepId)).toBe(undefined); From 784e3ca907067608d86241d76fc2c49b0fcfb758 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 22 Nov 2022 14:46:46 +0200 Subject: [PATCH 19/21] EPMRPP-80780 || move old tests, increase coverage for new api (#113) Co-authored-by: Mikhail Sidarkevich --- jest.config.js | 2 +- modules/api/current.js | 2 +- modules/{ => api/deprecated}/context.js | 6 +- .../cucumber-reportportal-formatter.test.js | 10 +- .../{ => api/deprecated}/documents-storage.js | 0 .../{deprecated.js => deprecated/index.js} | 14 +- modules/{ => api/deprecated}/itemFinders.js | 2 +- modules/api/deprecated/utils.js | 78 ++ modules/cucumber-reportportal-formatter.js | 1 - modules/utils.js | 58 +- package-lock.json | 1085 ++++++++++++++++- package.json | 8 +- tests/utils.spec.js | 92 +- 13 files changed, 1236 insertions(+), 122 deletions(-) rename modules/{ => api/deprecated}/context.js (93%) rename {tests => modules/api/deprecated}/cucumber-reportportal-formatter.test.js (99%) rename modules/{ => api/deprecated}/documents-storage.js (100%) rename modules/api/{deprecated.js => deprecated/index.js} (98%) rename modules/{ => api/deprecated}/itemFinders.js (98%) create mode 100644 modules/api/deprecated/utils.js diff --git a/jest.config.js b/jest.config.js index 7033f94..256824a 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,7 +1,7 @@ module.exports = { moduleFileExtensions: ['js'], testRegex: '/tests/.*\\.spec.(js)$', - collectCoverageFrom: ['modules/**.js', '!modules/index.js'], + collectCoverageFrom: ['modules/**.js', '!api/deprecated'], coverageThreshold: { global: { branches: 80, diff --git a/modules/api/current.js b/modules/api/current.js index 87a9836..00b83c3 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -76,7 +76,7 @@ module.exports = { }, onTestRunStartedEvent() { const attributes = [ - ...this.attributesConf, + ...(this.config.attributes || []), { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, ]; if (this.config.skippedIssue === false) { diff --git a/modules/context.js b/modules/api/deprecated/context.js similarity index 93% rename from modules/context.js rename to modules/api/deprecated/context.js index 0bf3fbc..19c8eb1 100644 --- a/modules/context.js +++ b/modules/api/deprecated/context.js @@ -14,7 +14,7 @@ * limitations under the License. */ -const { STATUSES } = require('./constants'); +const { STATUSES } = require('../../constants'); class Context { constructor() { @@ -80,9 +80,7 @@ class Context { } incrementFailedScenariosCount(uri) { - this.failedScenarios[uri] = this.failedScenarios[uri] - ? this.failedScenarios[uri] + 1 - : 1; + this.failedScenarios[uri] = this.failedScenarios[uri] ? this.failedScenarios[uri] + 1 : 1; } resetContext() { diff --git a/tests/cucumber-reportportal-formatter.test.js b/modules/api/deprecated/cucumber-reportportal-formatter.test.js similarity index 99% rename from tests/cucumber-reportportal-formatter.test.js rename to modules/api/deprecated/cucumber-reportportal-formatter.test.js index 071354b..497cdff 100644 --- a/tests/cucumber-reportportal-formatter.test.js +++ b/modules/api/deprecated/cucumber-reportportal-formatter.test.js @@ -1,15 +1,15 @@ /* These tests need to be rewritten to reflect the refactoring of the agent. Plans for version 5.0.1. */ -const { createRPFormatterClass } = require('../modules'); +const { createRPFormatterClass } = require('../../index'); const { ContextMock, DocumentsStorageMock, RPClientMock, getDefaultConfig, mockedDate, -} = require('./mocks'); -const itemFinders = require('../modules/itemFinders'); -const utils = require('../modules/utils'); -const { AFTER_HOOK_URI_TO_SKIP, STATUSES } = require('../modules/constants'); +} = require('../../../tests/mocks'); +const itemFinders = require('./itemFinders'); +const utils = require('../../utils'); +const { AFTER_HOOK_URI_TO_SKIP, STATUSES } = require('../../constants'); const featureMock = { description: 'feature description', diff --git a/modules/documents-storage.js b/modules/api/deprecated/documents-storage.js similarity index 100% rename from modules/documents-storage.js rename to modules/api/deprecated/documents-storage.js diff --git a/modules/api/deprecated.js b/modules/api/deprecated/index.js similarity index 98% rename from modules/api/deprecated.js rename to modules/api/deprecated/index.js index 21e2752..f9bc9d5 100644 --- a/modules/api/deprecated.js +++ b/modules/api/deprecated/index.js @@ -16,8 +16,8 @@ const stripAnsi = require('strip-ansi'); const Table = require('cli-table3'); -const utils = require('../utils'); -const itemFinders = require('../itemFinders'); +const utils = require('../../utils'); +const itemFinders = require('./itemFinders'); const { STATUSES, AFTER_HOOK_URI_TO_SKIP, @@ -26,10 +26,10 @@ const { RP_ENTITY_LAUNCH, LOG_LEVELS, CUCUMBER_EVENTS, -} = require('../constants'); -const Context = require('../context'); -const DocumentStorage = require('../documents-storage'); -const pjson = require('../../package.json'); +} = require('../../constants'); +const Context = require('./context'); +const DocumentStorage = require('./documents-storage'); +const pjson = require('../../../package.json'); module.exports = { init() { @@ -74,7 +74,7 @@ module.exports = { startTime: this.reportportal.helpers.now(), description: !this.config.description ? '' : this.config.description, attributes: [ - ...this.attributesConf, + ...(this.config.attributes || []), { key: 'agent', value: `${pjson.name}|${pjson.version}`, system: true }, ], rerun: this.isRerun, diff --git a/modules/itemFinders.js b/modules/api/deprecated/itemFinders.js similarity index 98% rename from modules/itemFinders.js rename to modules/api/deprecated/itemFinders.js index e7aa021..78e0e17 100644 --- a/modules/itemFinders.js +++ b/modules/api/deprecated/itemFinders.js @@ -14,7 +14,7 @@ * limitations under the License. */ -const utils = require('./utils'); +const utils = require('../../utils'); function createSteps(header, row, steps) { return steps.map((step) => { diff --git a/modules/api/deprecated/utils.js b/modules/api/deprecated/utils.js new file mode 100644 index 0000000..5cdc8a6 --- /dev/null +++ b/modules/api/deprecated/utils.js @@ -0,0 +1,78 @@ +/* + * Copyright 2022 EPAM Systems + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const path = require('path'); +const commonUtils = require('../../utils'); + +const getUri = (uri) => uri.replace(process.cwd() + path.sep, ''); + +const createTagComparator = (tagA) => (tagB) => + tagB.name === tagA.name && + tagB.location.line === tagA.location.line && + tagB.location.column === tagA.location.column; + +const getParameters = (header, body) => { + const keys = header ? header.cells.map((cell) => cell.value) : []; + + if (Array.isArray(body)) { + return body.reduce((acc, item) => { + const params = item.cells.map((cell, index) => ({ + key: keys[index], + value: cell.value, + })); + + return acc.concat(params); + }, []); + } + + return body.cells.map((cell, index) => ({ + key: keys[index], + value: cell.value, + })); +}; + +function replaceParameter(originalString, name, value) { + return originalString.replace(new RegExp(`<${name}>`, 'g'), value); +} + +const getStepType = (keyword) => { + let type; + + switch (keyword) { + case 'Before': + type = 'BEFORE_TEST'; + break; + case 'After': + type = 'AFTER_TEST'; + break; + default: + type = 'STEP'; + break; + } + + return type; +}; + +module.exports = { + createTagComparator, + getUri, + createAttributes: commonUtils.createAttributes(), + getJSON: commonUtils.getJSON(), + getStepType, + getParameters, + formatCodeRef: commonUtils.formatCodeRef(), + replaceParameter, +}; diff --git a/modules/cucumber-reportportal-formatter.js b/modules/cucumber-reportportal-formatter.js index 5073c29..d7baeb5 100644 --- a/modules/cucumber-reportportal-formatter.js +++ b/modules/cucumber-reportportal-formatter.js @@ -42,7 +42,6 @@ const createRPFormatterClass = (config) => { name: pjson.name, version: pjson.version, }); - this.attributesConf = config.attributes || []; const { rerun, rerunOf } = options.parsedArgvOptions || {}; this.isRerun = rerun || config.rerun; this.rerunOf = rerunOf || config.rerunOf; diff --git a/modules/utils.js b/modules/utils.js index 5736466..ac6ecf0 100644 --- a/modules/utils.js +++ b/modules/utils.js @@ -1,5 +1,5 @@ /* - * Copyright 2020 EPAM Systems + * Copyright 2022 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,8 +14,6 @@ * limitations under the License. */ -const path = require('path'); - const getJSON = (json) => { try { const jsonObject = JSON.parse(json); @@ -28,8 +26,6 @@ const getJSON = (json) => { return false; }; -const getUri = (uri) => uri.replace(process.cwd() + path.sep, ''); - const createAttribute = (tag = '') => { const parsedTag = tag.replace('@', '').split(':'); let attribute = null; @@ -48,59 +44,12 @@ const createAttribute = (tag = '') => { const createAttributes = (items) => (items ? items.map((item) => createAttribute(item.name)) : []); -const createTagComparator = (tagA) => (tagB) => - tagB.name === tagA.name && - tagB.location.line === tagA.location.line && - tagB.location.column === tagA.location.column; - const formatCodeRef = (pathName, itemName) => { const codeRef = pathName.replace(/\\/g, '/'); return itemName ? `${codeRef}/${itemName}` : codeRef; }; -const getParameters = (header, body) => { - const keys = header ? header.cells.map((cell) => cell.value) : []; - - if (Array.isArray(body)) { - return body.reduce((acc, item) => { - const params = item.cells.map((cell, index) => ({ - key: keys[index], - value: cell.value, - })); - - return acc.concat(params); - }, []); - } - - return body.cells.map((cell, index) => ({ - key: keys[index], - value: cell.value, - })); -}; - -function replaceParameter(originalString, name, value) { - return originalString.replace(new RegExp(`<${name}>`, 'g'), value); -} - -const getStepType = (keyword) => { - let type; - - switch (keyword) { - case 'Before': - type = 'BEFORE_TEST'; - break; - case 'After': - type = 'AFTER_TEST'; - break; - default: - type = 'STEP'; - break; - } - - return type; -}; - const findNode = (feature, searchId) => { return feature.children.find((child) => { if (child.rule) { @@ -164,15 +113,10 @@ const collectParams = ({ tableHeader, tableBody }) => { }; module.exports = { - createTagComparator, createAttribute, createAttributes, - getUri, getJSON, - getStepType, - getParameters, formatCodeRef, - replaceParameter, findNode, findScenario, detectLastScenario, diff --git a/package-lock.json b/package-lock.json index 4bd0fa0..25a1122 100644 --- a/package-lock.json +++ b/package-lock.json @@ -485,6 +485,317 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true + }, + "@cucumber/ci-environment": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-9.1.0.tgz", + "integrity": "sha512-jdnF6APXP3GawMue8kdMxhu6TBhyRUO4KDRxTowf06NtclLjIw2Ybpo9IcIOMvE8kHukvJyM00uxWX+CfS7JgQ==", + "dev": true + }, + "@cucumber/cucumber": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-8.8.0.tgz", + "integrity": "sha512-W70MuAF42hH0QgDHUgX1glSqDccJuF/kBbHquOf500gP1aOJczKtO9QgYtct1HvilCBYQLb9rou/hZA08jmMIQ==", + "dev": true, + "requires": { + "@cucumber/ci-environment": "9.1.0", + "@cucumber/cucumber-expressions": "16.0.0", + "@cucumber/gherkin": "24.1.0", + "@cucumber/gherkin-streams": "5.0.1", + "@cucumber/gherkin-utils": "8.0.1", + "@cucumber/html-formatter": "20.1.0", + "@cucumber/message-streams": "4.0.1", + "@cucumber/messages": "20.0.0", + "@cucumber/tag-expressions": "4.1.0", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.3", + "commander": "^9.0.0", + "debug": "^4.3.4", + "duration": "^0.2.2", + "durations": "^3.4.2", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^7.1.6", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "mz": "^2.7.0", + "progress": "^2.0.3", + "resolve-pkg": "^2.0.0", + "semver": "7.3.8", + "string-argv": "^0.3.1", + "strip-ansi": "6.0.1", + "supports-color": "^8.1.1", + "tmp": "^0.2.1", + "util-arity": "^1.1.0", + "verror": "^1.10.0", + "yup": "^0.32.11" + }, + "dependencies": { + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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 + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "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 + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@cucumber/cucumber-expressions": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-16.0.0.tgz", + "integrity": "sha512-HTh+Pg7oQ5aLuCkSbD2Q6jBaE40M3R/XaLEz+UqD5d9dZRu6P38W4LTooV5bV6dZgBunlMLK8+6ug2ziYvRddw==", + "dev": true, + "requires": { + "regexp-match-indices": "1.0.2" + } + }, + "@cucumber/gherkin": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-24.1.0.tgz", + "integrity": "sha512-B48XrUod4y3SoXe6mv12q7U1zThUNSK3yHSm/hBJCJZ6RJUJhFk3FVMN/83qOEbsYZe6iG9v+4L1Myf8/q8C6g==", + "dev": true, + "requires": { + "@cucumber/messages": "^19.1.4" + }, + "dependencies": { + "@cucumber/messages": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.4.tgz", + "integrity": "sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==", + "dev": true, + "requires": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + } + } + }, + "@cucumber/gherkin-streams": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", + "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "dev": true, + "requires": { + "commander": "9.1.0", + "source-map-support": "0.5.21" + }, + "dependencies": { + "commander": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", + "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "@cucumber/gherkin-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-8.0.1.tgz", + "integrity": "sha512-SjDcCYQMEX4yCUoOJU38+UZo2p0Mxh1WnvwoJ3rSnun5HhhLrAn2p/Hnbiq4kudYJkAuQcEXlFOllJ3ZTwztIg==", + "dev": true, + "requires": { + "@cucumber/gherkin": "^24.1.0", + "@cucumber/messages": "^19.1.4", + "@teppeis/multimaps": "2.0.0", + "commander": "9.4.1", + "source-map-support": "^0.5.21" + }, + "dependencies": { + "@cucumber/messages": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.4.tgz", + "integrity": "sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==", + "dev": true, + "requires": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + } + } + }, + "@cucumber/html-formatter": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-20.1.0.tgz", + "integrity": "sha512-bu2shjZuVGfAtKaw8ebCBxhgu3Eiaz/P7ZuSxrw9YCa6rOyxMX5zO+4f2FUBTK/AV0b9O5cAB/xitYBrGhlYKg==", + "dev": true + }, + "@cucumber/message-streams": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz", + "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", + "dev": true + }, + "@cucumber/messages": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-20.0.0.tgz", + "integrity": "sha512-JFrFwuhxsbig0afaViNhuzoQyC+GQzlI7m+rX+lSiDGV13K3sJzMmHjkbCiNOgoRlKAMwIGR9TRMH0xj9/My0w==", + "dev": true, + "requires": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + } + } + }, + "@cucumber/tag-expressions": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz", + "integrity": "sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1190,6 +1501,12 @@ "@sinonjs/commons": "^1.7.0" } }, + "@teppeis/multimaps": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@teppeis/multimaps/-/multimaps-2.0.0.tgz", + "integrity": "sha512-TL1adzq1HdxUf9WYduLcQ/DNGYiz71U31QRgbnr0Ef1cPyOUOsBojxHVWpFeOSUucB6Lrs0LxFRA14ntgtkc9w==", + "dev": true + }, "@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -1246,30 +1563,312 @@ "@types/node": "*" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "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.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.2.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.3.tgz", + "integrity": "sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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": { + "color-convert": "^1.9.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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "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.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true + }, + "expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "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": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "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" + } + } + } + }, + "@types/lodash": { + "version": "4.14.189", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", + "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", "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.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, "@types/node": { "version": "18.6.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.3.tgz", @@ -1288,6 +1887,12 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, "@types/yargs": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", @@ -1357,6 +1962,12 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -1410,6 +2021,17 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assertion-error-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "dev": true, + "requires": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -1576,9 +2198,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -1651,6 +2273,25 @@ "integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==", "dev": true }, + "capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1691,6 +2332,12 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "dev": true + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -1785,10 +2432,16 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "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=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "confusing-browser-globals": { "version": "1.0.9", @@ -1837,6 +2490,16 @@ } } }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1898,6 +2561,12 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", @@ -1913,6 +2582,22 @@ "esutils": "^2.0.2" } }, + "duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, + "durations": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/durations/-/durations-3.4.2.tgz", + "integrity": "sha512-V/lf7y33dGaypZZetVI1eu7BmvkbC4dItq12OElLRpKuaU5JxQstV2zHwLv8P7cNbQ+KL1WD80zMCTx5dNC4dg==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1948,6 +2633,15 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "requires": { + "stackframe": "^1.3.4" + } + }, "es-abstract": { "version": "1.17.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", @@ -1978,6 +2672,38 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2379,6 +3105,23 @@ "jest-util": "^28.1.3" } }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2600,6 +3343,15 @@ "is-glob": "^4.0.1" } }, + "global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -2638,6 +3390,23 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz", + "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2779,6 +3548,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2793,6 +3568,12 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, "inquirer": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", @@ -2936,12 +3717,28 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, "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 }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -4463,6 +5260,15 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "dev": true, + "requires": { + "seed-random": "~2.2.0" + } + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -4521,6 +5327,41 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4584,9 +5425,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -4618,18 +5459,59 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4804,6 +5686,15 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==", + "dev": true, + "requires": { + "repeat-string": "^1.5.2" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4957,6 +5848,12 @@ "sisteransi": "^1.0.5" } }, + "property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==", + "dev": true + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -4999,17 +5896,44 @@ "read-pkg": "^2.0.0" } }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, + "regexp-match-indices": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz", + "integrity": "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.11" + } + }, + "regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -5075,6 +5999,23 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve.exports": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", @@ -5128,6 +6069,12 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -5273,6 +6220,18 @@ } } }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -5511,6 +6470,24 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5547,6 +6524,12 @@ "is-number": "^7.0.0" } }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", + "dev": true + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -5575,6 +6558,12 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -5621,6 +6610,23 @@ "picocolors": "^1.0.0" } }, + "upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + } + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5629,6 +6635,12 @@ "punycode": "^2.1.0" } }, + "util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==", + "dev": true + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -5845,6 +6857,21 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + } } } } diff --git a/package.json b/package.json index 12d47eb..c29b667 100644 --- a/package.json +++ b/package.json @@ -3,13 +3,15 @@ "version": "5.0.2", "description": "Agent that connects cucumber-js with Report Portal", "main": "./modules/index", - "spec": "cucumber version >=4.x <=6.x", + "spec": "cucumber version >=4.x <=8.x", "dependencies": { "@reportportal/client-javascript": "^5.0.6", "cli-table3": "^0.6.0", "strip-ansi": "^6.0.1" }, "devDependencies": { + "@cucumber/cucumber": "^8.8.0", + "@types/jest": "^29.2.3", "eslint": "^6.8.0", "eslint-config-airbnb-base": "^14.0.0", "eslint-config-prettier": "^6.9.0", @@ -26,8 +28,8 @@ "scripts": { "lint": "eslint ./modules/**/*.js", "format": "npm run lint -- --fix", - "test": "exit 0", - "test:coverage": "exit 0" + "test": "jest", + "test:coverage": "jest --coverage" }, "repository": { "type": "git", diff --git a/tests/utils.spec.js b/tests/utils.spec.js index 0f3d59d..e76291b 100644 --- a/tests/utils.spec.js +++ b/tests/utils.spec.js @@ -18,28 +18,77 @@ const utils = require('../modules/utils'); const { scenarioId, featureWithRule, feature } = require('./data'); describe('utils', () => { - it('detectLastScenario should return true', () => { - const node = featureWithRule.children[0].rule; - expect(utils.detectLastScenario(node, scenarioId)).toBe(true); + describe('getJSON', () => { + it('getJSON should return object from JSON', () => { + const json = '{"key": "value"}'; + const expectedRes = { key: 'value' }; + expect(utils.getJSON(json)).toEqual(expectedRes); + }); + + it('getJSON should return false if param not JSON', () => { + expect(utils.getJSON()).toBeFalsy(); + }); }); - it('detectLastScenario should return false', () => { - const node = featureWithRule.children[0].rule; - node.children.push({ scenario: { id: 'abc' } }); + it('createAttribute should return attribute object from tag string', () => { + expect(utils.createAttribute('@key:value')).toEqual({ key: 'key', value: 'value' }); + expect(utils.createAttribute('value')).toEqual({ value: 'value' }); + expect(utils.createAttribute()).toEqual({ value: '' }); + }); + + describe('createAttributes', () => { + it('createAttributes should return array of attributes', () => { + const tag = [{ name: '@platform:windows10' }]; - expect(utils.detectLastScenario(node, scenarioId)).toBe(false); + expect(utils.createAttributes(tag)).toEqual([{ key: 'platform', value: 'windows10' }]); + }); + + it('createAttributes should return an empty array if no argument was passed', () => { + expect(utils.createAttributes()).toEqual([]); + }); }); - it('findNode return node by scenario id', () => { - const expectedRes = feature.children[0]; + describe('formatCodeRef', () => { + const pathName = 'feature\\check-title'; + + it('formatCodeRef should return formatted code reference', () => { + expect(utils.formatCodeRef(pathName)).toBe('feature/check-title'); + }); - expect(utils.findNode(feature, scenarioId)).toBe(expectedRes); + it('formatCodeRef should return formatted code reference with item name', () => { + expect(utils.formatCodeRef(pathName, 'Go to the web site')).toBe( + 'feature/check-title/Go to the web site', + ); + }); }); - it('findNode return node by scenario id from feature with rule', () => { - const expectedRes = featureWithRule.children[0]; + describe('detectLastScenario', () => { + it('detectLastScenario should return true', () => { + const node = featureWithRule.children[0].rule; + + expect(utils.detectLastScenario(node, scenarioId)).toBe(true); + }); - expect(utils.findNode(featureWithRule, scenarioId)).toBe(expectedRes); + it('detectLastScenario should return false', () => { + const node = featureWithRule.children[0].rule; + node.children.push({ scenario: { id: 'abc' } }); + + expect(utils.detectLastScenario(node, scenarioId)).toBe(false); + }); + }); + + describe('findNode', () => { + it('findNode return node by scenario id', () => { + const expectedRes = feature.children[0]; + + expect(utils.findNode(feature, scenarioId)).toBe(expectedRes); + }); + + it('findNode return node by scenario id from feature with rule', () => { + const expectedRes = featureWithRule.children[0]; + + expect(utils.findNode(featureWithRule, scenarioId)).toBe(expectedRes); + }); }); it('findScenario return scenario obj by scenario id', () => { @@ -62,4 +111,21 @@ describe('utils', () => { expect(instance.newMethod).toBeTruthy(); }); + + it('collectParams should create map from tableHeader & tableBody', () => { + const tableHeader = { + cells: [{ value: 'parameterKey' }], + }; + const tableBody = [ + { + id: '7ecb2351-5f6d-495b-b995-aa9366f5fe52', + cells: [{ value: 'parameterValue' }], + }, + ]; + const expectedRes = { + '7ecb2351-5f6d-495b-b995-aa9366f5fe52': [{ key: 'parameterKey', value: 'parameterValue' }], + }; + + expect(utils.collectParams({ tableHeader, tableBody })).toEqual(expectedRes); + }); }); From 1999eea098674546c149d99f98c6c4e6f86348a6 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Mon, 28 Nov 2022 16:11:13 +0200 Subject: [PATCH 20/21] EPMRPP-80545 || release preparation (#114) * EPMRPP-80545 || release preparation * EPMRPP-80545 || code review fixes - 1 * EPMRPP-80545 || move retry flag to testCase storage * EPMRPP-80545 || code review fixes - 2 Co-authored-by: Mikhail Sidarkevich --- CHANGELOG.md | 6 + README.md | 28 +-- modules/api/current.js | 16 +- modules/api/deprecated/README.md | 316 +++++++++++++++++++++++++++++++ package.json | 3 +- version_fragment | 2 +- 6 files changed, 337 insertions(+), 34 deletions(-) create mode 100644 modules/api/deprecated/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 2705aec..fbb8d75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ +### Added +- Added support for 7-8 versions of `@cucumber/cucumber` package + ### Changed - Package size reduced +### Updated +- `@reportportal/client-javascript` version to the latest + ## [5.0.2] - 2021-06-23 ### Fixed - Launch status calculation diff --git a/README.md b/README.md index bd957f3..402c3d4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ Agent for integration CucumberJS with ReportPortal. * More about [CucumberJS](https://cucumber.io/docs/installation/javascript/) * More about [ReportPortal](http://reportportal.io/) -This agent works well with cucumber versions from 4.x to 6.x inclusive. +This agent works well with cucumber versions from 7.x. +Documentation for legacy cucumber versions from 4.x to 6.x can be found [here](/modules/api/deprecated/README.md) ## Install agent to your project dir @@ -53,7 +54,6 @@ npm install --save-dev @reportportal/agent-js-cucumber "endpoint": "${rp.endpoint}/api/v1", "launch": "${rp.launch}", "project": "${rp.your_project}", - "takeScreenshot": "onFailure", "description": "Awesome launch description.", "attributes": [ { @@ -69,9 +69,8 @@ npm install --save-dev @reportportal/agent-js-cucumber } ``` - `takeScreenshot` - if this option is defined then framework will take screenshot with _protractor or webdriver_ API if step has failed
`mode` - Launch mode. Allowable values *DEFAULT* (by default) or *DEBUG*.
- `debug` - this flag allows seeing the logs of the `client-javascript`. Useful for debugging. + `debug` - this flag allows seeing the logs of the `client-javascript`. Useful for debugging.
`restClientConfig` (optional) - The object with `agent` property for configure [http(s)](https://nodejs.org/api/https.html#https_https_request_url_options_callback) client, may contain other client options eg. `timeout`. 3. Create Report Portal formatter in a new js file, for example `reportPortalFormatter.js`: @@ -86,7 +85,7 @@ npm install --save-dev @reportportal/agent-js-cucumber 4. Import RPWorld (provides API for logging and data attaching) into /features/step_definitions/support/world.js ```javascript - let { setWorldConstructor } = require('cucumber'); + let { setWorldConstructor } = require('@cucumber/cucumber'); let { RPWorld } = require('@reportportal/agent-js-cucumber'); setWorldConstructor(RPWorld); ``` @@ -120,8 +119,6 @@ npm install --save-dev @reportportal/agent-js-cucumber More info in the [examples](https://github.com/reportportal/examples-js/tree/master/example-cucumber) repository. -### TODO parallel launch - ## Rerun To report [rerun](https://github.com/reportportal/documentation/blob/master/src/md/src/DevGuides/rerun.md) to the report portal you need to specify the following options to the config file: @@ -160,23 +157,6 @@ To report your steps as logs, you need to pass an additional parameter to the ag This will report your your steps with logs to a log level without creating statistics for every step. -## Reporting skipped cucumber steps as failed - -By default, cucumber marks steps which follow a failed step as `skipped`. -When `scenarioBasedStatistics` is set to `false` (the default behavior) -Report Portal reports these steps as failures to investigate. - -To change this behavior and instead mark skipped steps which follow a failed step as `cancelled`, -you need to add an additional parameter to the agent config: `"reportSkippedCucumberStepsOnFailedTest": false` - -```json -{ - "reportSkippedCucumberStepsOnFailedTest": false -} -``` - -Steps which are marked as `skipped` that do not follow a failed step will continue to mark the step and the scenario as `skipped`. - ## API ### Attachments diff --git a/modules/api/current.js b/modules/api/current.js index 00b83c3..99e5f47 100644 --- a/modules/api/current.js +++ b/modules/api/current.js @@ -32,7 +32,6 @@ module.exports = { this.storage = new Storage(); this.customLaunchStatus = null; this.codeRefIndexesMap = new Map(); - this.isRetry = false; this.options.eventBroadcaster.on('envelope', (event) => { const [key] = Object.keys(event); @@ -121,7 +120,7 @@ module.exports = { onTestCaseStartedEvent(data) { const { id, testCaseId, attempt } = data; this.storage.setTestCaseStartedId(id, testCaseId); - const { pickleId } = this.storage.getTestCase(testCaseId); + const { pickleId, isRetry: isTestCaseRetried } = this.storage.getTestCase(testCaseId); const { uri: pickleFeatureUri, astNodeIds: [scenarioId, parametersId], @@ -186,8 +185,10 @@ module.exports = { scenario = currentNode.scenario; } + let isRetry = isTestCaseRetried; if (attempt > 0) { - this.isRetry = true; + isRetry = true; + this.storage.updateTestCase(testCaseId, { isRetry }); if (!this.isScenarioBasedStatistics) return; } @@ -200,11 +201,11 @@ module.exports = { const scenarioCodeRefIndexValue = this.codeRefIndexesMap.get(currentNodeCodeRef); this.codeRefIndexesMap.set(currentNodeCodeRef, (scenarioCodeRefIndexValue || 0) + 1); const name = - scenarioCodeRefIndexValue && !this.isRetry + scenarioCodeRefIndexValue && !isRetry ? `${scenarioName} [${scenarioCodeRefIndexValue}]` : scenarioName; const scenarioCodeRef = - scenarioCodeRefIndexValue && !this.isRetry + scenarioCodeRefIndexValue && !isRetry ? `${currentNodeCodeRef} [${scenarioCodeRefIndexValue}]` : currentNodeCodeRef; const testData = { @@ -244,7 +245,7 @@ module.exports = { const stepCodeRefIndexValue = this.codeRefIndexesMap.get(codeRef); this.codeRefIndexesMap.set(codeRef, (stepCodeRefIndexValue || 0) + 1); const name = - stepCodeRefIndexValue && !this.isRetry + stepCodeRefIndexValue && !testCase.isRetry ? `${stepName} [${stepCodeRefIndexValue}]` : stepName; @@ -254,7 +255,7 @@ module.exports = { type, codeRef, hasStats: !this.isScenarioBasedStatistics, - retry: !this.isScenarioBasedStatistics && this.isRetry, + retry: !this.isScenarioBasedStatistics && !!testCase.isRetry, }; if (!this.isScenarioBasedStatistics && step.astNodeIds && step.astNodeIds.length > 1) { @@ -470,7 +471,6 @@ module.exports = { this.storage.removeSteps(testCaseId); this.storage.removeTestCase(testCaseId); this.storage.setScenarioTempId(null); - this.isRetry = false; } }, onTestRunFinishedEvent() { diff --git a/modules/api/deprecated/README.md b/modules/api/deprecated/README.md new file mode 100644 index 0000000..de0c9d0 --- /dev/null +++ b/modules/api/deprecated/README.md @@ -0,0 +1,316 @@ +## THIS IS DOCUMENTATION FOR DEPRECATED VERSION CUCUMBER FRAMEWORK
PLEASE USE CUCUMBER VERSION FROM 7 OR HIGHER + +# agent-js-cucumber + +Agent for integration CucumberJS with ReportPortal. +* More about [CucumberJS](https://cucumber.io/docs/installation/javascript/) +* More about [ReportPortal](http://reportportal.io/) + +This agent works well with cucumber versions from 4.x to 6.x inclusive. + +## Install agent to your project dir + +```cmd +npm install --save-dev @reportportal/agent-js-cucumber +``` + +1. Make sure that you required glue code correctly. It is important to make Cucumber see support code. + For example: + Let's say you have project structure like this below + + ``` + my-project + L features + L step_definitions + L steps.js + L support + L hooks.js + L world.js + L package.json + ``` + + #### Note + + Protractor and Cucumber have their own **timeouts** . + When protractror start main process that lauches cucumber it would have different timeouts if there not the same they would wait for scripts different time. + If cucumbers's timeout less then protractor's it would through wrong exeption. + For example if page that has been loaded and hasn't got angular, the next error would be thrown : `Error: function timed out after 10000 milliseconds . . .` . Instead of protractor's : + `Error: Error while running testForAngular: asynchronous script timeout: result was not received in 4 seconds . . .` . + So it must be handled manually by setting cucumbers's timeout greater then protractor's is at the hooks.js. For example if you set up protractor's timeout 9000 miliseconds , so cucumber must be at least 1 second greater = 10000 miliseconds. Example : + + ```javascript + var { setDefaultTimeout } = require('cucumber'); + + setDefaultTimeout(10000); + ``` + +2. Create Report Portal configuration file + For example `./rpConfig.json` + + In example below `${text}` - is used as placeholder for your data. This data you must get from ReportPortal profile. + + ```json + { + "token": "${rp.token}", + "endpoint": "${rp.endpoint}/api/v1", + "launch": "${rp.launch}", + "project": "${rp.your_project}", + "takeScreenshot": "onFailure", + "description": "Awesome launch description.", + "attributes": [ + { + "key": "launchAttributeKey", + "value": "launchAttributeValue" + } + ], + "mode": "DEFAULT", + "debug": false, + "restClientConfig": { + "timeout": 0 + } + } + ``` + + `takeScreenshot` - if this option is defined then framework will take screenshot with _protractor or webdriver_ API if step has failed
+ `mode` - Launch mode. Allowable values *DEFAULT* (by default) or *DEBUG*.
+ `debug` - this flag allows seeing the logs of the `client-javascript`. Useful for debugging. + `restClientConfig` (optional) - The object with `agent` property for configure [http(s)](https://nodejs.org/api/https.html#https_https_request_url_options_callback) client, may contain other client options eg. `timeout`. + +3. Create Report Portal formatter in a new js file, for example `reportPortalFormatter.js`: + + ```javascript + const { createRPFormatterClass } = require('@reportportal/agent-js-cucumber'); + const config = require('./rpConfig.json'); + + module.exports = createRPFormatterClass(config); + ``` + +4. Import RPWorld (provides API for logging and data attaching) into /features/step_definitions/support/world.js + + ```javascript + let { setWorldConstructor } = require('cucumber'); + let { RPWorld } = require('@reportportal/agent-js-cucumber'); + setWorldConstructor(RPWorld); + ``` + + If you have other world constructors it must be used with the RPWorld as shown below + + ```javascript + class CustomWorld extends RPWorld { + constructor(...args) { + super(...args); + + /* + * any driver container must be named 'browser', because reporter could be used with cucumber + * and protractor. And protractor has global object browser which contains all web-driver methods + */ + global.browser = new seleniumWebdriver.Builder().forBrowser('chrome').build(); + } + } + + setWorldConstructor(CustomWorld); + ``` + + It will allow you send logs and screenshots to RP directly from step definitions. + **All this logs would be attached to test data and could be viewed at the Report Portal**.
+ Also you will be able to specify additional info for test items (e.g. description, attributes, testCaseId, status). + See [API](#api) section for more information. + +5. Run cucumber-js + + `cucumber-js -f ./reportPortalFormatter.js` + + More info in the [examples](https://github.com/reportportal/examples-js/tree/master/example-cucumber) repository. + +### TODO parallel launch + +## Rerun + +To report [rerun](https://github.com/reportportal/documentation/blob/master/src/md/src/DevGuides/rerun.md) to the report portal you need to specify the following options to the config file: + +- rerun - to enable rerun +- rerunOf - UUID of launch you want to rerun. If not specified, report portal will update the latest launch with the same name + +Example: + +```json + "rerun": true, + "rerunOf": "f68f39f9-279c-4e8d-ac38-1216dffcc59c" +``` + +## Step reporting configuration + +By default, this agent reports the following structure: + +- feature - SUITE +- scenario - TEST +- step - STEP + +You may change this behavior to report steps to the log level by enabling scenario-based reporting: + +- feature - TEST +- scenario - STEP +- step - log item + +To report your steps as logs, you need to pass an additional parameter to the agent config: `"scenarioBasedStatistics": true` + +```json +{ + "scenarioBasedStatistics": true +} +``` + +This will report your your steps with logs to a log level without creating statistics for every step. + +## Reporting skipped cucumber steps as failed + +By default, cucumber marks steps which follow a failed step as `skipped`. +When `scenarioBasedStatistics` is set to `false` (the default behavior) +Report Portal reports these steps as failures to investigate. + +To change this behavior and instead mark skipped steps which follow a failed step as `cancelled`, +you need to add an additional parameter to the agent config: `"reportSkippedCucumberStepsOnFailedTest": false` + +```json +{ + "reportSkippedCucumberStepsOnFailedTest": false +} +``` + +Steps which are marked as `skipped` that do not follow a failed step will continue to mark the step and the scenario as `skipped`. + +## API + +### Attachments + +Attachments are being reported as logs. You can either just attach a file using cucumber's `this.attach` or specify log level and message: + +```javascript +this.attach( + JSON.stringify({ + message: `Attachment with ${type}`, + level: 'INFO', + data: data.toString('base64'), + }), + type, +); +``` +To send attachment to the launch just specify `entity: 'launch'` property. + +Also `this.screenshot` and `this.launchScreenshot` methods can be used to take screenshots. + +```javascript +Then(/^I should see my new task in the list$/, function(callback) { + this.screenshot('This screenshot') + .then(() => callback()) + .catch((err) => callback(err)); + this.launchScreenshot('This is screenshot for launch') + .then(() => callback()) + .catch((err) => callback(err)); +}); +``` + +`screenshot`/`launchScreenshot` function return promise fulfilled after `screenshot` is taken and image added to attachments. +Handler will parse attachments and send corresponding log to the step item. + +### Logs + +To report logs to the **items** you can use the next methods: + +```javascript +Then(/^I should see my new task in the list$/, function() { + this.info('This is Info Level log'); + this.debug('This is Debug Level log'); + this.error('This is Error Level log'); + this.warn('This is Warn Level log'); + this.trace('This is Trace Level log'); + this.fatal('This is Fatal Level log'); +}); +``` + +To report logs to the **launch** you can use the next methods: + +```javascript +Then(/^I should see my new task in the list$/, function() { + this.launchInfo('This is Info Level log'); + this.launchDebug('This is Debug Level log'); + this.launchError('This is Error Level log'); + this.launchWarn('This is Warn Level log'); + this.launchTrace('This is Trace Level log'); + this.launchFatal('This is Fatal Level log'); +}); +``` + +### Attributes + +Attributes for features and scenarios are parsed from @tags as `@key:value` pair. + +To add attributes to the items you can use the next method: + +```javascript +Then(/^I should see my new task in the list$/, function() { + this.addAttributes([{ key: 'agent', value: 'cucumber' }]); +}); +``` + +The attributes will be concatenated. + +### Description + +Description for features and scenarios are parsed from their definition. + +To add description to the items you can use the following method: + +```javascript +Then(/^I should see my new task in the list$/, function() { + this.addDescription('Test item description.'); +}); +``` + +The description will be concatenated. + +### TestCaseId + +To set test case id to the items you can use the following method: + +```javascript +Then(/^I should see my new task in the list$/, function() { + this.setTestCaseId('itemTestCaseId'); +}); +``` + +### Statuses + +The user can set the status of the item/launch directly depending on some conditions or behavior. +It will take precedence over the actual completed status. + +To set status to the **item** you can use the next methods: + +```javascript +Then(/^I should see my new task in the list$/, function() { + this.setStatusPassed(); + this.setStatusFailed(); + this.setStatusSkipped(); + this.setStatusStopped(); + this.setStatusInterrupted(); + this.setStatusCancelled(); +}); +``` + +To set status to the **item** you can use the next methods: + +```javascript +Then(/^I should see my new task in the list$/, function() { + this.setLaunchStatusPassed(); + this.setLaunchStatusFailed(); + this.setLaunchStatusSkipped(); + this.setLaunchStatusStopped(); + this.setLaunchStatusInterrupted(); + this.setLaunchStatusCancelled(); +}); +``` + +# Copyright Notice + +Licensed under the [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) +license (see the LICENSE.txt file). diff --git a/package.json b/package.json index c29b667..7f8b6e5 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "prettier": "^1.19.1" }, "peerDependencies": { - "cucumber": "4.x - 6.x" + "cucumber": "4.x - 6.x", + "@cucumber/cucumber": "7.x - 8.x" }, "scripts": { "lint": "eslint ./modules/**/*.js", diff --git a/version_fragment b/version_fragment index 9eb7b90..acb503f 100644 --- a/version_fragment +++ b/version_fragment @@ -1 +1 @@ -patch +minor From e092050d66325372f1ea44eb23918a05cc223076 Mon Sep 17 00:00:00 2001 From: Mikhail Sidarkevich <42434528+chivekrodis@users.noreply.github.com> Date: Tue, 29 Nov 2022 10:42:06 +0200 Subject: [PATCH 21/21] EPMRPP-80545 || update changelog (#116) Co-authored-by: Mikhail Sidarkevich --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbb8d75..e26d496 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,6 @@ ### Added - Added support for 7-8 versions of `@cucumber/cucumber` package -### Changed -- Package size reduced - ### Updated - `@reportportal/client-javascript` version to the latest