diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..578d9e7 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "root": true, + "extends": "semistandard" +} diff --git a/.gitignore b/.gitignore index a63cfae..13f2fa1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,3 @@ -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Deployed apps should consider commenting this line out: -# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git -node_modules - -dist \ No newline at end of file +/dist +/node_modules +/*.log diff --git a/index.js b/index.js index 438379e..0a08842 100644 --- a/index.js +++ b/index.js @@ -1,11 +1,11 @@ -import QUnitAdapter from './lib/adapters/QUnitAdapter.js' -import JasmineAdapter from './lib/adapters/JasmineAdapter.js' -import MochaAdapter from './lib/adapters/MochaAdapter.js' -import TapReporter from './lib/reporters/TapReporter.js' -import ConsoleReporter from './lib/reporters/ConsoleReporter.js' -import {Assertion, TestStart, TestEnd, SuiteStart, SuiteEnd} from './lib/Data.js' +import QUnitAdapter from './lib/adapters/QUnitAdapter.js'; +import JasmineAdapter from './lib/adapters/JasmineAdapter.js'; +import MochaAdapter from './lib/adapters/MochaAdapter.js'; +import TapReporter from './lib/reporters/TapReporter.js'; +import ConsoleReporter from './lib/reporters/ConsoleReporter.js'; +import {Assertion, TestStart, TestEnd, SuiteStart, SuiteEnd} from './lib/Data.js'; import {autoRegister, createSuiteStart, createTestStart, - createTestEnd, createSuiteEnd} from './lib/helpers.js' + createTestEnd, createSuiteEnd} from './lib/helpers.js'; export default { QUnitAdapter, @@ -23,4 +23,4 @@ export default { createTestEnd, createSuiteEnd, autoRegister -} +}; diff --git a/karma.conf.js b/karma.conf.js index 094767f..4491534 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -42,5 +42,5 @@ module.exports = function (config) { browsers: ['PhantomJS'], singleRun: true, concurrency: Infinity - }) -} + }); +}; diff --git a/lib/Data.js b/lib/Data.js index 2040f42..f252fa2 100644 --- a/lib/Data.js +++ b/lib/Data.js @@ -1,67 +1,67 @@ function getAllTests (suite) { var childSuiteTests = suite.childSuites .map((childSuite) => getAllTests(childSuite)) - .reduce((allTests, a) => allTests.concat(a), []) + .reduce((allTests, a) => allTests.concat(a), []); - return suite.tests.concat(childSuiteTests) + return suite.tests.concat(childSuiteTests); } function getRuntime (suite) { if (suite.status === 'skipped' || suite.status === undefined) { - return undefined + return undefined; } return getAllTests(suite) .map((test) => test.status === 'skipped' ? 0 : test.runtime) - .reduce((sum, testRuntime) => sum + testRuntime, 0) + .reduce((sum, testRuntime) => sum + testRuntime, 0); } function getStatus (suite) { - var passed = 0 - var failed = 0 - var skipped = 0 - var todo = 0 - var tests = getAllTests(suite) + var passed = 0; + var failed = 0; + var skipped = 0; + var todo = 0; + var tests = getAllTests(suite); for (let i = 0; i < tests.length; i++) { - let test = tests[i] + let test = tests[i]; // If a suite contains a test whose status is still undefined, // there is no final status for the suite as well. if (test.status === undefined) { - return undefined + return undefined; } else if (test.status === 'passed') { - passed++ + passed++; } else if (test.status === 'skipped') { - skipped++ + skipped++; } else if (test.status === 'todo') { - todo++ + todo++; } else { - failed++ + failed++; } } if (failed > 0) { - return 'failed' + return 'failed'; } else if (skipped > 0 && passed === 0) { - return 'skipped' + return 'skipped'; } else if (todo > 0 && passed === 0) { - return 'todo' + return 'todo'; } else { - return 'passed' + return 'passed'; } } function getSuiteStartTestCounts (suite) { - var tests = getAllTests(suite) + var tests = getAllTests(suite); return { total: tests.length - } + }; } function getSuiteEndTestCounts (suite) { - var tests = getAllTests(suite) + var tests = getAllTests(suite); return { passed: tests.filter((test) => test.status === 'passed').length, @@ -69,7 +69,7 @@ function getSuiteEndTestCounts (suite) { skipped: tests.filter((test) => test.status === 'skipped').length, todo: tests.filter((test) => test.status === 'todo').length, total: tests.length - } + }; } export class Assertion { @@ -82,12 +82,12 @@ export class Assertion { * @param {Boolean} todo */ constructor (passed, actual, expected, message, stack, todo) { - this.passed = passed - this.actual = actual - this.expected = expected - this.message = message - this.stack = stack - this.todo = todo + this.passed = passed; + this.actual = actual; + this.expected = expected; + this.message = message; + this.stack = stack; + this.todo = todo; } } @@ -98,9 +98,9 @@ export class TestStart { * @param {String[]} fullName */ constructor (name, suiteName, fullName) { - this.name = name - this.suiteName = suiteName - this.fullName = fullName + this.name = name; + this.suiteName = suiteName; + this.fullName = fullName; } } @@ -115,13 +115,13 @@ export class TestEnd { * @param {Assertion[]} assertions */ constructor (name, suiteName, fullName, status, runtime, errors, assertions) { - this.name = name - this.suiteName = suiteName - this.fullName = fullName - this.status = status - this.runtime = runtime - this.errors = errors - this.assertions = assertions + this.name = name; + this.suiteName = suiteName; + this.fullName = fullName; + this.status = status; + this.runtime = runtime; + this.errors = errors; + this.assertions = assertions; } } @@ -133,11 +133,11 @@ export class SuiteStart { * @param {Suite[]} childSuites */ constructor (name, fullName, tests, childSuites, testCounts) { - this.name = name - this.fullName = fullName - this.tests = tests - this.childSuites = childSuites - this.testCounts = getSuiteStartTestCounts(this) + this.name = name; + this.fullName = fullName; + this.tests = tests; + this.childSuites = childSuites; + this.testCounts = getSuiteStartTestCounts(this); } } @@ -157,12 +157,12 @@ export class SuiteEnd { */ constructor (name, fullName, tests, childSuites, status, testCounts, runtime) { - this.name = name - this.fullName = fullName - this.tests = tests - this.childSuites = childSuites - this.status = status || getStatus(this) - this.testCounts = testCounts || getSuiteEndTestCounts(this) - this.runtime = runtime || getRuntime(this) + this.name = name; + this.fullName = fullName; + this.tests = tests; + this.childSuites = childSuites; + this.status = status || getStatus(this); + this.testCounts = testCounts || getSuiteEndTestCounts(this); + this.runtime = runtime || getRuntime(this); } } diff --git a/lib/adapters/JasmineAdapter.js b/lib/adapters/JasmineAdapter.js index 9e4b438..51d71e0 100644 --- a/lib/adapters/JasmineAdapter.js +++ b/lib/adapters/JasmineAdapter.js @@ -1,6 +1,6 @@ -import EventEmitter from 'events' -import {Assertion, TestEnd, SuiteStart} from '../Data.js' -import * as helpers from '../helpers.js' +import EventEmitter from 'events'; +import {Assertion, TestEnd, SuiteStart} from '../Data.js'; +import * as helpers from '../helpers.js'; /** * Limitations: @@ -8,13 +8,13 @@ import * as helpers from '../helpers.js' */ export default class JasmineAdapter extends EventEmitter { constructor (jasmine) { - super() + super(); - this.jasmine = jasmine + this.jasmine = jasmine; // NodeJS/browser - this.env = jasmine.env || jasmine.getEnv() - this.suites = {} - this.tests = {} + this.env = jasmine.env || jasmine.getEnv(); + this.suites = {}; + this.tests = {}; var reporter = { jasmineStarted: this.onJasmineStarted.bind(this), @@ -23,49 +23,49 @@ export default class JasmineAdapter extends EventEmitter { suiteStarted: this.onSuiteStarted.bind(this), suiteDone: this.onSuiteDone.bind(this), jasmineDone: this.onJasmineDone.bind(this) - } + }; // For NodeJS env use the "addReporter" function from the node package. if (this.jasmine.addReporter) { - this.jasmine.addReporter(reporter) + this.jasmine.addReporter(reporter); } else { // For browser env use the "addReporter" function from the jasmine-core. - this.env.addReporter(reporter) + this.env.addReporter(reporter); } } createAssertion (expectation) { - let stack = expectation.stack !== '' ? expectation.stack : undefined + let stack = expectation.stack !== '' ? expectation.stack : undefined; return new Assertion(expectation.passed, expectation.actual, - expectation.expected, expectation.message, stack) + expectation.expected, expectation.message, stack); } saveTestDetails (jasmineSpec) { - var test = this.tests[jasmineSpec.id] + var test = this.tests[jasmineSpec.id]; - test.errors = [] - test.assertions = [] + test.errors = []; + test.assertions = []; jasmineSpec.failedExpectations.forEach((expectation) => { - test.errors.push(this.createAssertion(expectation)) - test.assertions.push(this.createAssertion(expectation)) - }) + test.errors.push(this.createAssertion(expectation)); + test.assertions.push(this.createAssertion(expectation)); + }); jasmineSpec.passedExpectations.forEach((expectation) => { - test.assertions.push(this.createAssertion(expectation)) - }) + test.assertions.push(this.createAssertion(expectation)); + }); if (jasmineSpec.status === 'pending') { - test.status = 'skipped' + test.status = 'skipped'; } else { - test.status = jasmineSpec.status - test.runtime = new Date() - this.startTime + test.status = jasmineSpec.status; + test.runtime = new Date() - this.startTime; } } isJasmineGlobalSuite (suite) { - return suite.description === 'Jasmine__TopLevel__Suite' + return suite.description === 'Jasmine__TopLevel__Suite'; } /** @@ -77,66 +77,66 @@ export default class JasmineAdapter extends EventEmitter { * object using as key their unique ids provided by Jasmine. */ createGlobalSuite (jasmineSuite, fullName) { - var childSuites = [] - var tests = [] - var isGlobalSuite = this.isJasmineGlobalSuite(jasmineSuite) + var childSuites = []; + var tests = []; + var isGlobalSuite = this.isJasmineGlobalSuite(jasmineSuite); if (!isGlobalSuite) { - fullName.push(jasmineSuite.description) + fullName.push(jasmineSuite.description); } jasmineSuite.children.forEach((child) => { if (child.id.indexOf('suite') === 0) { - childSuites.push(this.createGlobalSuite(child, fullName)) + childSuites.push(this.createGlobalSuite(child, fullName)); } else { - let test - let suiteName = !isGlobalSuite ? jasmineSuite.description : undefined + let test; + let suiteName = !isGlobalSuite ? jasmineSuite.description : undefined; - fullName.push(child.description) + fullName.push(child.description); - test = new TestEnd(child.description, suiteName, fullName.slice()) + test = new TestEnd(child.description, suiteName, fullName.slice()); - fullName.pop() + fullName.pop(); - tests.push(test) - this.tests[child.id] = test + tests.push(test); + this.tests[child.id] = test; } - }) + }); - let name = !isGlobalSuite ? jasmineSuite.description : undefined - let suite = new SuiteStart(name, fullName.slice(), tests, childSuites) + let name = !isGlobalSuite ? jasmineSuite.description : undefined; + let suite = new SuiteStart(name, fullName.slice(), tests, childSuites); - this.suites[jasmineSuite.id] = suite + this.suites[jasmineSuite.id] = suite; - fullName.pop() + fullName.pop(); - return suite + return suite; } onJasmineStarted () { - this.globalSuite = this.createGlobalSuite(this.env.topSuite(), []) - this.emit('runStart', helpers.createSuiteStart(this.globalSuite)) + this.globalSuite = this.createGlobalSuite(this.env.topSuite(), []); + this.emit('runStart', helpers.createSuiteStart(this.globalSuite)); } onSpecStarted (details) { - this.startTime = new Date() - this.emit('testStart', helpers.createTestStart(this.tests[details.id])) + this.startTime = new Date(); + this.emit('testStart', helpers.createTestStart(this.tests[details.id])); } onSpecDone (details) { - this.saveTestDetails(details) - this.emit('testEnd', helpers.createTestEnd(this.tests[details.id])) + this.saveTestDetails(details); + this.emit('testEnd', helpers.createTestEnd(this.tests[details.id])); } onSuiteStarted (details) { - this.emit('suiteStart', helpers.createSuiteStart(this.suites[details.id])) + this.emit('suiteStart', helpers.createSuiteStart(this.suites[details.id])); } onSuiteDone (details) { - this.emit('suiteEnd', helpers.createSuiteEnd(this.suites[details.id])) + this.emit('suiteEnd', helpers.createSuiteEnd(this.suites[details.id])); } onJasmineDone () { - this.emit('runEnd', helpers.createSuiteEnd(this.globalSuite)) + this.emit('runEnd', helpers.createSuiteEnd(this.globalSuite)); } } diff --git a/lib/adapters/MochaAdapter.js b/lib/adapters/MochaAdapter.js index 85abd0f..5e19e11 100644 --- a/lib/adapters/MochaAdapter.js +++ b/lib/adapters/MochaAdapter.js @@ -1,29 +1,29 @@ -import EventEmitter from 'events' -import {Assertion, TestStart, TestEnd, SuiteStart, SuiteEnd} from '../Data.js' +import EventEmitter from 'events'; +import {Assertion, TestStart, TestEnd, SuiteStart, SuiteEnd} from '../Data.js'; export default class MochaAdapter extends EventEmitter { constructor (mocha) { - super() + super(); - this.mocha = mocha - this.origReporter = mocha._reporter + this.mocha = mocha; + this.origReporter = mocha._reporter; mocha.reporter((runner) => { - this.runner = runner + this.runner = runner; // eslint-disable-next-line no-unused-vars let origReporterInstance = new (this.origReporter.bind(this.mocha, - this.runner))() - - runner.on('start', this.onStart.bind(this)) - runner.on('suite', this.onSuite.bind(this)) - runner.on('test', this.onTest.bind(this)) - runner.on('pending', this.onPending.bind(this)) - runner.on('fail', this.onFail.bind(this)) - runner.on('test end', this.onTestEnd.bind(this)) - runner.on('suite end', this.onSuiteEnd.bind(this)) - runner.on('end', this.onEnd.bind(this)) - }) + this.runner))(); + + runner.on('start', this.onStart.bind(this)); + runner.on('suite', this.onSuite.bind(this)); + runner.on('test', this.onTest.bind(this)); + runner.on('pending', this.onPending.bind(this)); + runner.on('fail', this.onFail.bind(this)); + runner.on('test end', this.onTestEnd.bind(this)); + runner.on('suite end', this.onSuiteEnd.bind(this)); + runner.on('end', this.onEnd.bind(this)); + }); } convertToSuiteStart (mochaSuite) { @@ -32,7 +32,7 @@ export default class MochaAdapter extends EventEmitter { this.buildSuiteFullName(mochaSuite), mochaSuite.tests.map(this.convertTest.bind(this)), mochaSuite.suites.map(this.convertToSuiteStart.bind(this)) - ) + ); } convertToSuiteEnd (mochaSuite) { @@ -41,78 +41,78 @@ export default class MochaAdapter extends EventEmitter { this.buildSuiteFullName(mochaSuite), mochaSuite.tests.map(this.convertTest.bind(this)), mochaSuite.suites.map(this.convertToSuiteEnd.bind(this)) - ) + ); } convertTest (mochaTest) { - var suiteName - var fullName + var suiteName; + var fullName; if (!mochaTest.parent.root) { - suiteName = mochaTest.parent.title - fullName = this.buildSuiteFullName(mochaTest.parent) + suiteName = mochaTest.parent.title; + fullName = this.buildSuiteFullName(mochaTest.parent); // Add also the test name. - fullName.push(mochaTest.title) + fullName.push(mochaTest.title); } else { - fullName = [mochaTest.title] + fullName = [mochaTest.title]; } // If the test has the errors attached a "test end" must be emitted, else // a "test start". if (mochaTest.errors !== undefined) { - var status = (mochaTest.state === undefined) ? 'skipped' : mochaTest.state - let errors = [] + var status = (mochaTest.state === undefined) ? 'skipped' : mochaTest.state; + let errors = []; mochaTest.errors.forEach(function (error) { errors.push(new Assertion(false, error.actual, error.expected, - error.message || error.toString(), error.stack)) - }) + error.message || error.toString(), error.stack)); + }); // Test end, for the assertions property pass an empty array. return new TestEnd(mochaTest.title, suiteName, fullName, status, - mochaTest.duration, errors, errors) + mochaTest.duration, errors, errors); } // Test start. - return new TestStart(mochaTest.title, suiteName, fullName) + return new TestStart(mochaTest.title, suiteName, fullName); } /** * Builds an array with the names of nested suites. */ buildSuiteFullName (mochaSuite) { - var fullName = [] - var parent = mochaSuite.parent + var fullName = []; + var parent = mochaSuite.parent; if (!mochaSuite.root) { - fullName.push(mochaSuite.title) + fullName.push(mochaSuite.title); } while (parent && !parent.root) { - fullName.unshift(parent.title) - parent = parent.parent + fullName.unshift(parent.title); + parent = parent.parent; } - return fullName + return fullName; } onStart () { - var globalSuiteStart = this.convertToSuiteStart(this.runner.suite) - globalSuiteStart.name = undefined + var globalSuiteStart = this.convertToSuiteStart(this.runner.suite); + globalSuiteStart.name = undefined; - this.emit('runStart', globalSuiteStart) + this.emit('runStart', globalSuiteStart); } onSuite (mochaSuite) { if (!mochaSuite.root) { - this.emit('suiteStart', this.convertToSuiteStart(mochaSuite)) + this.emit('suiteStart', this.convertToSuiteStart(mochaSuite)); } } onTest (mochaTest) { - this.errors = [] + this.errors = []; - this.emit('testStart', this.convertTest(mochaTest)) + this.emit('testStart', this.convertTest(mochaTest)); } /** @@ -120,11 +120,11 @@ export default class MochaAdapter extends EventEmitter { * on its "test" event. */ onPending (mochaTest) { - this.emit('testStart', this.convertTest(mochaTest)) + this.emit('testStart', this.convertTest(mochaTest)); } onFail (test, error) { - this.errors.push(error) + this.errors.push(error); } onTestEnd (mochaTest) { @@ -132,21 +132,21 @@ export default class MochaAdapter extends EventEmitter { // contains this test is emitted on the "suiteEnd" event, it should contain // also this test with all its details (errors, status, runtime). Runtime // and status are already attached to the test, but the errors don't. - mochaTest.errors = this.errors + mochaTest.errors = this.errors; - this.emit('testEnd', this.convertTest(mochaTest)) + this.emit('testEnd', this.convertTest(mochaTest)); } onSuiteEnd (mochaSuite) { if (!mochaSuite.root) { - this.emit('suiteEnd', this.convertToSuiteEnd(mochaSuite)) + this.emit('suiteEnd', this.convertToSuiteEnd(mochaSuite)); } } onEnd () { - var globalSuiteEnd = this.convertToSuiteEnd(this.runner.suite) - globalSuiteEnd.name = undefined + var globalSuiteEnd = this.convertToSuiteEnd(this.runner.suite); + globalSuiteEnd.name = undefined; - this.emit('runEnd', globalSuiteEnd) + this.emit('runEnd', globalSuiteEnd); } } diff --git a/lib/adapters/QUnitAdapter.js b/lib/adapters/QUnitAdapter.js index ea487bc..ba8a94d 100644 --- a/lib/adapters/QUnitAdapter.js +++ b/lib/adapters/QUnitAdapter.js @@ -1,74 +1,74 @@ -import EventEmitter from 'events' -import {Assertion, TestEnd, SuiteStart} from '../Data.js' -import * as helpers from '../helpers.js' +import EventEmitter from 'events'; +import {Assertion, TestEnd, SuiteStart} from '../Data.js'; +import * as helpers from '../helpers.js'; export default class QUnitAdapter extends EventEmitter { constructor (QUnit) { - super() + super(); - this.QUnit = QUnit - this.tests = {} - this.delim = ' > ' + this.QUnit = QUnit; + this.tests = {}; + this.delim = ' > '; - QUnit.begin(this.onBegin.bind(this)) - QUnit.testStart(this.onTestStart.bind(this)) - QUnit.log(this.onLog.bind(this)) - QUnit.testDone(this.onTestDone.bind(this)) - QUnit.done(this.onDone.bind(this)) + QUnit.begin(this.onBegin.bind(this)); + QUnit.testStart(this.onTestStart.bind(this)); + QUnit.log(this.onLog.bind(this)); + QUnit.testDone(this.onTestDone.bind(this)); + QUnit.done(this.onDone.bind(this)); } convertModule (qunitModule) { var fullName = qunitModule.name.split(this.delim) - .filter((value) => value !== '') - var childSuites = [] + .filter((value) => value !== ''); + var childSuites = []; return new SuiteStart( qunitModule.name, fullName.slice(), qunitModule.tests.map((qunitTest) => { - let indexStart = qunitModule.name.lastIndexOf(this.delim) + let indexStart = qunitModule.name.lastIndexOf(this.delim); - indexStart = indexStart === -1 ? 0 : indexStart + this.delim.length - fullName.push(qunitTest.name) + indexStart = indexStart === -1 ? 0 : indexStart + this.delim.length; + fullName.push(qunitTest.name); - let suiteName = qunitModule.name.substring(indexStart) - let test = new TestEnd(qunitTest.name, suiteName, fullName.slice()) + let suiteName = qunitModule.name.substring(indexStart); + let test = new TestEnd(qunitTest.name, suiteName, fullName.slice()); - this.tests[qunitTest.testId] = test - fullName.pop() + this.tests[qunitTest.testId] = test; + fullName.pop(); - return test + return test; }), childSuites - ) + ); } saveTestDetails (qunitTest) { - var test = this.tests[qunitTest.testId] + var test = this.tests[qunitTest.testId]; - test.errors = this.errors - test.assertions = this.assertions + test.errors = this.errors; + test.assertions = this.assertions; if (qunitTest.failed > 0) { - test.status = 'failed' + test.status = 'failed'; } else if (qunitTest.skipped) { - test.status = 'skipped' + test.status = 'skipped'; } else { - test.status = 'passed' + test.status = 'passed'; } // Workaround for QUnit skipped tests runtime which is a Number. if (test.status !== 'skipped') { - test.runtime = qunitTest.runtime + test.runtime = qunitTest.runtime; } else { - test.runtime = undefined + test.runtime = undefined; } } createGlobalSuite () { - var topLevelSuites = [] - var globalSuite - var modules + var topLevelSuites = []; + var globalSuite; + var modules; // Access QUnit internals to get all suites and tests, working around // missing event data. @@ -76,22 +76,22 @@ export default class QUnitAdapter extends EventEmitter { // Create the global suite first. if (this.QUnit.config.modules.length > 0 && this.QUnit.config.modules[0].name === '') { - globalSuite = this.convertModule(this.QUnit.config.modules[0]) - globalSuite.name = undefined + globalSuite = this.convertModule(this.QUnit.config.modules[0]); + globalSuite.name = undefined; // The suiteName of global tests must be undefined. globalSuite.tests.forEach(function (test) { - test.suiteName = undefined - }) + test.suiteName = undefined; + }); - modules = this.QUnit.config.modules.slice(1) + modules = this.QUnit.config.modules.slice(1); } else { - globalSuite = new SuiteStart(undefined, [], [], []) - modules = this.QUnit.config.modules + globalSuite = new SuiteStart(undefined, [], [], []); + modules = this.QUnit.config.modules; } // Build a list with all suites. - let suites = modules.map(this.convertModule.bind(this)) + let suites = modules.map(this.convertModule.bind(this)); // Iterate through the whole suites and check if they have composed names, // like "suiteName1 > suiteName2 > ... > suiteNameN". @@ -104,78 +104,78 @@ export default class QUnitAdapter extends EventEmitter { // If a suite does not have a composed name, add it to the topLevelSuites, // this means that this suite is the direct child of the global suite. suites.forEach((suite) => { - let indexEnd = suite.name.lastIndexOf(this.delim) + let indexEnd = suite.name.lastIndexOf(this.delim); if (indexEnd !== -1) { // Find the ' > ' characters that appears before the parent name. let indexStart = suite.name.substring(0, indexEnd) - .lastIndexOf(this.delim) + .lastIndexOf(this.delim); // If it is -1, the parent suite name starts at 0, else escape // this characters ' > '. - indexStart = (indexStart === -1) ? 0 : indexStart + this.delim.length + indexStart = (indexStart === -1) ? 0 : indexStart + this.delim.length; - var parentSuiteName = suite.name.substring(indexStart, indexEnd) + var parentSuiteName = suite.name.substring(indexStart, indexEnd); // Keep only the name of the suite itself. - suite.name = suite.name.substring(indexEnd + this.delim.length) + suite.name = suite.name.substring(indexEnd + this.delim.length); suites.forEach(function (parentSuite) { if (parentSuite.name === parentSuiteName) { - parentSuite.childSuites.push(suite) + parentSuite.childSuites.push(suite); } - }) + }); } else { - topLevelSuites.push(suite) + topLevelSuites.push(suite); } - }) + }); - globalSuite.childSuites = topLevelSuites + globalSuite.childSuites = topLevelSuites; - return globalSuite + return globalSuite; } createAssertion (qunitTest) { return new Assertion(qunitTest.result, qunitTest.actual, - qunitTest.expected, qunitTest.message, qunitTest.source || undefined) + qunitTest.expected, qunitTest.message, qunitTest.source || undefined); } emitData (suite) { suite.tests.forEach((test) => { - this.emit('testStart', helpers.createTestStart(test)) - this.emit('testEnd', helpers.createTestEnd(test)) - }) + this.emit('testStart', helpers.createTestStart(test)); + this.emit('testEnd', helpers.createTestEnd(test)); + }); suite.childSuites.forEach((childSuite) => { - this.emit('suiteStart', helpers.createSuiteStart(childSuite)) - this.emitData(childSuite) - this.emit('suiteEnd', helpers.createSuiteEnd(childSuite)) - }) + this.emit('suiteStart', helpers.createSuiteStart(childSuite)); + this.emitData(childSuite); + this.emit('suiteEnd', helpers.createSuiteEnd(childSuite)); + }); } onBegin () { - this.globalSuite = this.createGlobalSuite() + this.globalSuite = this.createGlobalSuite(); } onTestStart (details) { - this.errors = [] - this.assertions = [] + this.errors = []; + this.assertions = []; } onLog (details) { if (!details.result) { - this.errors.push(this.createAssertion(details)) + this.errors.push(this.createAssertion(details)); } - this.assertions.push(this.createAssertion(details)) + this.assertions.push(this.createAssertion(details)); } onTestDone (details) { - this.saveTestDetails(details) + this.saveTestDetails(details); } onDone () { - this.emit('runStart', helpers.createSuiteStart(this.globalSuite)) - this.emitData(this.globalSuite) - this.emit('runEnd', helpers.createSuiteEnd(this.globalSuite)) + this.emit('runStart', helpers.createSuiteStart(this.globalSuite)); + this.emitData(this.globalSuite); + this.emit('runEnd', helpers.createSuiteEnd(this.globalSuite)); } } diff --git a/lib/helpers.js b/lib/helpers.js index 69f8862..b438df6 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -1,29 +1,29 @@ /* global QUnit, mocha, jasmine */ -import QUnitAdapter from './adapters/QUnitAdapter.js' -import MochaAdapter from './adapters/MochaAdapter.js' -import JasmineAdapter from './adapters/JasmineAdapter.js' -import {TestStart, TestEnd, SuiteStart, SuiteEnd} from './Data.js' +import QUnitAdapter from './adapters/QUnitAdapter.js'; +import MochaAdapter from './adapters/MochaAdapter.js'; +import JasmineAdapter from './adapters/JasmineAdapter.js'; +import {TestStart, TestEnd, SuiteStart, SuiteEnd} from './Data.js'; /** * Auto registers the adapter for the respective testing framework and * returns the runner for event listening. */ export function autoRegister () { - var runner + var runner; if (QUnit) { - runner = new QUnitAdapter(QUnit) + runner = new QUnitAdapter(QUnit); } else if (mocha) { - runner = new MochaAdapter(mocha) + runner = new MochaAdapter(mocha); } else if (jasmine) { - runner = new JasmineAdapter(jasmine) + runner = new JasmineAdapter(jasmine); } else { throw new Error('Failed to register js-reporters adapter. Supported ' + - 'frameworks are: QUnit, Mocha, Jasmine') + 'frameworks are: QUnit, Mocha, Jasmine'); } - return runner + return runner; } export function createSuiteStart (suite) { @@ -32,7 +32,7 @@ export function createSuiteStart (suite) { suite.fullName.slice(), suite.tests.map(createTestStart), suite.childSuites.map(createSuiteStart) - ) + ); } export function createSuiteEnd (suite) { @@ -41,14 +41,14 @@ export function createSuiteEnd (suite) { suite.fullName.slice(), suite.tests.map(createTestEnd), suite.childSuites.map(createSuiteEnd) - ) + ); } export function createTestStart (test) { - return new TestStart(test.name, test.suiteName, test.fullName.slice()) + return new TestStart(test.name, test.suiteName, test.fullName.slice()); } export function createTestEnd (test) { return new TestEnd(test.name, test.suiteName, test.fullName.slice(), - test.status, test.runtime, test.errors.slice(), test.assertions.slice()) + test.status, test.runtime, test.errors.slice(), test.assertions.slice()); } diff --git a/lib/reporters/ConsoleReporter.js b/lib/reporters/ConsoleReporter.js index b04db0b..433fde4 100644 --- a/lib/reporters/ConsoleReporter.js +++ b/lib/reporters/ConsoleReporter.js @@ -1,47 +1,47 @@ // TODO: finish grouping once suiteStart is implemented -var hasGrouping = 'group' in console && 'groupEnd' in console +var hasGrouping = 'group' in console && 'groupEnd' in console; export default class ConsoleReporter { constructor (runner) { - runner.on('runStart', this.onRunStart) - runner.on('suiteStart', this.onSuiteStart) - runner.on('testStart', this.onTestStart) - runner.on('testEnd', this.onTestEnd) - runner.on('suiteEnd', this.onSuiteEnd) - runner.on('runEnd', this.onRunEnd) + runner.on('runStart', this.onRunStart); + runner.on('suiteStart', this.onSuiteStart); + runner.on('testStart', this.onTestStart); + runner.on('testEnd', this.onTestEnd); + runner.on('suiteEnd', this.onSuiteEnd); + runner.on('runEnd', this.onRunEnd); } static init (runner) { - return new ConsoleReporter(runner) + return new ConsoleReporter(runner); } onRunStart (suite) { - console.log('runStart', suite) + console.log('runStart', suite); } onSuiteStart (suite) { if (hasGrouping) { - console.group(suite.name) + console.group(suite.name); } - console.log('suiteStart', suite) + console.log('suiteStart', suite); } onTestStart (test) { - console.log('testStart', test) + console.log('testStart', test); } onTestEnd (test) { - console.log('testEnd', test) + console.log('testEnd', test); } onSuiteEnd (suite) { - console.log('suiteEnd', suite) + console.log('suiteEnd', suite); if (hasGrouping) { - console.groupEnd() + console.groupEnd(); } } onRunEnd (globalSuite) { - console.log('runEnd', globalSuite) + console.log('runEnd', globalSuite); } } diff --git a/lib/reporters/TapReporter.js b/lib/reporters/TapReporter.js index 466ff41..97db132 100644 --- a/lib/reporters/TapReporter.js +++ b/lib/reporters/TapReporter.js @@ -1,65 +1,65 @@ -import chalk from 'chalk' +import chalk from 'chalk'; export default class TapReporter { constructor (runner) { - this.testCount = 0 + this.testCount = 0; - runner.on('runStart', this.onRunStart.bind(this)) - runner.on('testEnd', this.onTestEnd.bind(this)) - runner.on('runEnd', this.onRunEnd.bind(this)) + runner.on('runStart', this.onRunStart.bind(this)); + runner.on('testEnd', this.onTestEnd.bind(this)); + runner.on('runEnd', this.onRunEnd.bind(this)); } static init (runner) { - return new TapReporter(runner) + return new TapReporter(runner); } onRunStart (globalSuite) { - console.log('TAP version 13') + console.log('TAP version 13'); } onTestEnd (test) { - this.testCount = this.testCount + 1 + this.testCount = this.testCount + 1; if (test.status === 'passed') { - console.log(`ok ${this.testCount} ${test.fullName.join(' > ')}`) + console.log(`ok ${this.testCount} ${test.fullName.join(' > ')}`); } else if (test.status === 'skipped') { - console.log(chalk.yellow(`ok ${this.testCount} # SKIP ${test.fullName.join(' > ')}`)) + console.log(chalk.yellow(`ok ${this.testCount} # SKIP ${test.fullName.join(' > ')}`)); } else if (test.status === 'todo') { - console.log(chalk.cyan(`not ok ${this.testCount} # TODO ${test.fullName.join(' > ')}`)) - test.errors.forEach((error) => this.logError(error, 'todo')) + console.log(chalk.cyan(`not ok ${this.testCount} # TODO ${test.fullName.join(' > ')}`)); + test.errors.forEach((error) => this.logError(error, 'todo')); } else { - console.log(chalk.red(`not ok ${this.testCount} ${test.fullName.join(' > ')}`)) - test.errors.forEach((error) => this.logError(error)) + console.log(chalk.red(`not ok ${this.testCount} ${test.fullName.join(' > ')}`)); + test.errors.forEach((error) => this.logError(error)); } } onRunEnd (globalSuite) { - console.log(`1..${globalSuite.testCounts.total}`) - console.log(`# pass ${globalSuite.testCounts.passed}`) - console.log(chalk.yellow(`# skip ${globalSuite.testCounts.skipped}`)) - console.log(chalk.cyan(`# todo ${globalSuite.testCounts.todo}`)) - console.log(chalk.red(`# fail ${globalSuite.testCounts.failed}`)) + console.log(`1..${globalSuite.testCounts.total}`); + console.log(`# pass ${globalSuite.testCounts.passed}`); + console.log(chalk.yellow(`# skip ${globalSuite.testCounts.skipped}`)); + console.log(chalk.cyan(`# todo ${globalSuite.testCounts.todo}`)); + console.log(chalk.red(`# fail ${globalSuite.testCounts.failed}`)); } logError (error, severity) { - console.log(' ---') - console.log(` message: "${(error.message || 'failed').replace(/"/g, '\\"')}"`) - console.log(` severity: ${severity || 'failed'}`) + console.log(' ---'); + console.log(` message: "${(error.message || 'failed').replace(/"/g, '\\"')}"`); + console.log(` severity: ${severity || 'failed'}`); if (error.hasOwnProperty('actual')) { - var actualStr = error.actual !== undefined ? ('"' + JSON.stringify(error.actual, null, 2).replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"') : 'undefined' - console.log(` actual : ${actualStr}`) + var actualStr = error.actual !== undefined ? ('"' + JSON.stringify(error.actual, null, 2).replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"') : 'undefined'; + console.log(` actual : ${actualStr}`); } if (error.hasOwnProperty('expected')) { - var expectedStr = error.expected !== undefined ? ('"' + JSON.stringify(error.expected, null, 2).replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"') : 'undefined' - console.log(` expected: ${expectedStr}`) + var expectedStr = error.expected !== undefined ? ('"' + JSON.stringify(error.expected, null, 2).replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"') : 'undefined'; + console.log(` expected: ${expectedStr}`); } if (error.stack) { - console.log(` stack: "${error.stack.replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`) + console.log(` stack: "${error.stack.replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`); } - console.log(' ...') + console.log(' ...'); } } diff --git a/package-lock.json b/package-lock.json index 7b87d0b..a65c26b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,81 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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" + } + } + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "accepts": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", @@ -134,6 +209,17 @@ "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "array-slice": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", @@ -206,6 +292,12 @@ "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", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", @@ -1191,6 +1283,12 @@ "supports-color": "^2.0.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1305,6 +1403,21 @@ "object-visit": "^1.0.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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -1413,6 +1526,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -1452,6 +1571,19 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "crypto-browserify": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", @@ -1719,6 +1851,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -1859,6 +1997,15 @@ "prr": "~1.0.1" } }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.17.6", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", @@ -2064,6 +2211,12 @@ } } }, + "eslint-config-semistandard": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.0.tgz", + "integrity": "sha512-volIMnosUvzyxGkYUA5QvwkahZZLeUx7wcS0+7QumPn+MMEBbV6P7BY1yukamMst0w3Et3QZlCjQEwQ8tQ6nug==", + "dev": true + }, "eslint-config-standard": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-5.1.0.tgz", @@ -2076,6 +2229,142 @@ "integrity": "sha1-CYqnD16nBvJbqn2bc+cT9dodkqQ=", "dev": true }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", + "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", + "dev": true, + "requires": { + "eslint-utils": "^1.4.2", + "regexpp": "^3.0.0" + }, + "dependencies": { + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-node": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", + "integrity": "sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==", + "dev": true, + "requires": { + "eslint-plugin-es": "^2.0.0", + "eslint-utils": "^1.4.2", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "eslint-plugin-promise": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-1.3.2.tgz", @@ -2094,6 +2383,31 @@ "integrity": "sha1-owhUUVI0MedvQJxwy4+U4yvw7H8=", "dev": true }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, "espree": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", @@ -2118,6 +2432,23 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -2314,6 +2645,28 @@ } } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2491,6 +2844,12 @@ } } }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "follow-redirects": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", @@ -2593,6 +2952,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -2894,6 +3259,12 @@ "parse-passwd": "^1.0.0" } }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -2964,6 +3335,30 @@ "integrity": "sha1-TIRaYfflC0pBD2FWqqOLatleDI8=", "dev": true }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -3043,6 +3438,12 @@ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", "dev": true }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -3239,6 +3640,12 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -3383,6 +3790,12 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "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==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3404,6 +3817,12 @@ "jsonify": "~0.0.0" } }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3455,6 +3874,16 @@ "verror": "1.10.0" } }, + "jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + } + }, "karma": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", @@ -3607,6 +4036,18 @@ "type-check": "~0.3.2" } }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", @@ -3619,6 +4060,24 @@ "object-assign": "^4.0.1" } }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -3795,6 +4254,12 @@ "mime-db": "1.44.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3995,6 +4460,12 @@ } } }, + "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 + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -4007,6 +4478,12 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "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 + }, "node-libs-browser": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", @@ -4067,6 +4544,29 @@ } } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -4163,10 +4663,33 @@ "object-keys": "^1.0.11" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { "for-own": "^0.1.4", @@ -4190,6 +4713,18 @@ } } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -4270,12 +4805,53 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -4288,6 +4864,15 @@ "is-glob": "^2.0.0" } }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", @@ -4360,12 +4945,27 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "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==", "dev": true }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, "pbkdf2-compat": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", @@ -4401,6 +5001,12 @@ "which": "^1.2.10" } }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -4416,6 +5022,102 @@ "pinkie": "^2.0.0" } }, + "pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, "pkg-config": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", @@ -4484,6 +5186,17 @@ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -4618,6 +5331,44 @@ "unpipe": "1.0.0" } }, + "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==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4973,6 +5724,12 @@ "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 + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -5242,6 +5999,15 @@ "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5269,6 +6035,610 @@ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", "dev": true }, + "semistandard": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-14.2.3.tgz", + "integrity": "sha512-vSfN5ewUHz85dpnB5wf8Xo/btFNfVI8UmPYe0xpYLNEfrZQi/qLhtx12XnB/jNlsB2CrCokHRXlzl2zPoXghjw==", + "dev": true, + "requires": { + "eslint": "~6.8.0", + "eslint-config-semistandard": "15.0.0", + "eslint-config-standard": "14.1.1", + "eslint-config-standard-jsx": "8.1.0", + "eslint-plugin-import": "~2.18.0", + "eslint-plugin-node": "~10.0.0", + "eslint-plugin-promise": "~4.2.1", + "eslint-plugin-react": "~7.14.2", + "eslint-plugin-standard": "~4.0.0", + "standard-engine": "^12.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-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 + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "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" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "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==", + "dev": true + }, + "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" + } + }, + "deglob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-4.0.1.tgz", + "integrity": "sha512-/g+RDZ7yf2HvoW+E5Cy+K94YhgcFgr6C8LuHZD1O5HoNPkf3KY6RfXJ0DBGlB/NkLi5gml+G9zqRzk9S0mHZCg==", + "dev": true, + "requires": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^5.0.0", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-standard": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", + "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz", + "integrity": "sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw==", + "dev": true + }, + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", + "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.1.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.10.1" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-standard": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.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" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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 + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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 + } + } + }, + "standard-engine": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-12.1.0.tgz", + "integrity": "sha512-DVJnWM1CGkag4ucFLGdiYWa5/kJURPONmMmk17p8FT5NE4UnPZB1vxWnXnRo2sPSL78pWJG8xEM+1Tu19z0deg==", + "dev": true, + "requires": { + "deglob": "^4.0.1", + "get-stdin": "^7.0.0", + "minimist": "^1.2.5", + "pkg-conf": "^3.1.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "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" + }, + "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==", + "dev": true + } + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "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" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "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 + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -5316,6 +6686,21 @@ "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=", "dev": true }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "shelljs": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", @@ -5328,6 +6713,12 @@ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", "dev": true }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, "sinon": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", @@ -5660,6 +7051,38 @@ "integrity": "sha512-340ZqtqJzWAZtHwaCC2gx4mdQOnkUWAWNDp7y0bCEatdjmgQ4j7b0qQ7qO5WIJWx/luNrKcrYzpKbH3NTR030A==", "dev": true }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "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", @@ -5823,6 +7246,12 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -6045,6 +7474,12 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -6087,6 +7522,12 @@ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", "dev": true }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -6295,6 +7736,22 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", diff --git a/package.json b/package.json index 8ed18df..e65a3d8 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "build": "rollup -c", "prepublish": "npm run build", "pretest": "npm run build", - "test": "standard && npm run test-unit && npm run test-integration", + "lint": "semistandard", + "test": "npm run lint && npm run test-unit && npm run test-integration", "test-unit": "mocha --recursive test/unit/ && npm run test-browser", "test-browser": "karma start", "test-integration": "mocha test/integration/adapters.js", @@ -45,9 +46,9 @@ "rollup-plugin-babel": "^2.6.1", "rollup-plugin-commonjs": "^3.3.1", "rollup-plugin-node-resolve": "^1.7.2", + "semistandard": "14.2.3", "sinon": "^1.17.4", "sinon-chai": "^2.8.0", - "standard": "^6.0.8", "webpack": "^1.0.0" }, "commitplease": { diff --git a/rollup.config.js b/rollup.config.js index 1ced8fe..a3ccd58 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,12 +1,12 @@ -var fs = require('fs') -var babel = require('rollup-plugin-babel') -var nodeResolve = require('rollup-plugin-node-resolve') -var commonjs = require('rollup-plugin-commonjs') -var pkg = require('./package.json') +var fs = require('fs'); +var babel = require('rollup-plugin-babel'); +var nodeResolve = require('rollup-plugin-node-resolve'); +var commonjs = require('rollup-plugin-commonjs'); +var pkg = require('./package.json'); var licenseHeader = fs.readFileSync('license-header', {encoding: 'utf8'}) .replace('@VERSION', pkg.version) - .replace('@DATE', (new Date()).toDateString()) + .replace('@DATE', (new Date()).toDateString()); module.exports = { entry: 'index.js', @@ -21,4 +21,4 @@ module.exports = { commonjs(), babel() ] -} +}; diff --git a/test/fixtures/jasmine.js b/test/fixtures/jasmine.js index d8837ca..fb7d6b9 100644 --- a/test/fixtures/jasmine.js +++ b/test/fixtures/jasmine.js @@ -1,49 +1,49 @@ /* global describe, it, xit, expect */ it('global test', function () { - expect(true).toBeTruthy() -}) + expect(true).toBeTruthy(); +}); describe('suite with passing test', function () { it('should pass', function () { - expect(true).toBeTruthy() - }) -}) + expect(true).toBeTruthy(); + }); +}); describe('suite with skipped test', function () { xit('should skip', function () { - }) -}) + }); +}); describe('suite with failing test', function () { it('should fail', function () { - throw new Error('error') - }) -}) + throw new Error('error'); + }); +}); describe('suite with tests', function () { it('should pass', function () { - expect(true).toBeTruthy() - }) + expect(true).toBeTruthy(); + }); xit('should skip', function () { - }) + }); it('should fail', function () { - throw new Error('error') - }) -}) + throw new Error('error'); + }); +}); describe('outter suite', function () { it('outter test', function () { - expect(true).toBeTruthy() - }) + expect(true).toBeTruthy(); + }); describe('inner suite', function () { it('inner test', function () { - expect(true).toBeTruthy() - }) - }) -}) + expect(true).toBeTruthy(); + }); + }); +}); diff --git a/test/fixtures/mocha.js b/test/fixtures/mocha.js index b941748..808541f 100644 --- a/test/fixtures/mocha.js +++ b/test/fixtures/mocha.js @@ -2,48 +2,48 @@ it('global test', function () { -}) +}); describe('suite with passing test', function () { it('should pass', function () { - }) -}) + }); +}); describe('suite with skipped test', function () { it.skip('should skip', function () { - }) -}) + }); +}); describe('suite with failing test', function () { it('should fail', function () { - throw new Error('error') - }) -}) + throw new Error('error'); + }); +}); describe('suite with tests', function () { it('should pass', function () { - }) + }); it.skip('should skip', function () { - }) + }); it('should fail', function () { - throw new Error('error') - }) -}) + throw new Error('error'); + }); +}); describe('outter suite', function () { describe('inner suite', function () { it('inner test', function () { - }) - }) + }); + }); it('outter test', function () { - }) -}) + }); +}); diff --git a/test/fixtures/qunit.js b/test/fixtures/qunit.js index 9ca361f..999da21 100644 --- a/test/fixtures/qunit.js +++ b/test/fixtures/qunit.js @@ -1,47 +1,47 @@ -var QUnit = require('qunitjs') +var QUnit = require('qunitjs'); // Add dummy assertions in passing tests, because QUnit is checking for at // least one assertion, if there is none, then QUnit throws an error and the // test fails. QUnit.test('global test', function (assert) { - assert.ok(true) -}) + assert.ok(true); +}); -QUnit.module('suite with passing test') +QUnit.module('suite with passing test'); QUnit.test('should pass', function (assert) { - assert.ok(true) -}) + assert.ok(true); +}); -QUnit.module('suite with skipped test') +QUnit.module('suite with skipped test'); QUnit.skip('should skip', function () { -}) +}); -QUnit.module('suite with failing test') +QUnit.module('suite with failing test'); QUnit.test('should fail', function () { - throw new Error('error') -}) + throw new Error('error'); +}); -QUnit.module('suite with tests') +QUnit.module('suite with tests'); QUnit.test('should pass', function (assert) { - assert.ok(true) -}) + assert.ok(true); +}); QUnit.skip('should skip', function () { -}) +}); QUnit.test('should fail', function () { - throw new Error('error') -}) + throw new Error('error'); +}); QUnit.module('outter suite', function () { QUnit.module('inner suite', function () { QUnit.test('inner test', function (assert) { - assert.ok(true) - }) - }) + assert.ok(true); + }); + }); QUnit.test('outter test', function (assert) { - assert.ok(true) - }) -}) + assert.ok(true); + }); +}); diff --git a/test/integration/adapters-run.js b/test/integration/adapters-run.js index ac7b3c3..2b12a74 100644 --- a/test/integration/adapters-run.js +++ b/test/integration/adapters-run.js @@ -1,10 +1,10 @@ -var Jasmine = require('jasmine') -var QUnit = require('qunitjs') -var Mocha = require('mocha') -var JsReporters = require('../../dist/js-reporters.js') -var path = require('path') +var Jasmine = require('jasmine'); +var QUnit = require('qunitjs'); +var Mocha = require('mocha'); +var JsReporters = require('../../dist/js-reporters.js'); +var path = require('path'); -var testDir = path.join(__dirname, '../fixtures') +var testDir = path.join(__dirname, '../fixtures'); /** * Exports a function for each adapter that will run @@ -12,51 +12,51 @@ var testDir = path.join(__dirname, '../fixtures') */ module.exports = { Jasmine: function (attachListeners) { - var jasmine = new Jasmine() - var jasmineRunner + var jasmine = new Jasmine(); + var jasmineRunner; jasmine.loadConfig({ spec_dir: 'test/fixtures', spec_files: ['jasmine.js'] - }) + }); - jasmineRunner = new JsReporters.JasmineAdapter(jasmine) + jasmineRunner = new JsReporters.JasmineAdapter(jasmine); - attachListeners(jasmineRunner) + attachListeners(jasmineRunner); - jasmine.execute() + jasmine.execute(); }, QUnit: function (attachListeners) { - var qunitRunner = new JsReporters.QUnitAdapter(QUnit) + var qunitRunner = new JsReporters.QUnitAdapter(QUnit); - attachListeners(qunitRunner) + attachListeners(qunitRunner); - QUnit.config.autorun = false + QUnit.config.autorun = false; - require(path.join(testDir, 'qunit.js')) + require(path.join(testDir, 'qunit.js')); - QUnit.load() + QUnit.load(); }, Mocha: function (attachListeners) { - var mocha = new Mocha() - var origWrite = process.stdout.write - var mochaRunner + var mocha = new Mocha(); + var origWrite = process.stdout.write; + var mochaRunner; - mocha.addFile(path.join(testDir, 'mocha.js')) + mocha.addFile(path.join(testDir, 'mocha.js')); - mochaRunner = new JsReporters.MochaAdapter(mocha) + mochaRunner = new JsReporters.MochaAdapter(mocha); - attachListeners(mochaRunner) + attachListeners(mochaRunner); // Surpress output, so that Mocha's default reporter output will not be // displayed during testing. - process.stdout.write = function () {} + process.stdout.write = function () {}; mocha.run(function () { // Restore output. - process.stdout.write = origWrite - }) + process.stdout.write = origWrite; + }); } -} +}; diff --git a/test/integration/adapters.js b/test/integration/adapters.js index bb6264f..0dd652a 100644 --- a/test/integration/adapters.js +++ b/test/integration/adapters.js @@ -1,31 +1,31 @@ /* eslint-env mocha */ -var expect = require('chai').expect -var refData = require('./reference-data.js') -var runAdapters = require('./adapters-run.js') +var expect = require('chai').expect; +var refData = require('./reference-data.js'); +var runAdapters = require('./adapters-run.js'); // Collecting the adapter's output. -var collectedData +var collectedData; function _collectOutput (eventName, done, eventData) { - collectedData.push([eventName, eventData]) - done() + collectedData.push([eventName, eventData]); + done(); } /** * Attaches the event handler for the runner events. */ function _attachListeners (done, runner) { - var dummyFunc = function () {} + var dummyFunc = function () {}; - runner.on('runStart', _collectOutput.bind(null, 'runStart', dummyFunc)) - runner.on('suiteStart', _collectOutput.bind(null, 'suiteStart', dummyFunc)) - runner.on('testStart', _collectOutput.bind(null, 'testStart', dummyFunc)) - runner.on('testEnd', _collectOutput.bind(null, 'testEnd', dummyFunc)) - runner.on('suiteEnd', _collectOutput.bind(null, 'suiteEnd', dummyFunc)) + runner.on('runStart', _collectOutput.bind(null, 'runStart', dummyFunc)); + runner.on('suiteStart', _collectOutput.bind(null, 'suiteStart', dummyFunc)); + runner.on('testStart', _collectOutput.bind(null, 'testStart', dummyFunc)); + runner.on('testEnd', _collectOutput.bind(null, 'testEnd', dummyFunc)); + runner.on('suiteEnd', _collectOutput.bind(null, 'suiteEnd', dummyFunc)); // Only when the runEnd event is emitted we can notify Mocha that we are done. - runner.on('runEnd', _collectOutput.bind(null, 'runEnd', done)) + runner.on('runEnd', _collectOutput.bind(null, 'runEnd', done)); } /** @@ -34,13 +34,13 @@ function _attachListeners (done, runner) { function _setSuiteTestsRuntime (suite) { suite.tests.forEach(function (test) { if (test.status !== 'skipped') { - test.runtime = 0 + test.runtime = 0; } - }) + }); suite.childSuites.forEach(function (childSuite) { - _setSuiteTestsRuntime(childSuite) - }) + _setSuiteTestsRuntime(childSuite); + }); } /** @@ -48,12 +48,12 @@ function _setSuiteTestsRuntime (suite) { */ function _setSuitesRuntime (suite) { if (suite.status !== 'skipped') { - suite.runtime = 0 + suite.runtime = 0; } suite.childSuites.forEach(function (childSuite) { - _setSuitesRuntime(childSuite) - }) + _setSuitesRuntime(childSuite); + }); } /** @@ -62,18 +62,18 @@ function _setSuitesRuntime (suite) { */ function _overWriteTestAssertions (test) { test.errors.forEach(function (error) { - error.actual = undefined - error.expected = undefined - error.message = undefined - error.stack = undefined - }) + error.actual = undefined; + error.expected = undefined; + error.message = undefined; + error.stack = undefined; + }); test.assertions.forEach(function (assertion) { - assertion.actual = undefined - assertion.expected = undefined - assertion.message = undefined - assertion.stack = undefined - }) + assertion.actual = undefined; + assertion.expected = undefined; + assertion.message = undefined; + assertion.stack = undefined; + }); } /** @@ -82,12 +82,12 @@ function _overWriteTestAssertions (test) { */ function _overWriteSuitesAssertions (suite) { suite.tests.forEach(function (test) { - _overWriteTestAssertions(test) - }) + _overWriteTestAssertions(test); + }); suite.childSuites.forEach(function (childSuite) { - _overWriteSuitesAssertions(childSuite) - }) + _overWriteSuitesAssertions(childSuite); + }); } /** @@ -96,16 +96,16 @@ function _overWriteSuitesAssertions (suite) { * number of contained assertions. */ function _fillTestAssertions (refTest, test) { - test.assertions = [] - test.errors = [] + test.assertions = []; + test.errors = []; refTest.assertions.forEach(function (assertion) { - test.assertions.push(assertion) - }) + test.assertions.push(assertion); + }); refTest.errors.forEach(function (error) { - test.errors.push(error) - }) + test.errors.push(error); + }); } /** @@ -114,12 +114,12 @@ function _fillTestAssertions (refTest, test) { */ function _fillSuiteAssertions (refSuite, suite) { refSuite.tests.forEach(function (refTest, index) { - _fillTestAssertions(refTest, suite.tests[index]) - }) + _fillTestAssertions(refTest, suite.tests[index]); + }); refSuite.childSuites.forEach(function (childSuite, index) { - _fillSuiteAssertions(childSuite, suite.childSuites[index]) - }) + _fillSuiteAssertions(childSuite, suite.childSuites[index]); + }); } /** @@ -128,13 +128,13 @@ function _fillSuiteAssertions (refSuite, suite) { function getTestCountsStart (refSuite) { var testCounts = { total: refSuite.tests.length - } + }; refSuite.childSuites.forEach(function (childSuite) { - testCounts.total += getTestCountsStart(childSuite).total - }) + testCounts.total += getTestCountsStart(childSuite).total; + }); - return testCounts + return testCounts; } /** @@ -147,197 +147,197 @@ function getTestCountsEnd (refSuite) { skipped: 0, todo: 0, total: refSuite.tests.length - } + }; testCounts.passed += refSuite.tests.filter(function (test) { - return test.status === 'passed' - }).length + return test.status === 'passed'; + }).length; testCounts.failed += refSuite.tests.filter(function (test) { - return test.status === 'failed' - }).length + return test.status === 'failed'; + }).length; testCounts.skipped += refSuite.tests.filter(function (test) { - return test.status === 'skipped' - }).length + return test.status === 'skipped'; + }).length; testCounts.todo += refSuite.tests.filter(function (test) { - return test.status === 'todo' - }).length + return test.status === 'todo'; + }).length; refSuite.childSuites.forEach(function (childSuite) { - var childTestCounts = getTestCountsEnd(childSuite) + var childTestCounts = getTestCountsEnd(childSuite); - testCounts.passed += childTestCounts.passed - testCounts.failed += childTestCounts.failed - testCounts.skipped += childTestCounts.skipped - testCounts.todo += childTestCounts.todo - testCounts.total += childTestCounts.total - }) + testCounts.passed += childTestCounts.passed; + testCounts.failed += childTestCounts.failed; + testCounts.skipped += childTestCounts.skipped; + testCounts.todo += childTestCounts.todo; + testCounts.total += childTestCounts.total; + }); - return testCounts + return testCounts; } describe('Adapters integration', function () { Object.keys(runAdapters).forEach(function (adapter) { describe(adapter + ' adapter', function () { - var keys = ['passed', 'actual', 'expected', 'message', 'stack', 'todo'] + var keys = ['passed', 'actual', 'expected', 'message', 'stack', 'todo']; before(function (done) { - collectedData = [] - runAdapters[adapter](_attachListeners.bind(null, done)) - }) + collectedData = []; + runAdapters[adapter](_attachListeners.bind(null, done)); + }); it('tests runtime should be a number', function () { collectedData.forEach(function (value) { if (value[0] === 'testEnd' && value[1].status !== 'skipped') { - expect(value[1].runtime).to.be.a('number') + expect(value[1].runtime).to.be.a('number'); } - }) - }) + }); + }); it('testing tests errors prop', function () { var refTestsEnd = refData.filter(function (value) { - return value[0] === 'testEnd' - }) + return value[0] === 'testEnd'; + }); var testsEnd = collectedData.filter(function (value) { - return value[0] === 'testEnd' - }) + return value[0] === 'testEnd'; + }); refTestsEnd.forEach(function (value, index) { - var refTest = value[1] - var test = testsEnd[index][1] + var refTest = value[1]; + var test = testsEnd[index][1]; if (refTest.status === 'passed' || refTest.status === 'skipped') { - expect(test.errors).to.be.deep.equal(refTest.errors) + expect(test.errors).to.be.deep.equal(refTest.errors); } else { - expect(test.errors).to.have.lengthOf(refTest.errors.length) + expect(test.errors).to.have.lengthOf(refTest.errors.length); test.errors.forEach(function (error) { - expect(error).to.have.all.keys(keys) + expect(error).to.have.all.keys(keys); - expect(error.passed).to.be.false - expect(error.message).to.be.a('string') - expect(error.stack).to.be.a('string') - }) + expect(error.passed).to.be.false; + expect(error.message).to.be.a('string'); + expect(error.stack).to.be.a('string'); + }); } - }) - }) + }); + }); it('testing tests assertions prop', function () { var refTestsEnd = refData.filter(function (value) { - return value[0] === 'testEnd' - }) + return value[0] === 'testEnd'; + }); var testsEnd = collectedData.filter(function (value) { - return value[0] === 'testEnd' - }) + return value[0] === 'testEnd'; + }); refTestsEnd.forEach(function (value, index) { - var refTest = value[1] - var test = testsEnd[index][1] + var refTest = value[1]; + var test = testsEnd[index][1]; // Expect to contain the correct number of assertions, only for // test frameworks that provide all assertions. if (adapter !== 'Mocha') { - expect(test.assertions).to.have.lengthOf(refTest.assertions.length) + expect(test.assertions).to.have.lengthOf(refTest.assertions.length); } var passedAssertions = test.assertions.filter(function (assertion) { - return assertion.passed - }) + return assertion.passed; + }); var failedAssertions = test.assertions.filter(function (assertion) { - return !assertion.passed - }) + return !assertion.passed; + }); passedAssertions.forEach(function (assertion) { - expect(assertion).to.have.all.keys(keys) + expect(assertion).to.have.all.keys(keys); - expect(assertion.passed).to.be.true - expect(assertion.message).to.be.a('string') - expect(assertion.stack).to.be.undefined - }) + expect(assertion.passed).to.be.true; + expect(assertion.message).to.be.a('string'); + expect(assertion.stack).to.be.undefined; + }); failedAssertions.forEach(function (assertion) { - expect(assertion).to.have.all.keys(keys) + expect(assertion).to.have.all.keys(keys); - expect(assertion.passed).to.be.false - expect(assertion.message).to.be.a('string') - expect(assertion.stack).to.be.a('string') - }) - }) - }) + expect(assertion.passed).to.be.false; + expect(assertion.message).to.be.a('string'); + expect(assertion.stack).to.be.a('string'); + }); + }); + }); refData.forEach(function (value, index) { - var testDescription = value[2] + var testDescription = value[2]; it(testDescription, function () { - var refEvent = value[0] - var refTestItem = value[1] - var event = collectedData[index][0] - var testItem = collectedData[index][1] + var refEvent = value[0]; + var refTestItem = value[1]; + var event = collectedData[index][0]; + var testItem = collectedData[index][1]; // Set tests runtime to 0 to match the reference tests runtime. if (event === 'testEnd' && testItem.status !== 'skipped') { - collectedData[index][1].runtime = 0 + collectedData[index][1].runtime = 0; } // Set suite tests runtime to 0, also for the globalSuite. if (event === 'suiteEnd' || event === 'runEnd') { - _setSuiteTestsRuntime(collectedData[index][1]) + _setSuiteTestsRuntime(collectedData[index][1]); } // Set assertions to match those from data-refrence file. if (event === 'testEnd') { if (adapter === 'Mocha') { - _fillTestAssertions(refTestItem, testItem) + _fillTestAssertions(refTestItem, testItem); } else { - _overWriteTestAssertions(testItem) + _overWriteTestAssertions(testItem); } } // Set assertions to match thos from the data-refrence file. if (event === 'suiteEnd' || event === 'runEnd') { if (adapter === 'Mocha') { - _fillSuiteAssertions(refTestItem, testItem) + _fillSuiteAssertions(refTestItem, testItem); } else { - _overWriteSuitesAssertions(testItem) + _overWriteSuitesAssertions(testItem); } } // Verify suite self-setting props. if (event === 'suiteStart' || event === 'runStart') { - expect(testItem.status).to.be.undefined - expect(testItem.runtime).to.be.undefined + expect(testItem.status).to.be.undefined; + expect(testItem.runtime).to.be.undefined; expect(testItem.testCounts).to.be.deep - .equal(getTestCountsStart(refTestItem)) + .equal(getTestCountsStart(refTestItem)); } // Verify suite self-setting props. if (event === 'suiteEnd' || event === 'runEnd') { - var refStatus = value[3] + var refStatus = value[3]; - expect(testItem.status).to.be.equal(refStatus) + expect(testItem.status).to.be.equal(refStatus); if (testItem.status !== 'skipped') { - expect(testItem.runtime).to.be.a('number') + expect(testItem.runtime).to.be.a('number'); // Set suites runtime to 0, to pass the deep equal assertion. - _setSuitesRuntime(testItem) + _setSuitesRuntime(testItem); } else { - expect(testItem.runtime).to.be.undefined + expect(testItem.runtime).to.be.undefined; } expect(testItem.testCounts).to.be.deep - .equal(getTestCountsEnd(refTestItem)) + .equal(getTestCountsEnd(refTestItem)); } - expect(event).equal(refEvent) - expect(testItem).to.be.deep.equal(refTestItem) - }) - }) - }) - }) -}) + expect(event).equal(refEvent); + expect(testItem).to.be.deep.equal(refTestItem); + }); + }); + }); + }); +}); diff --git a/test/integration/reference-data.js b/test/integration/reference-data.js index 9d37645..add7f95 100644 --- a/test/integration/reference-data.js +++ b/test/integration/reference-data.js @@ -1,11 +1,11 @@ -var JsReporters = require('../../dist/js-reporters.js') -var SuiteStart = JsReporters.SuiteStart -var SuiteEnd = JsReporters.SuiteEnd -var TestStart = JsReporters.TestStart -var TestEnd = JsReporters.TestEnd +var JsReporters = require('../../dist/js-reporters.js'); +var SuiteStart = JsReporters.SuiteStart; +var SuiteEnd = JsReporters.SuiteEnd; +var TestStart = JsReporters.TestStart; +var TestEnd = JsReporters.TestEnd; -var noErrors = [] -var noAssertions = [] +var noErrors = []; +var noAssertions = []; /** * All props are undefined, except "passed", because we don't know what they @@ -19,7 +19,7 @@ var errors = [{ message: undefined, stack: undefined, todo: undefined -}] +}]; var failedAssertions = [{ passed: false, @@ -28,7 +28,7 @@ var failedAssertions = [{ message: undefined, stack: undefined, todo: undefined -}] +}]; var passedAssertions = [{ passed: true, @@ -37,93 +37,93 @@ var passedAssertions = [{ message: undefined, stack: undefined, todo: undefined -}] +}]; -var globalTestStart = new TestStart('global test', undefined, ['global test']) +var globalTestStart = new TestStart('global test', undefined, ['global test']); var globalTestEnd = new TestEnd('global test', undefined, ['global test'], - 'passed', 0, noErrors, passedAssertions) + 'passed', 0, noErrors, passedAssertions); var passingTestStart1 = new TestStart('should pass', 'suite with passing test', - ['suite with passing test', 'should pass']) + ['suite with passing test', 'should pass']); var passingTestEnd1 = new TestEnd('should pass', 'suite with passing test', - ['suite with passing test', 'should pass'], 'passed', 0, noErrors, - passedAssertions) + ['suite with passing test', 'should pass'], 'passed', 0, noErrors, + passedAssertions); var passingTestStart2 = new TestStart('should pass', 'suite with tests', - ['suite with tests', 'should pass']) + ['suite with tests', 'should pass']); var passingTestEnd2 = new TestEnd('should pass', 'suite with tests', - ['suite with tests', 'should pass'], 'passed', 0, noErrors, - passedAssertions) + ['suite with tests', 'should pass'], 'passed', 0, noErrors, + passedAssertions); var skippedTestStart1 = new TestStart('should skip', 'suite with skipped test', - ['suite with skipped test', 'should skip']) + ['suite with skipped test', 'should skip']); var skippedTestEnd1 = new TestEnd('should skip', 'suite with skipped test', - ['suite with skipped test', 'should skip'], 'skipped', undefined, noErrors, - noAssertions) + ['suite with skipped test', 'should skip'], 'skipped', undefined, noErrors, + noAssertions); var skippedTestStart2 = new TestStart('should skip', 'suite with tests', - ['suite with tests', 'should skip']) + ['suite with tests', 'should skip']); var skippedTestEnd2 = new TestEnd('should skip', 'suite with tests', - ['suite with tests', 'should skip'], 'skipped', undefined, noErrors, - noAssertions) + ['suite with tests', 'should skip'], 'skipped', undefined, noErrors, + noAssertions); var failingTestStart1 = new TestStart('should fail', 'suite with failing test', - ['suite with failing test', 'should fail']) + ['suite with failing test', 'should fail']); var failingTestEnd1 = new TestEnd('should fail', 'suite with failing test', - ['suite with failing test', 'should fail'], 'failed', 0, errors, - failedAssertions) + ['suite with failing test', 'should fail'], 'failed', 0, errors, + failedAssertions); var failingTestStart2 = new TestStart('should fail', 'suite with tests', - ['suite with tests', 'should fail']) + ['suite with tests', 'should fail']); var failingTestEnd2 = new TestEnd('should fail', 'suite with tests', - ['suite with tests', 'should fail'], 'failed', 0, errors, - failedAssertions) + ['suite with tests', 'should fail'], 'failed', 0, errors, + failedAssertions); var innerTestStart = new TestStart('inner test', 'inner suite', - ['outter suite', 'inner suite', 'inner test']) + ['outter suite', 'inner suite', 'inner test']); var innerTestEnd = new TestEnd('inner test', 'inner suite', ['outter suite', - 'inner suite', 'inner test'], 'passed', 0, noErrors, passedAssertions) + 'inner suite', 'inner test'], 'passed', 0, noErrors, passedAssertions); var outterTestStart = new TestStart('outter test', 'outter suite', - ['outter suite', 'outter test']) + ['outter suite', 'outter test']); var outterTestEnd = new TestEnd('outter test', 'outter suite', ['outter suite', - 'outter test'], 'passed', 0, noErrors, passedAssertions) + 'outter test'], 'passed', 0, noErrors, passedAssertions); var passingSuiteStart = new SuiteStart('suite with passing test', - ['suite with passing test'], [passingTestStart1], []) + ['suite with passing test'], [passingTestStart1], []); var passingSuiteEnd = new SuiteEnd('suite with passing test', - ['suite with passing test'], [passingTestEnd1], []) + ['suite with passing test'], [passingTestEnd1], []); var skippedSuiteStart = new SuiteStart('suite with skipped test', - ['suite with skipped test'], [skippedTestStart1], []) + ['suite with skipped test'], [skippedTestStart1], []); var skippedSuiteEnd = new SuiteEnd('suite with skipped test', - ['suite with skipped test'], [skippedTestEnd1], []) + ['suite with skipped test'], [skippedTestEnd1], []); var failingSuiteStart = new SuiteStart('suite with failing test', - ['suite with failing test'], [failingTestStart1], []) + ['suite with failing test'], [failingTestStart1], []); var failingSuiteEnd = new SuiteEnd('suite with failing test', - ['suite with failing test'], [failingTestEnd1], []) + ['suite with failing test'], [failingTestEnd1], []); var testSuiteStart = new SuiteStart('suite with tests', ['suite with tests'], [ passingTestStart2, skippedTestStart2, failingTestStart2 -], []) +], []); var testSuiteEnd = new SuiteEnd('suite with tests', ['suite with tests'], [ passingTestEnd2, skippedTestEnd2, failingTestEnd2 -], []) +], []); var innerSuiteStart = new SuiteStart('inner suite', - ['outter suite', 'inner suite'], [innerTestStart], []) + ['outter suite', 'inner suite'], [innerTestStart], []); var innerSuiteEnd = new SuiteEnd('inner suite', ['outter suite', 'inner suite'], - [innerTestEnd], []) + [innerTestEnd], []); var outterSuiteStart = new SuiteStart('outter suite', ['outter suite'], - [outterTestStart], [innerSuiteStart]) + [outterTestStart], [innerSuiteStart]); var outterSuiteEnd = new SuiteEnd('outter suite', ['outter suite'], - [outterTestEnd], [innerSuiteEnd]) + [outterTestEnd], [innerSuiteEnd]); var globalSuiteStart = new SuiteStart(undefined, [], [globalTestStart], [ passingSuiteStart, @@ -131,14 +131,14 @@ var globalSuiteStart = new SuiteStart(undefined, [], [globalTestStart], [ failingSuiteStart, testSuiteStart, outterSuiteStart -]) +]); var globalSuiteEnd = new SuiteEnd(undefined, [], [globalTestEnd], [ passingSuiteEnd, skippedSuiteEnd, failingSuiteEnd, testSuiteEnd, outterSuiteEnd -]) +]); module.exports = [ ['runStart', globalSuiteStart, 'global suite starts'], @@ -173,4 +173,4 @@ module.exports = [ ['suiteEnd', innerSuiteEnd, 'inner suite ends', 'passed'], ['suiteEnd', outterSuiteEnd, 'outter suite ends', 'passed'], ['runEnd', globalSuiteEnd, 'global suite ends', 'failed'] -] +]; diff --git a/test/unit/data.js b/test/unit/data.js index 2ceaa3e..66a123e 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -1,7 +1,7 @@ -var TestEnd = require('../../dist/js-reporters.js').TestEnd -var TestStart = require('../../dist/js-reporters.js').TestStart -var SuiteStart = require('../../dist/js-reporters.js').SuiteStart -var SuiteEnd = require('../../dist/js-reporters.js').SuiteEnd +var TestEnd = require('../../dist/js-reporters.js').TestEnd; +var TestStart = require('../../dist/js-reporters.js').TestStart; +var SuiteStart = require('../../dist/js-reporters.js').SuiteStart; +var SuiteEnd = require('../../dist/js-reporters.js').SuiteEnd; module.exports = { passingTest: new TestEnd('pass', undefined, [], 'passed', 0, []), @@ -35,4 +35,4 @@ module.exports = { endTest: new TestEnd('end', 'end', 'end end', 'failed', 0, [new Error('error')], []), endSuite: new SuiteEnd('end', 'end', [], []) -} +}; diff --git a/test/unit/helpers.js b/test/unit/helpers.js index ff2422f..a828929 100644 --- a/test/unit/helpers.js +++ b/test/unit/helpers.js @@ -1,28 +1,28 @@ /* eslint-env mocha */ -var chai = require('chai') -var sinon = require('sinon') -var JsReporters = require('../../dist/js-reporters.js') -var data = require('./data.js') -var expect = chai.expect +var chai = require('chai'); +var sinon = require('sinon'); +var JsReporters = require('../../dist/js-reporters.js'); +var data = require('./data.js'); +var expect = chai.expect; -chai.use(require('sinon-chai')) +chai.use(require('sinon-chai')); describe('Helpers', function () { - var dummyFunc = function () {} + var dummyFunc = function () {}; describe('autoregister', function () { beforeEach(function () { - global.QUnit = undefined - global.mocha = undefined - global.jasmine = undefined - }) + global.QUnit = undefined; + global.mocha = undefined; + global.jasmine = undefined; + }); afterEach(function () { - delete global.QUnit - delete global.mocha - delete global.jasmine - }) + delete global.QUnit; + delete global.mocha; + delete global.jasmine; + }); it('should register the QUnitAdapter', function () { global.QUnit = { @@ -31,67 +31,67 @@ describe('Helpers', function () { log: dummyFunc, testDone: dummyFunc, done: dummyFunc - } + }; - JsReporters.autoRegister() + JsReporters.autoRegister(); - expect(global.QUnit.begin).to.have.been.calledOnce - }) + expect(global.QUnit.begin).to.have.been.calledOnce; + }); it('should register the MochaAdapter', function () { global.mocha = { reporter: sinon.stub() - } + }; - JsReporters.autoRegister() + JsReporters.autoRegister(); - expect(global.mocha.reporter).to.have.been.calledOnce - }) + expect(global.mocha.reporter).to.have.been.calledOnce; + }); it('should register the JasmineAdapter', function () { - var spy = sinon.stub() + var spy = sinon.stub(); global.jasmine = { getEnv: function () { return { addReporter: spy - } + }; } - } + }; - JsReporters.autoRegister() + JsReporters.autoRegister(); - expect(spy).to.have.been.calledOnce - }) + expect(spy).to.have.been.calledOnce; + }); it('should throw an error if no testing framework was found', function () { - expect(JsReporters.autoRegister).to.throw(Error) - }) - }) + expect(JsReporters.autoRegister).to.throw(Error); + }); + }); describe('create functions', function () { it('should return a suite start', function () { - var startSuite = JsReporters.createSuiteStart(data.startSuite) + var startSuite = JsReporters.createSuiteStart(data.startSuite); - expect(startSuite).to.be.deep.equal(data.startSuite) - }) + expect(startSuite).to.be.deep.equal(data.startSuite); + }); it('should return a test start', function () { - var startTest = JsReporters.createTestStart(data.startTest) + var startTest = JsReporters.createTestStart(data.startTest); - expect(startTest).to.be.deep.equal(data.startTest) - }) + expect(startTest).to.be.deep.equal(data.startTest); + }); it('should return a test end', function () { - var endTest = JsReporters.createTestEnd(data.endTest) + var endTest = JsReporters.createTestEnd(data.endTest); - expect(endTest).to.be.deep.equal(data.endTest) - }) + expect(endTest).to.be.deep.equal(data.endTest); + }); it('should return a suite end', function () { - var endSuite = JsReporters.createSuiteEnd(data.endSuite) + var endSuite = JsReporters.createSuiteEnd(data.endSuite); - expect(endSuite).to.be.deep.equal(data.endSuite) - }) - }) -}) + expect(endSuite).to.be.deep.equal(data.endSuite); + }); + }); +}); diff --git a/test/unit/tap-reporter.js b/test/unit/tap-reporter.js index 0b26335..635edb4 100644 --- a/test/unit/tap-reporter.js +++ b/test/unit/tap-reporter.js @@ -1,124 +1,124 @@ /* eslint-env mocha */ -var chai = require('chai') -var chalk = require('chalk') -var sinon = require('sinon') -var EventEmitter = require('events').EventEmitter -var JsReporters = require('../../dist/js-reporters.js') -var data = require('./data.js') -var expect = chai.expect +var chai = require('chai'); +var chalk = require('chalk'); +var sinon = require('sinon'); +var EventEmitter = require('events').EventEmitter; +var JsReporters = require('../../dist/js-reporters.js'); +var data = require('./data.js'); +var expect = chai.expect; -chai.use(require('sinon-chai')) +chai.use(require('sinon-chai')); describe('Tap reporter', function () { - var emitter + var emitter; before(function () { - emitter = new EventEmitter() - JsReporters.TapReporter.init(emitter) - }) + emitter = new EventEmitter(); + JsReporters.TapReporter.init(emitter); + }); it('should output the TAP header', sinon.test(function () { - var spy = this.stub(console, 'log') + var spy = this.stub(console, 'log'); - emitter.emit('runStart', {}) + emitter.emit('runStart', {}); - expect(spy).to.have.been.calledOnce - })) + expect(spy).to.have.been.calledOnce; + })); it('should output ok for a passing test', sinon.test(function () { - var spy = this.stub(console, 'log') - var expected = 'ok 1 ' + data.passingTest.fullName.join(' > ') + var spy = this.stub(console, 'log'); + var expected = 'ok 1 ' + data.passingTest.fullName.join(' > '); - emitter.emit('testEnd', data.passingTest) + emitter.emit('testEnd', data.passingTest); - expect(spy).to.have.been.calledWith(expected) - })) + expect(spy).to.have.been.calledWith(expected); + })); it('should output ok for a skipped test', sinon.test(function () { - var spy = this.stub(console, 'log') - var expected = chalk.yellow('ok 2 # SKIP ' + data.skippedTest.fullName.join(' > ')) + var spy = this.stub(console, 'log'); + var expected = chalk.yellow('ok 2 # SKIP ' + data.skippedTest.fullName.join(' > ')); - emitter.emit('testEnd', data.skippedTest) + emitter.emit('testEnd', data.skippedTest); - expect(spy).to.have.been.calledWith(expected) - })) + expect(spy).to.have.been.calledWith(expected); + })); it('should output not ok for a todo test', sinon.test(function () { - var spy = this.stub(console, 'log') - var expected = chalk.cyan('not ok 3 # TODO ' + data.todoTest.fullName.join(' > ')) + var spy = this.stub(console, 'log'); + var expected = chalk.cyan('not ok 3 # TODO ' + data.todoTest.fullName.join(' > ')); - emitter.emit('testEnd', data.todoTest) + emitter.emit('testEnd', data.todoTest); - expect(spy).to.have.been.calledWith(expected) - })) + expect(spy).to.have.been.calledWith(expected); + })); it('should output not ok for a failing test', sinon.test(function () { - var spy = this.stub(console, 'log') - var expected = chalk.red('not ok 4 ' + data.failingTest.fullName.join(' > ')) + var spy = this.stub(console, 'log'); + var expected = chalk.red('not ok 4 ' + data.failingTest.fullName.join(' > ')); - emitter.emit('testEnd', data.failingTest) + emitter.emit('testEnd', data.failingTest); - expect(spy).to.have.been.calledWith(expected) - })) + expect(spy).to.have.been.calledWith(expected); + })); it('should output all errors for a failing test', sinon.test(function () { - var spy = this.stub(console, 'log') - var expected = [] + var spy = this.stub(console, 'log'); + var expected = []; data.failingTest.errors.forEach(function (error) { - expected.push(' ---') - expected.push(' message: "' + error.message.replace(/"/g, '\\"') + '"') - expected.push(' severity: failed') - expected.push(' stack: "' + error.stack.replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"') - expected.push(' ...') - }) - - emitter.emit('testEnd', data.failingTest) + expected.push(' ---'); + expected.push(' message: "' + error.message.replace(/"/g, '\\"') + '"'); + expected.push(' severity: failed'); + expected.push(' stack: "' + error.stack.replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"'); + expected.push(' ...'); + }); + + emitter.emit('testEnd', data.failingTest); for (var i = 0; i < expected.length; i++) { - expect(spy).to.have.been.calledWith(expected[i]) + expect(spy).to.have.been.calledWith(expected[i]); } - })) + })); it('should output actual value for failed assertions even it was undefined', sinon.test(function () { - var spy = this.stub(console, 'log') + var spy = this.stub(console, 'log'); - emitter.emit('testEnd', data.actualUndefinedTest) + emitter.emit('testEnd', data.actualUndefinedTest); - expect(spy).to.have.been.calledWith(' actual : undefined') - })) + expect(spy).to.have.been.calledWith(' actual : undefined'); + })); it('should output actual value for failed assertions even it was falsy', sinon.test(function () { - var spy = this.stub(console, 'log') + var spy = this.stub(console, 'log'); - emitter.emit('testEnd', data.actualFalsyTest) + emitter.emit('testEnd', data.actualFalsyTest); - expect(spy).to.have.been.calledWith(' actual : "0"') - })) + expect(spy).to.have.been.calledWith(' actual : "0"'); + })); it('should output expected value for failed assertions even it was undefined', sinon.test(function () { - var spy = this.stub(console, 'log') + var spy = this.stub(console, 'log'); - emitter.emit('testEnd', data.expectedUndefinedTest) + emitter.emit('testEnd', data.expectedUndefinedTest); - expect(spy).to.have.been.calledWith(' expected: undefined') - })) + expect(spy).to.have.been.calledWith(' expected: undefined'); + })); it('should output expected value for failed assertions even it was falsy', sinon.test(function () { - var spy = this.stub(console, 'log') + var spy = this.stub(console, 'log'); - emitter.emit('testEnd', data.expectedFalsyTest) + emitter.emit('testEnd', data.expectedFalsyTest); - expect(spy).to.have.been.calledWith(' expected: "0"') - })) + expect(spy).to.have.been.calledWith(' expected: "0"'); + })); it('should output the total number of tests', sinon.test(function () { - var spy = this.stub(console, 'log') - var summary = '1..6' - var passCount = '# pass 3' - var skipCount = chalk.yellow('# skip 1') - var todoCount = chalk.cyan('# todo 0') - var failCount = chalk.red('# fail 2') + var spy = this.stub(console, 'log'); + var summary = '1..6'; + var passCount = '# pass 3'; + var skipCount = chalk.yellow('# skip 1'); + var todoCount = chalk.cyan('# todo 0'); + var failCount = chalk.red('# fail 2'); emitter.emit('runEnd', { testCounts: { @@ -128,12 +128,12 @@ describe('Tap reporter', function () { skipped: 1, todo: 0 } - }) - - expect(spy).to.have.been.calledWith(summary) - expect(spy).to.have.been.calledWith(passCount) - expect(spy).to.have.been.calledWith(skipCount) - expect(spy).to.have.been.calledWith(todoCount) - expect(spy).to.have.been.calledWith(failCount) - })) -}) + }); + + expect(spy).to.have.been.calledWith(summary); + expect(spy).to.have.been.calledWith(passCount); + expect(spy).to.have.been.calledWith(skipCount); + expect(spy).to.have.been.calledWith(todoCount); + expect(spy).to.have.been.calledWith(failCount); + })); +}); diff --git a/test/versions/failing-versions.js b/test/versions/failing-versions.js index ba67bf2..56f0420 100644 --- a/test/versions/failing-versions.js +++ b/test/versions/failing-versions.js @@ -26,4 +26,4 @@ module.exports = { '1.8.2', '1.9.0', '1.10.0', '1.11.0', '1.12.0', '1.12.1', '1.13.0', '1.14.0', '1.15.0', '1.15.1', '1.16.0', '1.16.1', '1.16.2', '1.17.0', '1.17.1', '2.1.0', '2.5.0'] -} +}; diff --git a/test/versions/versions-reporting.js b/test/versions/versions-reporting.js index 5f8e01c..58a856a 100644 --- a/test/versions/versions-reporting.js +++ b/test/versions/versions-reporting.js @@ -1,9 +1,9 @@ -var childProcess = require('child_process') -var chalk = require('chalk') -var frameworks = ['QUnitJS', 'Jasmine', 'Mocha'] +var childProcess = require('child_process'); +var chalk = require('chalk'); +var frameworks = ['QUnitJS', 'Jasmine', 'Mocha']; -console.log() -childProcess.execSync('npm run build') +console.log(); +childProcess.execSync('npm run build'); /** * Takes each version of each framework available on npm and runs the tests @@ -11,42 +11,42 @@ childProcess.execSync('npm run build') * the js-reporters adapters and which don't. */ frameworks.forEach(function (framework) { - var command = 'npm view ' + framework.toLowerCase() + ' versions' + var command = 'npm view ' + framework.toLowerCase() + ' versions'; var output = childProcess.execSync(command).toString() - .replace(/[[]|]|'| |\n/g, '') - var versions = output.split(',') - var workingVersions = [] - var notWorkingVersions = [] + .replace(/[[]|]|'| |\n/g, ''); + var versions = output.split(','); + var workingVersions = []; + var notWorkingVersions = []; - console.log(chalk.underline.bold.green(framework)) - console.log() + console.log(chalk.underline.bold.green(framework)); + console.log(); versions.forEach(function (version) { - console.log(chalk.dim('Testing version: ' + version)) + console.log(chalk.dim('Testing version: ' + version)); - command = 'npm install ' + framework.toLowerCase() + '@' + version + command = 'npm install ' + framework.toLowerCase() + '@' + version; childProcess.execSync(command, { stdio: ['ignore', 'ignore', 'ignore'] - }) + }); - var details = childProcess.spawnSync('npm', ['run', 'test-integration']) + var details = childProcess.spawnSync('npm', ['run', 'test-integration']); if (details.status === 0) { - workingVersions.push(version) + workingVersions.push(version); } else { - notWorkingVersions.push(version) + notWorkingVersions.push(version); } - }) + }); - module.exports[framework.toLowerCase()] = notWorkingVersions + module.exports[framework.toLowerCase()] = notWorkingVersions; - console.log() - console.log(chalk.green('Working: ' + workingVersions.join(', ') + ';')) - console.log(chalk.red('Not working: ' + notWorkingVersions.join(', ') + ';')) - console.log() -}) + console.log(); + console.log(chalk.green('Working: ' + workingVersions.join(', ') + ';')); + console.log(chalk.red('Not working: ' + notWorkingVersions.join(', ') + ';')); + console.log(); +}); // Install the versions from package.json. childProcess.execSync('npm install', { stdio: ['ignore', 'ignore', 'ignore'] -}) +}); diff --git a/test/versions/versions.js b/test/versions/versions.js index fabb696..d74d3f7 100644 --- a/test/versions/versions.js +++ b/test/versions/versions.js @@ -1,21 +1,21 @@ /* eslint-env mocha */ -var expect = require('chai').expect -var failingVersionsRef = require('./failing-versions.js') -var failingVersions = require('./versions-reporting.js') +var expect = require('chai').expect; +var failingVersionsRef = require('./failing-versions.js'); +var failingVersions = require('./versions-reporting.js'); describe('Versions', function () { it('QUnit versions', function () { expect(failingVersions['qunitjs']).to.be.deep - .equal(failingVersionsRef['qunitjs']) - }) + .equal(failingVersionsRef['qunitjs']); + }); it('Jasmine versions', function () { expect(failingVersions['jasmine']).to.be.deep - .equal(failingVersionsRef['jasmine']) - }) + .equal(failingVersionsRef['jasmine']); + }); it('Mocha versions', function () { expect(failingVersions['mocha']).to.be.deep - .equal(failingVersionsRef['mocha']) - }) -}) + .equal(failingVersionsRef['mocha']); + }); +});