From 343baca7838873dd84a22cb834303a5934308762 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 01:34:38 -0700 Subject: [PATCH 01/32] pdev:set --- lib/injection/injection-container.js | 11 +++++------ lib/injection/injection-container.ts | 13 +++++++------ lib/test-suite-helpers/make-start-suite.js | 1 - lib/test-suite-helpers/make-start-suite.ts | 1 - test/zoom.js | 2 ++ 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/injection/injection-container.js b/lib/injection/injection-container.js index 316ce19f..e10ff77b 100755 --- a/lib/injection/injection-container.js +++ b/lib/injection/injection-container.js @@ -43,13 +43,12 @@ exports.makeInjectionContainer = function (suman) { args[1][p] = true; }); args[1].__preParsed = true; - try { - var getter = "get_" + method; - return suman.ctx[getter]().apply(suman.ctx, args); - } - catch (err) { - throw new Error("property '" + method + "' is not available on test suite object.\n" + err.stack); + var getter = "get_" + method; + var meth = suman.ctx[getter]; + if (!meth) { + throw new Error("property '" + method + "' is not available on test suite object."); } + return meth().apply(suman.ctx, args); }; return suman.testBlockMethodCache[cacheId] = getProxy(fn, newProps); } diff --git a/lib/injection/injection-container.ts b/lib/injection/injection-container.ts index 59f0607b..55f6065d 100755 --- a/lib/injection/injection-container.ts +++ b/lib/injection/injection-container.ts @@ -82,14 +82,15 @@ export const makeInjectionContainer = function (suman: ISuman) { args[1].__preParsed = true; - try { - let getter = `get_${method}`; - return suman.ctx[getter]().apply(suman.ctx, args); - } - catch (err) { - throw new Error(`property '${method}' is not available on test suite object.\n` + err.stack); + let getter = `get_${method}`; + let meth = suman.ctx[getter]; + + if (!meth) { + throw new Error(`property '${method}' is not available on test suite object.`) } + return meth().apply(suman.ctx, args); + }; return suman.testBlockMethodCache[cacheId] = getProxy(fn, newProps); diff --git a/lib/test-suite-helpers/make-start-suite.js b/lib/test-suite-helpers/make-start-suite.js index 04d322d8..618596e4 100755 --- a/lib/test-suite-helpers/make-start-suite.js +++ b/lib/test-suite-helpers/make-start-suite.js @@ -121,7 +121,6 @@ exports.makeStartSuite = function (suman, gracefulExit, handleBeforesAndAfters, }, function allDone(err, results) { implementationError(err); Object.getPrototypeOf(self).isCompleted = true; - console.log('suite is done', self.desc); process.nextTick(function () { queueCB(); !earlyCallback && finished(); diff --git a/lib/test-suite-helpers/make-start-suite.ts b/lib/test-suite-helpers/make-start-suite.ts index eba6f8e4..61adc8fd 100755 --- a/lib/test-suite-helpers/make-start-suite.ts +++ b/lib/test-suite-helpers/make-start-suite.ts @@ -208,7 +208,6 @@ export const makeStartSuite = function (suman: ISuman, gracefulExit: Function, h // isCompleted means this block has completed, nothing more Object.getPrototypeOf(self).isCompleted = true; - console.log('suite is done', self.desc); process.nextTick(function () { queueCB(); // if earlyCallback is true, we have already called finished, cannot call it twice! diff --git a/test/zoom.js b/test/zoom.js index b3a50935..2787e5eb 100755 --- a/test/zoom.js +++ b/test/zoom.js @@ -12,6 +12,8 @@ Test.create(function (it, beforeEach, describe, assert, after) { h.assert.equal(true, true, 'moo'); }); + return; + it.cb.parallel('glue', t => { setTimeout(t, 100); }); From 507349e4dd2f4692bce539f877d8c39b678bb8bb Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 12:18:01 -0700 Subject: [PATCH 02/32] pdev:set --- lib/exec-suite.js | 28 ++++++-------- lib/exec-suite.ts | 30 +++++++-------- lib/helpers/handle-suman-counts.js | 1 + lib/helpers/handle-suman-counts.ts | 2 + lib/helpers/on-suman-completed.js | 1 + lib/helpers/on-suman-completed.ts | 2 + lib/index.js | 26 ++++++++++--- lib/index.ts | 34 +++++++++++++---- lib/suman.d.ts | 1 + lib/suman.js | 25 ++++++++++++ lib/suman.ts | 41 ++++++++++++++++++++ lib/test-suite-helpers/make-start-suite.js | 2 +- lib/test-suite-helpers/make-start-suite.ts | 2 +- test/ajax1.js | 4 +- test/simple.js | 44 +++++++++++----------- 15 files changed, 170 insertions(+), 73 deletions(-) diff --git a/lib/exec-suite.js b/lib/exec-suite.js index 07b7fb0f..2edf61aa 100755 --- a/lib/exec-suite.js +++ b/lib/exec-suite.js @@ -14,7 +14,6 @@ var pragmatik = require('pragmatik'); var _suman = global.__suman = (global.__suman || {}); var rules = require("./helpers/handle-varargs"); var suman_constants_1 = require("../config/suman-constants"); -var job_queue_1 = require("./helpers/job-queue"); var suman_utils_1 = require("suman-utils"); var make_graceful_exit_1 = require("./make-graceful-exit"); var acquire_ioc_deps_1 = require("./acquire-dependencies/acquire-ioc-deps"); @@ -210,7 +209,6 @@ exports.execSuite = function (suman) { _suman.logError("\"UncaughtException:Triggered\" => halting program.\n[" + __filename + "]"); return; } - var fn = async.eachLimit; var limit = 1; if (suite.parallel) { if (suite.limit) { @@ -222,24 +220,22 @@ exports.execSuite = function (suman) { } assert(Number.isInteger(limit) && limit > 0 && limit < 100, 'limit must be an integer between 1 and 100, inclusive.'); suite.__startSuite(function (err, results) { - results && _suman.logError('results => ', results); - err && _suman.logError('Test error data before log:', suite); + results && _suman.logError('Suman extraneous results:', results); + err && _suman.logError('Suman extraneous test error:', suite); var children = suite.getChildren().filter(function (child) { return !child.skipped; }); if (children.length < 1) { - process.nextTick(cb); - } - else { - sumanOpts.series && (_suman.currentPaddingCount.val += 3); - fn(children, limit, function (child, cb) { - runSuite(child, cb); - }, function (err) { - sumanOpts.series && (_suman.currentPaddingCount.val -= 3); - err && _suman.logError('Suman implementation error => ', err.stack || err); - process.nextTick(cb); - }); + return process.nextTick(cb); } + sumanOpts.series && (_suman.currentPaddingCount.val += 3); + async.eachLimit(children, limit, function (child, cb) { + runSuite(child, cb); + }, function (err) { + sumanOpts.series && (_suman.currentPaddingCount.val -= 3); + err && _suman.logError('Suman implementation error => ', err.stack || err); + process.nextTick(cb); + }); }); } runSuite(allDescribeBlocks[0], function complete() { @@ -250,7 +246,7 @@ exports.execSuite = function (suman) { } debugger; if (sumanOpts.parallel_max) { - job_queue_1.getQueue().drain = function () { + suman.getQueue().drain = function () { debugger; console.log('parallel max queue drained.'); onSumanCompleted(0, null); diff --git a/lib/exec-suite.ts b/lib/exec-suite.ts index 4d6e753a..d0c2e271 100755 --- a/lib/exec-suite.ts +++ b/lib/exec-suite.ts @@ -300,8 +300,6 @@ export const execSuite = function (suman: ISuman): Function { return; } - const fn: Function = async.eachLimit; - let limit = 1; if (suite.parallel) { if (suite.limit) { @@ -316,33 +314,31 @@ export const execSuite = function (suman: ISuman): Function { suite.__startSuite(function (err: IPseudoError, results: Object) { // results are object from async.series - results && _suman.logError('results => ', results); - err && _suman.logError('Test error data before log:', suite); + results && _suman.logError('Suman extraneous results:', results); + err && _suman.logError('Suman extraneous test error:', suite); const children = suite.getChildren().filter(function (child: ITestSuite) { - //TODO: this might be wrong, may need to omit filter return !child.skipped; }); if (children.length < 1) { - process.nextTick(cb) + return process.nextTick(cb) } - else { - sumanOpts.series && (_suman.currentPaddingCount.val += 3); + sumanOpts.series && (_suman.currentPaddingCount.val += 3); - fn(children, limit, function (child: ITestSuite, cb: Function) { + async.eachLimit(children, limit, function (child: ITestSuite, cb: Function) { - runSuite(child, cb); + runSuite(child, cb); - }, function (err: IPseudoError) { + }, function (err: IPseudoError) { - sumanOpts.series && (_suman.currentPaddingCount.val -= 3); - err && _suman.logError('Suman implementation error => ', err.stack || err); - process.nextTick(cb); + sumanOpts.series && (_suman.currentPaddingCount.val -= 3); + err && _suman.logError('Suman implementation error => ', err.stack || err); + process.nextTick(cb); + + }); - }); - } }); } @@ -358,7 +354,7 @@ export const execSuite = function (suman: ISuman): Function { debugger; if (sumanOpts.parallel_max) { - getQueue().drain = function () { + suman.getQueue().drain = function () { debugger; console.log('parallel max queue drained.'); onSumanCompleted(0, null); diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 228d7c70..9cde33a9 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -13,6 +13,7 @@ var suiteResultEmitter = _suman.suiteResultEmitter = (_suman.suiteResultEmitter var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); var results = _suman.tableResults = (_suman.tableResults || []); suiteResultEmitter.once('suman-test-file-complete', function () { + debugger; var fn, resultz; if (_suman.usingRunner) { resultz = results.map(function (i) { return i.tableData; }); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index 0ba815ee..aebfe8ad 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -33,6 +33,8 @@ const results: Array = _suman.tableResults = (_suman.tabl suiteResultEmitter.once('suman-test-file-complete', function () { + debugger; + let fn, resultz; if (_suman.usingRunner) { diff --git a/lib/helpers/on-suman-completed.js b/lib/helpers/on-suman-completed.js index b8b840ac..bff5598d 100755 --- a/lib/helpers/on-suman-completed.js +++ b/lib/helpers/on-suman-completed.js @@ -12,6 +12,7 @@ var results = _suman.tableResults = (_suman.tableResults || []); exports.makeOnSumanCompleted = function (suman) { return function onSumanCompleted(code, msg) { suman.sumanCompleted = true; + console.log('a suman has completed!'); process.nextTick(function () { suman.logFinished(code || 0, msg, function (err, val) { if (_suman.sumanOpts.check_memory_usage) { diff --git a/lib/helpers/on-suman-completed.ts b/lib/helpers/on-suman-completed.ts index fad8ea94..dab4ecbf 100755 --- a/lib/helpers/on-suman-completed.ts +++ b/lib/helpers/on-suman-completed.ts @@ -34,6 +34,8 @@ export const makeOnSumanCompleted = function (suman: ISuman) { suman.sumanCompleted = true; + console.log('a suman has completed!'); + process.nextTick(function () { suman.logFinished(code || 0, msg, function (err: Error | string, val: any) { diff --git a/lib/index.js b/lib/index.js index c04a43a8..88273646 100755 --- a/lib/index.js +++ b/lib/index.js @@ -80,25 +80,31 @@ fs.writeFileSync(testDebugLogPath, '\n', { flag: 'w' }); fs.writeFileSync(testLogPath, '\n => New Suman run @' + new Date(), { flag: 'w' }); var loaded = false; var testSuiteQueueCallbacks = []; +var testRuns = []; +var testSuiteRegistrationQueueCallbacks = []; var c = (sumanOpts && sumanOpts.series) ? 1 : 3; var testSuiteQueue = async.queue(function (task, cb) { + debugger; testSuiteQueueCallbacks.unshift(cb); process.nextTick(task); }, c); -var testRuns = []; -var testSuiteRegistrationQueueCallbacks = []; var testSuiteRegistrationQueue = async.queue(function (task, cb) { testSuiteRegistrationQueueCallbacks.unshift(cb); process.nextTick(task); }, c); testSuiteRegistrationQueue.drain = function () { - testRuns.forEach(function (fn) { - testSuiteQueue.push(fn); - }); + _suman.log("Pushing " + testRuns.length + " test suites onto queue with concurrency " + c + "."); + debugger; + while (testRuns.length > 0) { + testSuiteQueue.push(testRuns.shift()); + } }; testSuiteQueue.drain = function () { + debugger; + console.log('DRAIN DRAIN DRAIN suman-test-file-complete event!!'); suiteResultEmitter.emit('suman-test-file-complete'); }; +console.log('util.inspect(testSuiteQueue)\n', util.inspect(testSuiteQueue)); suiteResultEmitter.on('suman-test-registered', function (fn) { testRuns.push(fn); process.nextTick(function () { @@ -108,8 +114,16 @@ suiteResultEmitter.on('suman-test-registered', function (fn) { }); suiteResultEmitter.on('suman-completed', function () { process.nextTick(function () { + debugger; var fn = testSuiteQueueCallbacks.pop(); - fn && fn.call(null); + if (fn) { + debugger; + fn.call(null); + } + else if (sumanOpts.parallel_max) { + debugger; + suiteResultEmitter.emit('suman-test-file-complete'); + } }); }); exports.init = function ($module, $opts, confOverride) { diff --git a/lib/index.ts b/lib/index.ts index 140911c3..fadcbe82 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -137,15 +137,17 @@ fs.writeFileSync(testLogPath, '\n => New Suman run @' + new Date(), {flag: 'w'}) let loaded = false; const testSuiteQueueCallbacks: Array = []; +const testRuns: Array = []; +const testSuiteRegistrationQueueCallbacks: Array = []; + const c = (sumanOpts && sumanOpts.series) ? 1 : 3; const testSuiteQueue = async.queue(function (task: Function, cb: Function) { + debugger; testSuiteQueueCallbacks.unshift(cb); process.nextTick(task); }, c); -const testRuns: Array = []; -const testSuiteRegistrationQueueCallbacks: Array = []; const testSuiteRegistrationQueue = async.queue(function (task: Function, cb: Function) { // important! => Test.creates need to be registered only one at a time testSuiteRegistrationQueueCallbacks.unshift(cb); @@ -153,15 +155,21 @@ const testSuiteRegistrationQueue = async.queue(function (task: Function, cb: Fun }, c); testSuiteRegistrationQueue.drain = function () { - testRuns.forEach(function (fn) { - testSuiteQueue.push(fn); - }); + _suman.log(`Pushing ${testRuns.length} test suites onto queue with concurrency ${c}.`); + debugger; + while(testRuns.length > 0){ //explicit for your pleasure + testSuiteQueue.push(testRuns.shift()); + } }; testSuiteQueue.drain = function () { + debugger; + console.log('DRAIN DRAIN DRAIN suman-test-file-complete event!!'); suiteResultEmitter.emit('suman-test-file-complete'); }; +console.log('util.inspect(testSuiteQueue)\n',util.inspect(testSuiteQueue)); + suiteResultEmitter.on('suman-test-registered', function (fn: Function) { testRuns.push(fn); process.nextTick(function () { @@ -172,9 +180,19 @@ suiteResultEmitter.on('suman-test-registered', function (fn: Function) { suiteResultEmitter.on('suman-completed', function () { // we set this to null because no suman should be in progress + process.nextTick(function () { + debugger; let fn = testSuiteQueueCallbacks.pop(); - fn && fn.call(null); + if (fn) { + debugger; + fn.call(null); + } + else if (sumanOpts.parallel_max) { + debugger; + suiteResultEmitter.emit('suman-test-file-complete'); + } + }); }); @@ -367,7 +385,7 @@ export const init: IInit = function ($module, $opts, confOverride): IStartCreate _suman.logError(err.stack || err); _suman.writeTestError(err.stack || err); process.exit(constants.EXIT_CODES.PRE_VALS_ERROR); - }) + }); }; @@ -397,6 +415,8 @@ export const init: IInit = function ($module, $opts, confOverride): IStartCreate const create = init.$ingletonian.create = start; _interface === 'TDD' ? init.$ingletonian.suite = create : init.$ingletonian.describe = create; + + loaded = true; return init.$ingletonian; diff --git a/lib/suman.d.ts b/lib/suman.d.ts index 1897a861..352f93ed 100755 --- a/lib/suman.d.ts +++ b/lib/suman.d.ts @@ -28,6 +28,7 @@ export declare class Suman { extraArgs: Array; sumanCompleted: boolean; desc: string; + getQueue: Function; constructor(obj: ISumanInputs); getTableData(): void; logFinished($exitCode: number, skippedString: string, cb: Function): void; diff --git a/lib/suman.js b/lib/suman.js index a9fb5d6f..e9c928a2 100755 --- a/lib/suman.js +++ b/lib/suman.js @@ -3,10 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); var path = require("path"); +var assert = require("assert"); var EE = require("events"); var flattenDeep = require('lodash.flattendeep'); var readline = require('readline'); var AsciiTable = require('ascii-table'); +var async = require("async"); var fnArgs = require('function-arguments'); var suman_events_1 = require("suman-events"); var suman_utils_1 = require("suman-utils"); @@ -16,6 +18,10 @@ var find_suman_server_1 = require("./helpers/find-suman-server"); var suman_constants_1 = require("../config/suman-constants"); var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); var socketio_child_client_1 = require("./index-helpers/socketio-child-client"); +var envTotal, envConfig; +if (process.env.DEFAULT_PARALLEL_TOTAL_LIMIT && (envTotal = Number(process.env.DEFAULT_PARALLEL_TOTAL_LIMIT))) { + assert(Number.isInteger(envTotal), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); +} var sumanId = 0; var Suman = (function () { function Suman(obj) { @@ -34,6 +40,25 @@ var Suman = (function () { this.numHooksSkipped = 0; this.numHooksStubbed = 0; this.numBlocksSkipped = 0; + var queue; + this.getQueue = function () { + if (!queue) { + var sumanConfig = _suman.sumanConfig, sumanOpts = _suman.sumanOpts; + if (sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT && + (envConfig = Number(_suman.sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT))) { + assert(Number.isInteger(envConfig), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); + } + var c = 1; + if (!sumanOpts.series) { + c = envTotal || envConfig || suman_constants_1.constants.DEFAULT_PARALLEL_TOTAL_LIMIT; + } + assert(Number.isInteger(c) && c > 0 && c < 301, 'DEFAULT_PARALLEL_TOTAL_LIMIT must be an integer between 1 and 300 inclusive.'); + queue = async.queue(function (task, cb) { + task(cb); + }, c); + } + return queue; + }; } Suman.prototype.getTableData = function () { throw new Error('Suman implementation error => not yet implemented.'); diff --git a/lib/suman.ts b/lib/suman.ts index dc0ab97a..98810351 100755 --- a/lib/suman.ts +++ b/lib/suman.ts @@ -38,6 +38,12 @@ import {constants} from '../config/suman-constants'; const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); import {getClient} from './index-helpers/socketio-child-client'; +let envTotal: number, envConfig: number; + +if (process.env.DEFAULT_PARALLEL_TOTAL_LIMIT && (envTotal = Number(process.env.DEFAULT_PARALLEL_TOTAL_LIMIT))) { + assert(Number.isInteger(envTotal), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); +} + ////////////////////////////////////////////////////////////////////////////// let sumanId = 0; @@ -69,6 +75,7 @@ export class Suman { extraArgs: Array; sumanCompleted: boolean; desc: string; + getQueue: Function; //////////////////////////////////// @@ -93,6 +100,40 @@ export class Suman { this.numHooksSkipped = 0; this.numHooksStubbed = 0; this.numBlocksSkipped = 0; + + let queue: any; + + this.getQueue = function () { + + if (!queue) { + + const {sumanConfig, sumanOpts} = _suman; + // note: we have to create the queue after loading this file, so that _suman.sumanConfig is defined. + + if (sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT && + (envConfig = Number(_suman.sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT))) { + assert(Number.isInteger(envConfig), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); + } + + let c = 1; // concurrency + + if (!sumanOpts.series) { + c = envTotal || envConfig || constants.DEFAULT_PARALLEL_TOTAL_LIMIT; + } + + assert(Number.isInteger(c) && c > 0 && c < 301, + 'DEFAULT_PARALLEL_TOTAL_LIMIT must be an integer between 1 and 300 inclusive.'); + + queue = async.queue(function (task: Function, cb: Function) { + task(cb); + }, c); + + } + + return queue; + + }; + } getTableData() { diff --git a/lib/test-suite-helpers/make-start-suite.js b/lib/test-suite-helpers/make-start-suite.js index 618596e4..9eb0ce5c 100755 --- a/lib/test-suite-helpers/make-start-suite.js +++ b/lib/test-suite-helpers/make-start-suite.js @@ -24,7 +24,7 @@ exports.makeStartSuite = function (suman, gracefulExit, handleBeforesAndAfters, } this.mergeAfters(); var itOnlyIsTriggered = suman.itOnlyIsTriggered; - var q = getQueue(); + var q = suman.getQueue(); var earlyCallback = Boolean(sumanOpts.parallel_max); q.push(function (queueCB) { async.series({ diff --git a/lib/test-suite-helpers/make-start-suite.ts b/lib/test-suite-helpers/make-start-suite.ts index 61adc8fd..dfc16219 100755 --- a/lib/test-suite-helpers/make-start-suite.ts +++ b/lib/test-suite-helpers/make-start-suite.ts @@ -58,7 +58,7 @@ export const makeStartSuite = function (suman: ISuman, gracefulExit: Function, h this.mergeAfters(); const itOnlyIsTriggered = suman.itOnlyIsTriggered; - const q = getQueue(); + const q = suman.getQueue(); let earlyCallback = Boolean(sumanOpts.parallel_max); diff --git a/test/ajax1.js b/test/ajax1.js index 2db04f39..2405d7a0 100644 --- a/test/ajax1.js +++ b/test/ajax1.js @@ -46,15 +46,13 @@ Test.create('hotels', function (it, before, beforeEach, context, afterAllParentH it('is cool story bro 2', t => { setTimeout(function(){ - throw Error('radical'); + // throw Error('radical'); },10); }); context('zoo', function () { - console.log('this.shared real', this.shared.getAll()); - }); }); diff --git a/test/simple.js b/test/simple.js index c1df49ac..2f0cd943 100644 --- a/test/simple.js +++ b/test/simple.js @@ -20,28 +20,28 @@ Test.create('hotels2', {parallel: false}, function (it, before, beforeEach, desc setTimeout(t, 100); }); - describe('innner1', function ($block) { - - it.only.cb('third 1', t => { - setTimeout(t, 100); - }); - - it.only.cb('third 2'); - }); - - describe('innner2', function () { - - it.cb('fourth', t => { - setTimeout(t, 100); - }); - }); - - describe('inner3', function () { - - it.cb('fifth', t => { - setTimeout(t, 100); - }); - }); + // describe('innner1', function ($block) { + // + // it.only.cb('third 1', t => { + // setTimeout(t, 100); + // }); + // + // it.only.cb('third 2'); + // }); + // + // describe('innner2', function () { + // + // it.cb('fourth', t => { + // setTimeout(t, 100); + // }); + // }); + // + // describe('inner3', function () { + // + // it.cb('fifth', t => { + // setTimeout(t, 100); + // }); + // }); }); From ae0374cb11751d608e46d22166433b5aa8ff6a53 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 13:30:48 -0700 Subject: [PATCH 03/32] pdev:set --- exp.js | 32 ++++++++---------------------- lib/exec-suite.js | 1 - lib/exec-suite.ts | 1 - lib/helpers/on-suman-completed.js | 1 - lib/helpers/on-suman-completed.ts | 2 -- lib/index.js | 12 +---------- lib/index.ts | 16 +++++---------- test/simple.js | 33 ++++++++++++++++++++++++++++--- 8 files changed, 44 insertions(+), 54 deletions(-) diff --git a/exp.js b/exp.js index e6873f1a..2bf9552c 100644 --- a/exp.js +++ b/exp.js @@ -1,27 +1,11 @@ -// -// const v = {}; -// -// var mirrorCache = {}; -// const z = new Proxy(v, { -// set: function (target, property, value, receiver) { -// if (mirrorCache[property]) { -// throw new Error("property '" + property + "' has already been set."); -// } -// mirrorCache[property] = true; -// Object.defineProperty(target, property, { -// writable: true, -// value: (value && typeof value === 'object') ? mcProxy(value) : value -// }); -// return true; -// } -// }); -// -// z.foo = 3; -// console.log(z.foo); // 3 -// -// const x = Object.assign({},v); -// console.log(x.foo); // undefined (expect to be 3) -console.log({bear: 'chair', moose: {goose: 3}}); +let sym = Symbol('foo'); +let sym2 = Symbol('foo'); +let obj = {}; +obj[sym] = 5; +console.log(obj[sym]); +console.log(obj[sym2]); + + diff --git a/lib/exec-suite.js b/lib/exec-suite.js index 2edf61aa..1e7eee64 100755 --- a/lib/exec-suite.js +++ b/lib/exec-suite.js @@ -248,7 +248,6 @@ exports.execSuite = function (suman) { if (sumanOpts.parallel_max) { suman.getQueue().drain = function () { debugger; - console.log('parallel max queue drained.'); onSumanCompleted(0, null); }; } diff --git a/lib/exec-suite.ts b/lib/exec-suite.ts index d0c2e271..f5b4c759 100755 --- a/lib/exec-suite.ts +++ b/lib/exec-suite.ts @@ -356,7 +356,6 @@ export const execSuite = function (suman: ISuman): Function { if (sumanOpts.parallel_max) { suman.getQueue().drain = function () { debugger; - console.log('parallel max queue drained.'); onSumanCompleted(0, null); } } diff --git a/lib/helpers/on-suman-completed.js b/lib/helpers/on-suman-completed.js index bff5598d..b8b840ac 100755 --- a/lib/helpers/on-suman-completed.js +++ b/lib/helpers/on-suman-completed.js @@ -12,7 +12,6 @@ var results = _suman.tableResults = (_suman.tableResults || []); exports.makeOnSumanCompleted = function (suman) { return function onSumanCompleted(code, msg) { suman.sumanCompleted = true; - console.log('a suman has completed!'); process.nextTick(function () { suman.logFinished(code || 0, msg, function (err, val) { if (_suman.sumanOpts.check_memory_usage) { diff --git a/lib/helpers/on-suman-completed.ts b/lib/helpers/on-suman-completed.ts index dab4ecbf..fad8ea94 100755 --- a/lib/helpers/on-suman-completed.ts +++ b/lib/helpers/on-suman-completed.ts @@ -34,8 +34,6 @@ export const makeOnSumanCompleted = function (suman: ISuman) { suman.sumanCompleted = true; - console.log('a suman has completed!'); - process.nextTick(function () { suman.logFinished(code || 0, msg, function (err: Error | string, val: any) { diff --git a/lib/index.js b/lib/index.js index 88273646..73a1c068 100755 --- a/lib/index.js +++ b/lib/index.js @@ -93,18 +93,14 @@ var testSuiteRegistrationQueue = async.queue(function (task, cb) { process.nextTick(task); }, c); testSuiteRegistrationQueue.drain = function () { - _suman.log("Pushing " + testRuns.length + " test suites onto queue with concurrency " + c + "."); - debugger; + _suman.log("Pushing " + testRuns.length + " test suites onto queue with concurrency " + c + ".\n"); while (testRuns.length > 0) { testSuiteQueue.push(testRuns.shift()); } }; testSuiteQueue.drain = function () { - debugger; - console.log('DRAIN DRAIN DRAIN suman-test-file-complete event!!'); suiteResultEmitter.emit('suman-test-file-complete'); }; -console.log('util.inspect(testSuiteQueue)\n', util.inspect(testSuiteQueue)); suiteResultEmitter.on('suman-test-registered', function (fn) { testRuns.push(fn); process.nextTick(function () { @@ -114,16 +110,10 @@ suiteResultEmitter.on('suman-test-registered', function (fn) { }); suiteResultEmitter.on('suman-completed', function () { process.nextTick(function () { - debugger; var fn = testSuiteQueueCallbacks.pop(); if (fn) { - debugger; fn.call(null); } - else if (sumanOpts.parallel_max) { - debugger; - suiteResultEmitter.emit('suman-test-file-complete'); - } }); }); exports.init = function ($module, $opts, confOverride) { diff --git a/lib/index.ts b/lib/index.ts index fadcbe82..80ef4580 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -155,20 +155,16 @@ const testSuiteRegistrationQueue = async.queue(function (task: Function, cb: Fun }, c); testSuiteRegistrationQueue.drain = function () { - _suman.log(`Pushing ${testRuns.length} test suites onto queue with concurrency ${c}.`); - debugger; + _suman.log(`Pushing ${testRuns.length} test suites onto queue with concurrency ${c}.\n`); while(testRuns.length > 0){ //explicit for your pleasure testSuiteQueue.push(testRuns.shift()); } }; testSuiteQueue.drain = function () { - debugger; - console.log('DRAIN DRAIN DRAIN suman-test-file-complete event!!'); suiteResultEmitter.emit('suman-test-file-complete'); }; -console.log('util.inspect(testSuiteQueue)\n',util.inspect(testSuiteQueue)); suiteResultEmitter.on('suman-test-registered', function (fn: Function) { testRuns.push(fn); @@ -182,16 +178,14 @@ suiteResultEmitter.on('suman-completed', function () { // we set this to null because no suman should be in progress process.nextTick(function () { - debugger; let fn = testSuiteQueueCallbacks.pop(); if (fn) { - debugger; fn.call(null); } - else if (sumanOpts.parallel_max) { - debugger; - suiteResultEmitter.emit('suman-test-file-complete'); - } + // else if (sumanOpts.parallel_max) { + // debugger; + // suiteResultEmitter.emit('suman-test-file-complete'); + // } }); }); diff --git a/test/simple.js b/test/simple.js index 2f0cd943..451b07e8 100644 --- a/test/simple.js +++ b/test/simple.js @@ -13,13 +13,40 @@ Test.create('hotels1', {parallel: false}, function (it, before, beforeEach) { }); +const Promise = require('bluebird'); -Test.create('hotels2', {parallel: false}, function (it, before, beforeEach, describe) { - it.cb('second', t => { - setTimeout(t, 100); +Test.create('hotels2', function (it, before, beforeEach, describe) { + + + before(h => { + return Promise.delay(100); + }); + + it('first', t => { + + }); + + describe('one',function () { + + it('second', t => { + + }); + + describe('two',function () { + + + it('third', t => { + + }); + + + + }); + }); + // describe('innner1', function ($block) { // // it.only.cb('third 1', t => { From f85d70ee1b365a0855fa18b81b39101d0ae49f26 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 16:30:58 -0700 Subject: [PATCH 04/32] pdev:set --- exp.js | 54 ++++++++++++++++-- lib/index.js | 4 +- lib/index.ts | 14 +---- lib/test-suite-helpers/t-proto-hook.js | 10 ++-- lib/test-suite-helpers/t-proto-hook.ts | 19 +++--- lib/test-suite-helpers/t-proto-test.js | 10 ++-- lib/test-suite-helpers/t-proto-test.ts | 18 +++--- test/_suman/gantt-4.html | 2 +- .../{ => exp}/agnostic-not-js/golang/@run.sh | 0 .../agnostic-not-js/golang/@transform.sh | 0 .../agnostic-not-js/golang/src/rue.go | 0 .../agnostic-not-js/golang/src/vue.go | 0 .../agnostic-not-js/golang/target/go.suman | Bin .../{ => exp}/agnostic-not-js/java/@run.sh | 0 .../agnostic-not-js/java/@transform.sh | 0 .../{ => exp}/agnostic-not-js/java/README.md | 0 .../java/dependency-reduced-pom.xml | 0 .../agnostic-not-js/java/pom-original.xml | 0 .../{ => exp}/agnostic-not-js/java/pom.xml | 0 .../java/src/hello/Greeter.java | 0 .../java/src/hello/HelloWorld.java | 0 .../agnostic-not-js/java/src/xxx/MyClass.java | 0 .../java/src/xxx/MyClassTest.java | 0 .../java/src/xxx/MyTestRunner.java | 0 .../java/target/classes/hello/Greeter.class | Bin .../target/classes/hello/HelloWorld.class | Bin .../java/target/maven-archiver/pom.properties | 0 .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 0 .../java/target/original-suman-2.jar | Bin .../java/target/original-suman.jar | Bin .../agnostic-not-js/java/target/suman-2.jar | Bin .../agnostic-not-js/java/target/suman.jar | Bin .../{ => exp}/agnostic-not-js/perl/@run.sh | 0 .../agnostic-not-js/perl/@transform.sh | 0 .../src/{ => exp}/agnostic-not-js/perl/one.pl | 0 .../{ => exp}/agnostic-not-js/python/@run.sh | 0 .../agnostic-not-js/python/@transform.sh | 0 .../agnostic-not-js/python/src/one.py | 0 .../agnostic-not-js/python/target/one.py | 0 .../agnostic-not-js/ruby/one.test.rb | 0 .../{ => exp}/agnostic-not-js/shell/node-c.sh | 0 .../shell/parallel-advanced.sh | 0 .../shell/parallel-trifecta.sh | 0 .../agnostic-not-js/shell/parallel.sh | 0 .../agnostic-not-js/shell/postinstall.sh | 0 .../agnostic-not-js/shell/simple-group/a.sh | 0 .../agnostic-not-js/shell/simple-group/b.sh | 0 .../agnostic-not-js/shell/simple-group/c.sh | 0 test/src/{ => exp}/agnostic/bash/one.test.sh | 0 test/src/{ => exp}/agnostic/bash/src/one.test | Bin .../{ => exp}/agnostic/bash/src/one.test.go | 0 test/src/{ => exp}/agnostic/golang/.gitkeep | 0 test/src/{ => exp}/agnostic/java/.gitkeep | 0 test/src/{ => exp}/agnostic/perl/.gitkeep | 0 test/src/{ => exp}/agnostic/php/.gitkeep | 0 test/src/{ => exp}/agnostic/python/.gitkeep | 0 test/src/{ => exp}/agnostic/ruby/.gitkeep | 0 test/src/{ => exp}/babel/ava-test/file1.js | 0 test/src/{ => exp}/babel/ava/ava-ex.js | 0 test/src/{ => exp}/babel/ava/ava-probs.js | 0 test/src/{ => exp}/babel/ava/f.js | 0 test/src/{ => exp}/babel/babel/@run.sh | 0 test/src/{ => exp}/babel/babel/@transform.sh | 0 test/src/{ => exp}/babel/babel/src/await.js | 0 test/src/{ => exp}/babel/babel/src/test7.js | 0 test/src/{ => exp}/babel/babel/src/test8.js | 0 .../src/{ => exp}/babel/babel/target/await.js | 0 .../src/{ => exp}/babel/babel/target/test7.js | 0 .../src/{ => exp}/babel/babel/target/test8.js | 0 test/src/{ => exp}/babel/test-es7/one.js | 0 test/src/{ => exp}/babel/test-es7/test6.js | 0 test/src/{ => exp}/babel/test-es7/two.js | 0 test/src/{ => exp}/browser/chrome/close.html | 0 test/src/{ => exp}/browser/index.html | 0 test/src/{ => exp}/browser/karma/.gitkeep | 0 test/src/{ => exp}/browser/mozilla.js | 0 .../{ => exp}/browser/nightmare/one.test.js | 0 test/src/{ => exp}/browser/one.test.js | 0 .../{ => exp}/browser/phantomjs/one.test.js | 0 .../{ => exp}/browser/phantomjs/two.test.js | 0 .../{ => exp}/browser/selenium/one.test.js | 0 .../{ => exp}/browser/web-sockets/index.html | 0 test/src/{ => exp}/diagnostic/test-deps.js | 0 test/src/{ => exp}/domains/a.js | 0 test/src/{ => exp}/es5-es6/a.js | 0 .../es5-es6/async-registry-error/one.test.js | 0 .../es5-es6/async-registry-error/two.test.js | 0 test/src/{ => exp}/es5-es6/b.ts | 0 .../es5-es6/bail-feature/one.test.js | 0 .../build-recursion-tests/empty.test.js | 0 .../recursion-check/recursion-check2/test9.js | 0 .../recursion-check/test8.js | 0 .../tes-t7-start.test.js | 0 .../es5-es6/build-recursion-tests/tes-t7.js | 0 .../build-recursion-tests/test6.test.js | 0 test/src/{ => exp}/es5-es6/c.js | 0 .../async-registry-error/one.test.js | 0 .../five.test.js | 0 .../four.test.js | 0 .../six.test.js | 0 .../three.test.js | 0 .../two.test.js | 0 .../correct-exit-codes/hook-error/one.test.js | 0 .../correct-exit-codes/hook-error/two.test.js | 0 .../multiple-test-suites/two.test.js | 0 .../root-suite-error/three.test.js | 0 .../dep-injection/injected-values/cb.test.js | 0 .../dep-injection/injected-values/one.test.js | 0 .../es5-es6/dep-injection/one.test.js | 0 .../es5-es6/dep-injection/with-async-lib.js | 0 test/src/{ => exp}/es5-es6/deps.test.js | 0 test/src/{ => exp}/es5-es6/gulp-usage/two.js | 0 .../es5-es6/integration-tests/test0.js | 0 .../es5-es6/integration-tests/test1.js | 0 .../es5-es6/integration-tests/test2.js | 0 .../es5-es6/integration-tests/test3.js | 0 .../es5-es6/integration-tests/test4.js | 0 .../es5-es6/integration-tests/test5.js | 0 .../es5-es6/integration-tests/test6.js | 0 test/src/{ => exp}/es5-es6/j.js | 0 .../module-load-precedence/cluster-load.js | 0 .../es5-es6/multiple-test-suites/one.test.js | 0 .../es5-es6/multiple-test-suites/two.test.js | 0 .../{ => exp}/es5-es6/other-tests/test3.js | 0 .../{ => exp}/es5-es6/other-tests/test4.js | 0 .../{ => exp}/es5-es6/other-tests/test5.js | 0 .../{ => exp}/es5-es6/other-tests/test6.js | 0 .../es5-es6/par-vs-series/par-vs-series-1.js | 0 .../es5-es6/par-vs-series/par-vs-series-2.js | 0 .../es5-es6/par-vs-series/par-vs-series-3.js | 0 .../{ => exp}/es5-es6/parallel-tests/@run.sh | 0 .../es5-es6/parallel-tests/@transform.sh | 0 .../es5-es6/parallel-tests/src/par-test.js | 0 .../es5-es6/parallel-tests/src/ptest1.js | 0 .../es5-es6/parallel-tests/target/par-test.js | 0 .../es5-es6/parallel-tests/target/ptest1.js | 0 .../es5-es6/plan-and-confirm/one.test.js | 0 .../es5-es6/plan-and-confirm/two.test.js | 0 .../{ => exp}/es5-es6/simple-tests/one-1.js | 0 .../es5-es6/skip-and-only/one.test.js | 0 .../es5-es6/skip-and-only/three.test.js | 0 .../es5-es6/skip-and-only/two.test.js | 0 .../stubbed-hooks-and-test-cases/one.test.js | 0 .../stubbed-hooks-and-test-cases/two.test.js | 0 .../suman-single-process/par-vs-series-1.js | 0 .../suman-single-process/par-vs-series-2.js | 0 .../suman-single-process/par-vs-series-3.js | 0 .../es5-es6/test-suites-in-series/a.test.js | 0 .../es5-es6/test-suites-in-series/b.test.js | 0 .../es5-es6/test-tests/generatorz-babel.js | 0 .../es5-es6/test-tests/generatorz.js | 0 .../es5-es6/test-tests/many-commands.js | 0 test/src/{ => exp}/es5-es6/test-tests/one.js | 0 test/src/{ => exp}/es5-es6/test-tests/two.js | 0 .../es5-es6/use-async-lib/one.test.js | 0 .../es5-es6/use-async-lib/two.test.js | 0 test/src/{ => exp}/fly-user/Dockerfile | 0 test/src/{ => exp}/fly-user/open-subl.js | 0 test/src/{ => exp}/fly-user/script.sh | 0 test/src/{ => exp}/fly-user/use-docker2.sh | 0 test/src/{ => exp}/fly/Dockerfile | 0 test/src/{ => exp}/fly/script.sh | 0 .../{ => exp}/injections-suites/one.test.js | 0 test/src/{ => exp}/installation/Dockerfile | 0 test/src/{ => exp}/installation/package.json | 0 .../{ => exp}/installation/run-docker-test.sh | 0 .../test-install-post-publish2.sh | 0 .../installation/test-install-pre-publish.sh | 0 .../installation/test-new-install.js | 0 .../installation/test-new-install.sh | 0 test/src/{ => exp}/installation/test-suman.sh | 0 test/src/{ => exp}/interactive/interactive.js | 0 test/src/{ => exp}/mocha/@run.sh | 0 test/src/{ => exp}/mocha/mocha1.js | 0 test/src/{ => exp}/mocha/mocha2.js | 0 test/src/{ => exp}/mocha/one.mocha.test.js | 0 test/src/{ => exp}/npmlinkup/one.test.js | 0 test/src/{ => exp}/observables/first.test.js | 0 test/src/{ => exp}/once-pre/one.test.js | 0 .../src/{ => exp}/programmatic/macros/call.js | 0 .../{ => exp}/programmatic/macros/one.test.js | 0 .../programmatic/strm-sync-tests/output6.js | 0 .../programmatic/strm-sync-tests/output7.js | 0 .../programmatic/strm-sync-tests/output8.js | 0 .../programmatic/strm-sync-tests/output9.js | 0 .../programmatic/strm-sync-tests/test6.js | 0 .../programmatic/strm-sync-tests/test7.js | 0 .../programmatic/strm-sync-tests/test8.js | 0 .../programmatic/strm-sync-tests/test9.js | 0 test/src/{ => exp}/promises-patch/one.test.js | 0 test/src/{ => exp}/promises-patch/two.test.js | 0 test/src/{ => exp}/sqlite3/one.test.js | 0 test/src/{ => exp}/sqlite3/two.test.js | 0 test/src/{ => exp}/sqlite3/waterfall.test.js | 0 test/src/{ => exp}/streams/first.test.js | 0 test/src/{ => exp}/tap-output/@config.json | 0 .../tap-output/@src/tap-producer1.ts | 0 .../tap-output/@src/tap-producer2.ts | 0 .../tap-output/@target/tap-producer1.js | 0 .../tap-output/@target/tap-producer2.js | 0 test/src/{ => exp}/tap-output/tsconfig.json | 0 test/src/{ => exp}/tap-parsing/one.test.js | 0 test/src/{ => exp}/typescript/@run.sh | 0 test/src/{ => exp}/typescript/@src/a.test.ts | 0 test/src/{ => exp}/typescript/@src/a2.test.ts | 0 test/src/{ => exp}/typescript/@src/b.test.ts | 0 test/src/{ => exp}/typescript/@src/b2.test.ts | 0 .../{ => exp}/typescript/@target/a.test.js | 0 .../{ => exp}/typescript/@target/a2.test.js | 0 .../{ => exp}/typescript/@target/b.test.js | 0 .../{ => exp}/typescript/@target/b2.test.js | 0 test/src/{ => exp}/typescript/@transform.sh | 0 test/src/{ => exp}/typescript/tsconfig.json | 0 test/src/{ => exp}/unit/one-test.js | 0 215 files changed, 87 insertions(+), 44 deletions(-) rename test/src/{ => exp}/agnostic-not-js/golang/@run.sh (100%) rename test/src/{ => exp}/agnostic-not-js/golang/@transform.sh (100%) rename test/src/{ => exp}/agnostic-not-js/golang/src/rue.go (100%) rename test/src/{ => exp}/agnostic-not-js/golang/src/vue.go (100%) rename test/src/{ => exp}/agnostic-not-js/golang/target/go.suman (100%) rename test/src/{ => exp}/agnostic-not-js/java/@run.sh (100%) rename test/src/{ => exp}/agnostic-not-js/java/@transform.sh (100%) rename test/src/{ => exp}/agnostic-not-js/java/README.md (100%) rename test/src/{ => exp}/agnostic-not-js/java/dependency-reduced-pom.xml (100%) rename test/src/{ => exp}/agnostic-not-js/java/pom-original.xml (100%) rename test/src/{ => exp}/agnostic-not-js/java/pom.xml (100%) rename test/src/{ => exp}/agnostic-not-js/java/src/hello/Greeter.java (100%) rename test/src/{ => exp}/agnostic-not-js/java/src/hello/HelloWorld.java (100%) rename test/src/{ => exp}/agnostic-not-js/java/src/xxx/MyClass.java (100%) rename test/src/{ => exp}/agnostic-not-js/java/src/xxx/MyClassTest.java (100%) rename test/src/{ => exp}/agnostic-not-js/java/src/xxx/MyTestRunner.java (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/classes/hello/Greeter.class (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/classes/hello/HelloWorld.class (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/maven-archiver/pom.properties (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/original-suman-2.jar (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/original-suman.jar (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/suman-2.jar (100%) rename test/src/{ => exp}/agnostic-not-js/java/target/suman.jar (100%) rename test/src/{ => exp}/agnostic-not-js/perl/@run.sh (100%) rename test/src/{ => exp}/agnostic-not-js/perl/@transform.sh (100%) rename test/src/{ => exp}/agnostic-not-js/perl/one.pl (100%) rename test/src/{ => exp}/agnostic-not-js/python/@run.sh (100%) rename test/src/{ => exp}/agnostic-not-js/python/@transform.sh (100%) rename test/src/{ => exp}/agnostic-not-js/python/src/one.py (100%) rename test/src/{ => exp}/agnostic-not-js/python/target/one.py (100%) rename test/src/{ => exp}/agnostic-not-js/ruby/one.test.rb (100%) rename test/src/{ => exp}/agnostic-not-js/shell/node-c.sh (100%) rename test/src/{ => exp}/agnostic-not-js/shell/parallel-advanced.sh (100%) rename test/src/{ => exp}/agnostic-not-js/shell/parallel-trifecta.sh (100%) rename test/src/{ => exp}/agnostic-not-js/shell/parallel.sh (100%) rename test/src/{ => exp}/agnostic-not-js/shell/postinstall.sh (100%) rename test/src/{ => exp}/agnostic-not-js/shell/simple-group/a.sh (100%) rename test/src/{ => exp}/agnostic-not-js/shell/simple-group/b.sh (100%) rename test/src/{ => exp}/agnostic-not-js/shell/simple-group/c.sh (100%) rename test/src/{ => exp}/agnostic/bash/one.test.sh (100%) rename test/src/{ => exp}/agnostic/bash/src/one.test (100%) rename test/src/{ => exp}/agnostic/bash/src/one.test.go (100%) rename test/src/{ => exp}/agnostic/golang/.gitkeep (100%) rename test/src/{ => exp}/agnostic/java/.gitkeep (100%) rename test/src/{ => exp}/agnostic/perl/.gitkeep (100%) rename test/src/{ => exp}/agnostic/php/.gitkeep (100%) rename test/src/{ => exp}/agnostic/python/.gitkeep (100%) rename test/src/{ => exp}/agnostic/ruby/.gitkeep (100%) rename test/src/{ => exp}/babel/ava-test/file1.js (100%) rename test/src/{ => exp}/babel/ava/ava-ex.js (100%) rename test/src/{ => exp}/babel/ava/ava-probs.js (100%) rename test/src/{ => exp}/babel/ava/f.js (100%) rename test/src/{ => exp}/babel/babel/@run.sh (100%) rename test/src/{ => exp}/babel/babel/@transform.sh (100%) rename test/src/{ => exp}/babel/babel/src/await.js (100%) rename test/src/{ => exp}/babel/babel/src/test7.js (100%) rename test/src/{ => exp}/babel/babel/src/test8.js (100%) rename test/src/{ => exp}/babel/babel/target/await.js (100%) rename test/src/{ => exp}/babel/babel/target/test7.js (100%) rename test/src/{ => exp}/babel/babel/target/test8.js (100%) rename test/src/{ => exp}/babel/test-es7/one.js (100%) rename test/src/{ => exp}/babel/test-es7/test6.js (100%) rename test/src/{ => exp}/babel/test-es7/two.js (100%) rename test/src/{ => exp}/browser/chrome/close.html (100%) rename test/src/{ => exp}/browser/index.html (100%) rename test/src/{ => exp}/browser/karma/.gitkeep (100%) rename test/src/{ => exp}/browser/mozilla.js (100%) rename test/src/{ => exp}/browser/nightmare/one.test.js (100%) rename test/src/{ => exp}/browser/one.test.js (100%) rename test/src/{ => exp}/browser/phantomjs/one.test.js (100%) rename test/src/{ => exp}/browser/phantomjs/two.test.js (100%) rename test/src/{ => exp}/browser/selenium/one.test.js (100%) rename test/src/{ => exp}/browser/web-sockets/index.html (100%) rename test/src/{ => exp}/diagnostic/test-deps.js (100%) rename test/src/{ => exp}/domains/a.js (100%) rename test/src/{ => exp}/es5-es6/a.js (100%) rename test/src/{ => exp}/es5-es6/async-registry-error/one.test.js (100%) rename test/src/{ => exp}/es5-es6/async-registry-error/two.test.js (100%) rename test/src/{ => exp}/es5-es6/b.ts (100%) rename test/src/{ => exp}/es5-es6/bail-feature/one.test.js (100%) rename test/src/{ => exp}/es5-es6/build-recursion-tests/empty.test.js (100%) rename test/src/{ => exp}/es5-es6/build-recursion-tests/recursion-check/recursion-check2/test9.js (100%) rename test/src/{ => exp}/es5-es6/build-recursion-tests/recursion-check/test8.js (100%) rename test/src/{ => exp}/es5-es6/build-recursion-tests/tes-t7-start.test.js (100%) rename test/src/{ => exp}/es5-es6/build-recursion-tests/tes-t7.js (100%) rename test/src/{ => exp}/es5-es6/build-recursion-tests/test6.test.js (100%) rename test/src/{ => exp}/es5-es6/c.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/async-registry-error/one.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/error-before-and-after-suman-init/five.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/error-before-and-after-suman-init/four.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/error-before-and-after-suman-init/six.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/error-before-and-after-suman-init/three.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/error-before-and-after-suman-init/two.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/hook-error/one.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/hook-error/two.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/multiple-test-suites/two.test.js (100%) rename test/src/{ => exp}/es5-es6/correct-exit-codes/root-suite-error/three.test.js (100%) rename test/src/{ => exp}/es5-es6/dep-injection/injected-values/cb.test.js (100%) rename test/src/{ => exp}/es5-es6/dep-injection/injected-values/one.test.js (100%) rename test/src/{ => exp}/es5-es6/dep-injection/one.test.js (100%) rename test/src/{ => exp}/es5-es6/dep-injection/with-async-lib.js (100%) rename test/src/{ => exp}/es5-es6/deps.test.js (100%) rename test/src/{ => exp}/es5-es6/gulp-usage/two.js (100%) rename test/src/{ => exp}/es5-es6/integration-tests/test0.js (100%) rename test/src/{ => exp}/es5-es6/integration-tests/test1.js (100%) rename test/src/{ => exp}/es5-es6/integration-tests/test2.js (100%) rename test/src/{ => exp}/es5-es6/integration-tests/test3.js (100%) rename test/src/{ => exp}/es5-es6/integration-tests/test4.js (100%) rename test/src/{ => exp}/es5-es6/integration-tests/test5.js (100%) rename test/src/{ => exp}/es5-es6/integration-tests/test6.js (100%) rename test/src/{ => exp}/es5-es6/j.js (100%) rename test/src/{ => exp}/es5-es6/module-load-precedence/cluster-load.js (100%) rename test/src/{ => exp}/es5-es6/multiple-test-suites/one.test.js (100%) rename test/src/{ => exp}/es5-es6/multiple-test-suites/two.test.js (100%) rename test/src/{ => exp}/es5-es6/other-tests/test3.js (100%) rename test/src/{ => exp}/es5-es6/other-tests/test4.js (100%) rename test/src/{ => exp}/es5-es6/other-tests/test5.js (100%) rename test/src/{ => exp}/es5-es6/other-tests/test6.js (100%) rename test/src/{ => exp}/es5-es6/par-vs-series/par-vs-series-1.js (100%) rename test/src/{ => exp}/es5-es6/par-vs-series/par-vs-series-2.js (100%) rename test/src/{ => exp}/es5-es6/par-vs-series/par-vs-series-3.js (100%) rename test/src/{ => exp}/es5-es6/parallel-tests/@run.sh (100%) rename test/src/{ => exp}/es5-es6/parallel-tests/@transform.sh (100%) rename test/src/{ => exp}/es5-es6/parallel-tests/src/par-test.js (100%) rename test/src/{ => exp}/es5-es6/parallel-tests/src/ptest1.js (100%) rename test/src/{ => exp}/es5-es6/parallel-tests/target/par-test.js (100%) rename test/src/{ => exp}/es5-es6/parallel-tests/target/ptest1.js (100%) rename test/src/{ => exp}/es5-es6/plan-and-confirm/one.test.js (100%) rename test/src/{ => exp}/es5-es6/plan-and-confirm/two.test.js (100%) rename test/src/{ => exp}/es5-es6/simple-tests/one-1.js (100%) rename test/src/{ => exp}/es5-es6/skip-and-only/one.test.js (100%) rename test/src/{ => exp}/es5-es6/skip-and-only/three.test.js (100%) rename test/src/{ => exp}/es5-es6/skip-and-only/two.test.js (100%) rename test/src/{ => exp}/es5-es6/stubbed-hooks-and-test-cases/one.test.js (100%) rename test/src/{ => exp}/es5-es6/stubbed-hooks-and-test-cases/two.test.js (100%) rename test/src/{ => exp}/es5-es6/suman-single-process/par-vs-series-1.js (100%) rename test/src/{ => exp}/es5-es6/suman-single-process/par-vs-series-2.js (100%) rename test/src/{ => exp}/es5-es6/suman-single-process/par-vs-series-3.js (100%) rename test/src/{ => exp}/es5-es6/test-suites-in-series/a.test.js (100%) rename test/src/{ => exp}/es5-es6/test-suites-in-series/b.test.js (100%) rename test/src/{ => exp}/es5-es6/test-tests/generatorz-babel.js (100%) rename test/src/{ => exp}/es5-es6/test-tests/generatorz.js (100%) rename test/src/{ => exp}/es5-es6/test-tests/many-commands.js (100%) rename test/src/{ => exp}/es5-es6/test-tests/one.js (100%) rename test/src/{ => exp}/es5-es6/test-tests/two.js (100%) rename test/src/{ => exp}/es5-es6/use-async-lib/one.test.js (100%) rename test/src/{ => exp}/es5-es6/use-async-lib/two.test.js (100%) rename test/src/{ => exp}/fly-user/Dockerfile (100%) rename test/src/{ => exp}/fly-user/open-subl.js (100%) rename test/src/{ => exp}/fly-user/script.sh (100%) rename test/src/{ => exp}/fly-user/use-docker2.sh (100%) rename test/src/{ => exp}/fly/Dockerfile (100%) rename test/src/{ => exp}/fly/script.sh (100%) rename test/src/{ => exp}/injections-suites/one.test.js (100%) rename test/src/{ => exp}/installation/Dockerfile (100%) rename test/src/{ => exp}/installation/package.json (100%) rename test/src/{ => exp}/installation/run-docker-test.sh (100%) rename test/src/{ => exp}/installation/test-install-post-publish2.sh (100%) rename test/src/{ => exp}/installation/test-install-pre-publish.sh (100%) rename test/src/{ => exp}/installation/test-new-install.js (100%) rename test/src/{ => exp}/installation/test-new-install.sh (100%) rename test/src/{ => exp}/installation/test-suman.sh (100%) rename test/src/{ => exp}/interactive/interactive.js (100%) rename test/src/{ => exp}/mocha/@run.sh (100%) rename test/src/{ => exp}/mocha/mocha1.js (100%) rename test/src/{ => exp}/mocha/mocha2.js (100%) rename test/src/{ => exp}/mocha/one.mocha.test.js (100%) rename test/src/{ => exp}/npmlinkup/one.test.js (100%) rename test/src/{ => exp}/observables/first.test.js (100%) rename test/src/{ => exp}/once-pre/one.test.js (100%) rename test/src/{ => exp}/programmatic/macros/call.js (100%) rename test/src/{ => exp}/programmatic/macros/one.test.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/output6.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/output7.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/output8.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/output9.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/test6.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/test7.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/test8.js (100%) rename test/src/{ => exp}/programmatic/strm-sync-tests/test9.js (100%) rename test/src/{ => exp}/promises-patch/one.test.js (100%) rename test/src/{ => exp}/promises-patch/two.test.js (100%) rename test/src/{ => exp}/sqlite3/one.test.js (100%) rename test/src/{ => exp}/sqlite3/two.test.js (100%) rename test/src/{ => exp}/sqlite3/waterfall.test.js (100%) rename test/src/{ => exp}/streams/first.test.js (100%) rename test/src/{ => exp}/tap-output/@config.json (100%) rename test/src/{ => exp}/tap-output/@src/tap-producer1.ts (100%) rename test/src/{ => exp}/tap-output/@src/tap-producer2.ts (100%) rename test/src/{ => exp}/tap-output/@target/tap-producer1.js (100%) rename test/src/{ => exp}/tap-output/@target/tap-producer2.js (100%) rename test/src/{ => exp}/tap-output/tsconfig.json (100%) rename test/src/{ => exp}/tap-parsing/one.test.js (100%) rename test/src/{ => exp}/typescript/@run.sh (100%) rename test/src/{ => exp}/typescript/@src/a.test.ts (100%) rename test/src/{ => exp}/typescript/@src/a2.test.ts (100%) rename test/src/{ => exp}/typescript/@src/b.test.ts (100%) rename test/src/{ => exp}/typescript/@src/b2.test.ts (100%) rename test/src/{ => exp}/typescript/@target/a.test.js (100%) rename test/src/{ => exp}/typescript/@target/a2.test.js (100%) rename test/src/{ => exp}/typescript/@target/b.test.js (100%) rename test/src/{ => exp}/typescript/@target/b2.test.js (100%) rename test/src/{ => exp}/typescript/@transform.sh (100%) rename test/src/{ => exp}/typescript/tsconfig.json (100%) rename test/src/{ => exp}/unit/one-test.js (100%) diff --git a/exp.js b/exp.js index 2bf9552c..7bcdf617 100644 --- a/exp.js +++ b/exp.js @@ -1,11 +1,53 @@ +// +// let sym = Symbol('foo'); +// let sym2 = Symbol('foo'); +// let obj = {}; +// obj[sym] = 5; +// console.log(obj[sym]); +// console.log(obj[sym2]); +// -let sym = Symbol('foo'); -let sym2 = Symbol('foo'); -let obj = {}; -obj[sym] = 5; -console.log(obj[sym]); -console.log(obj[sym2]); +console.log('the beginning'); +const chai = require('chai'); +const chaiAssert = chai.assert; +const assrt = function() { + try { + return chaiAssert.apply(chaiAssert, arguments); + } catch (e) { + return console.error(e); + } +}; + +const v = {}; +v.assert = new Proxy(assrt, { + get: function(target, prop) { + + if (typeof prop === 'symbol') { + return Reflect.get(...arguments); + } + + + return function() { + try { + return chaiAssert[prop].apply(chaiAssert, arguments); + } catch (e) { + console.error(`Looks like property '${prop}' does not exist on chai assert object.`) + return console.error(e); + } + } + } +}); + +console.log('v => ',v); // in Node.js, this kind of call will cause the issue whereby ghost properties are sent +// to the get method of the Proxy. + +JSON.stringify(v); + +// but we can see that Proxy works here: +v.assert.equal(true,true,'whoops nope'); + +console.log('the end'); diff --git a/lib/index.js b/lib/index.js index 73a1c068..a60e15f5 100755 --- a/lib/index.js +++ b/lib/index.js @@ -111,9 +111,7 @@ suiteResultEmitter.on('suman-test-registered', function (fn) { suiteResultEmitter.on('suman-completed', function () { process.nextTick(function () { var fn = testSuiteQueueCallbacks.pop(); - if (fn) { - fn.call(null); - } + fn && fn.call(null); }); }); exports.init = function ($module, $opts, confOverride) { diff --git a/lib/index.ts b/lib/index.ts index 80ef4580..c232fe91 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -156,7 +156,7 @@ const testSuiteRegistrationQueue = async.queue(function (task: Function, cb: Fun testSuiteRegistrationQueue.drain = function () { _suman.log(`Pushing ${testRuns.length} test suites onto queue with concurrency ${c}.\n`); - while(testRuns.length > 0){ //explicit for your pleasure + while (testRuns.length > 0) { //explicit for your pleasure testSuiteQueue.push(testRuns.shift()); } }; @@ -165,7 +165,6 @@ testSuiteQueue.drain = function () { suiteResultEmitter.emit('suman-test-file-complete'); }; - suiteResultEmitter.on('suman-test-registered', function (fn: Function) { testRuns.push(fn); process.nextTick(function () { @@ -176,17 +175,9 @@ suiteResultEmitter.on('suman-test-registered', function (fn: Function) { suiteResultEmitter.on('suman-completed', function () { // we set this to null because no suman should be in progress - process.nextTick(function () { let fn = testSuiteQueueCallbacks.pop(); - if (fn) { - fn.call(null); - } - // else if (sumanOpts.parallel_max) { - // debugger; - // suiteResultEmitter.emit('suman-test-file-complete'); - // } - + fn && fn.call(null); }); }); @@ -410,7 +401,6 @@ export const init: IInit = function ($module, $opts, confOverride): IStartCreate const create = init.$ingletonian.create = start; _interface === 'TDD' ? init.$ingletonian.suite = create : init.$ingletonian.describe = create; - loaded = true; return init.$ingletonian; diff --git a/lib/test-suite-helpers/t-proto-hook.js b/lib/test-suite-helpers/t-proto-hook.js index 611620e1..f1559eee 100644 --- a/lib/test-suite-helpers/t-proto-hook.js +++ b/lib/test-suite-helpers/t-proto-hook.js @@ -27,11 +27,13 @@ exports.makeHookObj = function (hook, assertCount, handleError) { if (typeof prop === 'symbol') { return Reflect.get.apply(Reflect, arguments); } - if (badProps[String(prop)]) { - return Reflect.get.apply(Reflect, arguments); - } if (!(prop in chaiAssert)) { - return handleError(new Error("The assertion library used does not have a '" + prop + "' property or method.")); + try { + return Reflect.get.apply(Reflect, arguments); + } + catch (err) { + return handleError(new Error("The assertion library used does not have a '" + prop + "' property or method.")); + } } return function () { try { diff --git a/lib/test-suite-helpers/t-proto-hook.ts b/lib/test-suite-helpers/t-proto-hook.ts index c4c7dabd..7e80b90c 100644 --- a/lib/test-suite-helpers/t-proto-hook.ts +++ b/lib/test-suite-helpers/t-proto-hook.ts @@ -52,15 +52,20 @@ export const makeHookObj = function (hook: IHookObj, assertCount: IAssertObj, ha return Reflect.get(...arguments); } - if (badProps[String(prop)]) { - return Reflect.get(...arguments); - } + // if (badProps[String(prop)]) { + // return Reflect.get(...arguments); + // } if (!(prop in chaiAssert)) { - return handleError( - // new Error(`The assertion library used does not have property or method.`) - new Error(`The assertion library used does not have a '${prop}' property or method.`) - ); + + try { + return Reflect.get(...arguments); + } + catch(err){ + return handleError( + new Error(`The assertion library used does not have a '${prop}' property or method.`) + ); + } } return function () { diff --git a/lib/test-suite-helpers/t-proto-test.js b/lib/test-suite-helpers/t-proto-test.js index b6280ca2..a53fb227 100755 --- a/lib/test-suite-helpers/t-proto-test.js +++ b/lib/test-suite-helpers/t-proto-test.js @@ -31,11 +31,13 @@ exports.makeTestCase = function (test, assertCount, handleError) { if (typeof prop === 'symbol') { return Reflect.get.apply(Reflect, arguments); } - if (badProps[String(prop)]) { - return Reflect.get.apply(Reflect, arguments); - } if (!(prop in chaiAssert)) { - return handleError(new Error("The assertion library used does not have a '" + prop + "' property or method.")); + try { + return Reflect.get.apply(Reflect, arguments); + } + catch (err) { + return handleError(new Error("The assertion library used does not have a '" + prop + "' property or method.")); + } } return function () { try { diff --git a/lib/test-suite-helpers/t-proto-test.ts b/lib/test-suite-helpers/t-proto-test.ts index 0c5fd08b..cde7eb5a 100755 --- a/lib/test-suite-helpers/t-proto-test.ts +++ b/lib/test-suite-helpers/t-proto-test.ts @@ -67,15 +67,19 @@ export const makeTestCase = return Reflect.get(...arguments); } - if (badProps[String(prop)]) { - return Reflect.get(...arguments); - } + // if (badProps[String(prop)]) { + // return Reflect.get(...arguments); + // } if (!(prop in chaiAssert)) { - return handleError( - // new Error(`The assertion library used does not have property or method.`) - new Error(`The assertion library used does not have a '${prop}' property or method.`) - ); + try { + return Reflect.get(...arguments); + } + catch (err) { + return handleError( + new Error(`The assertion library used does not have a '${prop}' property or method.`) + ); + } } return function () { diff --git a/test/_suman/gantt-4.html b/test/_suman/gantt-4.html index de7d7107..ee2a234f 100644 --- a/test/_suman/gantt-4.html +++ b/test/_suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506331427567,"endDate":1506331428241,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/exp.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506813880270,"endDate":1506813881770,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/exp.js","status":"SUCCEEDED"}]'); let tasks = []; diff --git a/test/src/agnostic-not-js/golang/@run.sh b/test/src/exp/agnostic-not-js/golang/@run.sh similarity index 100% rename from test/src/agnostic-not-js/golang/@run.sh rename to test/src/exp/agnostic-not-js/golang/@run.sh diff --git a/test/src/agnostic-not-js/golang/@transform.sh b/test/src/exp/agnostic-not-js/golang/@transform.sh similarity index 100% rename from test/src/agnostic-not-js/golang/@transform.sh rename to test/src/exp/agnostic-not-js/golang/@transform.sh diff --git a/test/src/agnostic-not-js/golang/src/rue.go b/test/src/exp/agnostic-not-js/golang/src/rue.go similarity index 100% rename from test/src/agnostic-not-js/golang/src/rue.go rename to test/src/exp/agnostic-not-js/golang/src/rue.go diff --git a/test/src/agnostic-not-js/golang/src/vue.go b/test/src/exp/agnostic-not-js/golang/src/vue.go similarity index 100% rename from test/src/agnostic-not-js/golang/src/vue.go rename to test/src/exp/agnostic-not-js/golang/src/vue.go diff --git a/test/src/agnostic-not-js/golang/target/go.suman b/test/src/exp/agnostic-not-js/golang/target/go.suman similarity index 100% rename from test/src/agnostic-not-js/golang/target/go.suman rename to test/src/exp/agnostic-not-js/golang/target/go.suman diff --git a/test/src/agnostic-not-js/java/@run.sh b/test/src/exp/agnostic-not-js/java/@run.sh similarity index 100% rename from test/src/agnostic-not-js/java/@run.sh rename to test/src/exp/agnostic-not-js/java/@run.sh diff --git a/test/src/agnostic-not-js/java/@transform.sh b/test/src/exp/agnostic-not-js/java/@transform.sh similarity index 100% rename from test/src/agnostic-not-js/java/@transform.sh rename to test/src/exp/agnostic-not-js/java/@transform.sh diff --git a/test/src/agnostic-not-js/java/README.md b/test/src/exp/agnostic-not-js/java/README.md similarity index 100% rename from test/src/agnostic-not-js/java/README.md rename to test/src/exp/agnostic-not-js/java/README.md diff --git a/test/src/agnostic-not-js/java/dependency-reduced-pom.xml b/test/src/exp/agnostic-not-js/java/dependency-reduced-pom.xml similarity index 100% rename from test/src/agnostic-not-js/java/dependency-reduced-pom.xml rename to test/src/exp/agnostic-not-js/java/dependency-reduced-pom.xml diff --git a/test/src/agnostic-not-js/java/pom-original.xml b/test/src/exp/agnostic-not-js/java/pom-original.xml similarity index 100% rename from test/src/agnostic-not-js/java/pom-original.xml rename to test/src/exp/agnostic-not-js/java/pom-original.xml diff --git a/test/src/agnostic-not-js/java/pom.xml b/test/src/exp/agnostic-not-js/java/pom.xml similarity index 100% rename from test/src/agnostic-not-js/java/pom.xml rename to test/src/exp/agnostic-not-js/java/pom.xml diff --git a/test/src/agnostic-not-js/java/src/hello/Greeter.java b/test/src/exp/agnostic-not-js/java/src/hello/Greeter.java similarity index 100% rename from test/src/agnostic-not-js/java/src/hello/Greeter.java rename to test/src/exp/agnostic-not-js/java/src/hello/Greeter.java diff --git a/test/src/agnostic-not-js/java/src/hello/HelloWorld.java b/test/src/exp/agnostic-not-js/java/src/hello/HelloWorld.java similarity index 100% rename from test/src/agnostic-not-js/java/src/hello/HelloWorld.java rename to test/src/exp/agnostic-not-js/java/src/hello/HelloWorld.java diff --git a/test/src/agnostic-not-js/java/src/xxx/MyClass.java b/test/src/exp/agnostic-not-js/java/src/xxx/MyClass.java similarity index 100% rename from test/src/agnostic-not-js/java/src/xxx/MyClass.java rename to test/src/exp/agnostic-not-js/java/src/xxx/MyClass.java diff --git a/test/src/agnostic-not-js/java/src/xxx/MyClassTest.java b/test/src/exp/agnostic-not-js/java/src/xxx/MyClassTest.java similarity index 100% rename from test/src/agnostic-not-js/java/src/xxx/MyClassTest.java rename to test/src/exp/agnostic-not-js/java/src/xxx/MyClassTest.java diff --git a/test/src/agnostic-not-js/java/src/xxx/MyTestRunner.java b/test/src/exp/agnostic-not-js/java/src/xxx/MyTestRunner.java similarity index 100% rename from test/src/agnostic-not-js/java/src/xxx/MyTestRunner.java rename to test/src/exp/agnostic-not-js/java/src/xxx/MyTestRunner.java diff --git a/test/src/agnostic-not-js/java/target/classes/hello/Greeter.class b/test/src/exp/agnostic-not-js/java/target/classes/hello/Greeter.class similarity index 100% rename from test/src/agnostic-not-js/java/target/classes/hello/Greeter.class rename to test/src/exp/agnostic-not-js/java/target/classes/hello/Greeter.class diff --git a/test/src/agnostic-not-js/java/target/classes/hello/HelloWorld.class b/test/src/exp/agnostic-not-js/java/target/classes/hello/HelloWorld.class similarity index 100% rename from test/src/agnostic-not-js/java/target/classes/hello/HelloWorld.class rename to test/src/exp/agnostic-not-js/java/target/classes/hello/HelloWorld.class diff --git a/test/src/agnostic-not-js/java/target/maven-archiver/pom.properties b/test/src/exp/agnostic-not-js/java/target/maven-archiver/pom.properties similarity index 100% rename from test/src/agnostic-not-js/java/target/maven-archiver/pom.properties rename to test/src/exp/agnostic-not-js/java/target/maven-archiver/pom.properties diff --git a/test/src/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/test/src/exp/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst similarity index 100% rename from test/src/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst rename to test/src/exp/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst diff --git a/test/src/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/test/src/exp/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst similarity index 100% rename from test/src/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst rename to test/src/exp/agnostic-not-js/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/test/src/agnostic-not-js/java/target/original-suman-2.jar b/test/src/exp/agnostic-not-js/java/target/original-suman-2.jar similarity index 100% rename from test/src/agnostic-not-js/java/target/original-suman-2.jar rename to test/src/exp/agnostic-not-js/java/target/original-suman-2.jar diff --git a/test/src/agnostic-not-js/java/target/original-suman.jar b/test/src/exp/agnostic-not-js/java/target/original-suman.jar similarity index 100% rename from test/src/agnostic-not-js/java/target/original-suman.jar rename to test/src/exp/agnostic-not-js/java/target/original-suman.jar diff --git a/test/src/agnostic-not-js/java/target/suman-2.jar b/test/src/exp/agnostic-not-js/java/target/suman-2.jar similarity index 100% rename from test/src/agnostic-not-js/java/target/suman-2.jar rename to test/src/exp/agnostic-not-js/java/target/suman-2.jar diff --git a/test/src/agnostic-not-js/java/target/suman.jar b/test/src/exp/agnostic-not-js/java/target/suman.jar similarity index 100% rename from test/src/agnostic-not-js/java/target/suman.jar rename to test/src/exp/agnostic-not-js/java/target/suman.jar diff --git a/test/src/agnostic-not-js/perl/@run.sh b/test/src/exp/agnostic-not-js/perl/@run.sh similarity index 100% rename from test/src/agnostic-not-js/perl/@run.sh rename to test/src/exp/agnostic-not-js/perl/@run.sh diff --git a/test/src/agnostic-not-js/perl/@transform.sh b/test/src/exp/agnostic-not-js/perl/@transform.sh similarity index 100% rename from test/src/agnostic-not-js/perl/@transform.sh rename to test/src/exp/agnostic-not-js/perl/@transform.sh diff --git a/test/src/agnostic-not-js/perl/one.pl b/test/src/exp/agnostic-not-js/perl/one.pl similarity index 100% rename from test/src/agnostic-not-js/perl/one.pl rename to test/src/exp/agnostic-not-js/perl/one.pl diff --git a/test/src/agnostic-not-js/python/@run.sh b/test/src/exp/agnostic-not-js/python/@run.sh similarity index 100% rename from test/src/agnostic-not-js/python/@run.sh rename to test/src/exp/agnostic-not-js/python/@run.sh diff --git a/test/src/agnostic-not-js/python/@transform.sh b/test/src/exp/agnostic-not-js/python/@transform.sh similarity index 100% rename from test/src/agnostic-not-js/python/@transform.sh rename to test/src/exp/agnostic-not-js/python/@transform.sh diff --git a/test/src/agnostic-not-js/python/src/one.py b/test/src/exp/agnostic-not-js/python/src/one.py similarity index 100% rename from test/src/agnostic-not-js/python/src/one.py rename to test/src/exp/agnostic-not-js/python/src/one.py diff --git a/test/src/agnostic-not-js/python/target/one.py b/test/src/exp/agnostic-not-js/python/target/one.py similarity index 100% rename from test/src/agnostic-not-js/python/target/one.py rename to test/src/exp/agnostic-not-js/python/target/one.py diff --git a/test/src/agnostic-not-js/ruby/one.test.rb b/test/src/exp/agnostic-not-js/ruby/one.test.rb similarity index 100% rename from test/src/agnostic-not-js/ruby/one.test.rb rename to test/src/exp/agnostic-not-js/ruby/one.test.rb diff --git a/test/src/agnostic-not-js/shell/node-c.sh b/test/src/exp/agnostic-not-js/shell/node-c.sh similarity index 100% rename from test/src/agnostic-not-js/shell/node-c.sh rename to test/src/exp/agnostic-not-js/shell/node-c.sh diff --git a/test/src/agnostic-not-js/shell/parallel-advanced.sh b/test/src/exp/agnostic-not-js/shell/parallel-advanced.sh similarity index 100% rename from test/src/agnostic-not-js/shell/parallel-advanced.sh rename to test/src/exp/agnostic-not-js/shell/parallel-advanced.sh diff --git a/test/src/agnostic-not-js/shell/parallel-trifecta.sh b/test/src/exp/agnostic-not-js/shell/parallel-trifecta.sh similarity index 100% rename from test/src/agnostic-not-js/shell/parallel-trifecta.sh rename to test/src/exp/agnostic-not-js/shell/parallel-trifecta.sh diff --git a/test/src/agnostic-not-js/shell/parallel.sh b/test/src/exp/agnostic-not-js/shell/parallel.sh similarity index 100% rename from test/src/agnostic-not-js/shell/parallel.sh rename to test/src/exp/agnostic-not-js/shell/parallel.sh diff --git a/test/src/agnostic-not-js/shell/postinstall.sh b/test/src/exp/agnostic-not-js/shell/postinstall.sh similarity index 100% rename from test/src/agnostic-not-js/shell/postinstall.sh rename to test/src/exp/agnostic-not-js/shell/postinstall.sh diff --git a/test/src/agnostic-not-js/shell/simple-group/a.sh b/test/src/exp/agnostic-not-js/shell/simple-group/a.sh similarity index 100% rename from test/src/agnostic-not-js/shell/simple-group/a.sh rename to test/src/exp/agnostic-not-js/shell/simple-group/a.sh diff --git a/test/src/agnostic-not-js/shell/simple-group/b.sh b/test/src/exp/agnostic-not-js/shell/simple-group/b.sh similarity index 100% rename from test/src/agnostic-not-js/shell/simple-group/b.sh rename to test/src/exp/agnostic-not-js/shell/simple-group/b.sh diff --git a/test/src/agnostic-not-js/shell/simple-group/c.sh b/test/src/exp/agnostic-not-js/shell/simple-group/c.sh similarity index 100% rename from test/src/agnostic-not-js/shell/simple-group/c.sh rename to test/src/exp/agnostic-not-js/shell/simple-group/c.sh diff --git a/test/src/agnostic/bash/one.test.sh b/test/src/exp/agnostic/bash/one.test.sh similarity index 100% rename from test/src/agnostic/bash/one.test.sh rename to test/src/exp/agnostic/bash/one.test.sh diff --git a/test/src/agnostic/bash/src/one.test b/test/src/exp/agnostic/bash/src/one.test similarity index 100% rename from test/src/agnostic/bash/src/one.test rename to test/src/exp/agnostic/bash/src/one.test diff --git a/test/src/agnostic/bash/src/one.test.go b/test/src/exp/agnostic/bash/src/one.test.go similarity index 100% rename from test/src/agnostic/bash/src/one.test.go rename to test/src/exp/agnostic/bash/src/one.test.go diff --git a/test/src/agnostic/golang/.gitkeep b/test/src/exp/agnostic/golang/.gitkeep similarity index 100% rename from test/src/agnostic/golang/.gitkeep rename to test/src/exp/agnostic/golang/.gitkeep diff --git a/test/src/agnostic/java/.gitkeep b/test/src/exp/agnostic/java/.gitkeep similarity index 100% rename from test/src/agnostic/java/.gitkeep rename to test/src/exp/agnostic/java/.gitkeep diff --git a/test/src/agnostic/perl/.gitkeep b/test/src/exp/agnostic/perl/.gitkeep similarity index 100% rename from test/src/agnostic/perl/.gitkeep rename to test/src/exp/agnostic/perl/.gitkeep diff --git a/test/src/agnostic/php/.gitkeep b/test/src/exp/agnostic/php/.gitkeep similarity index 100% rename from test/src/agnostic/php/.gitkeep rename to test/src/exp/agnostic/php/.gitkeep diff --git a/test/src/agnostic/python/.gitkeep b/test/src/exp/agnostic/python/.gitkeep similarity index 100% rename from test/src/agnostic/python/.gitkeep rename to test/src/exp/agnostic/python/.gitkeep diff --git a/test/src/agnostic/ruby/.gitkeep b/test/src/exp/agnostic/ruby/.gitkeep similarity index 100% rename from test/src/agnostic/ruby/.gitkeep rename to test/src/exp/agnostic/ruby/.gitkeep diff --git a/test/src/babel/ava-test/file1.js b/test/src/exp/babel/ava-test/file1.js similarity index 100% rename from test/src/babel/ava-test/file1.js rename to test/src/exp/babel/ava-test/file1.js diff --git a/test/src/babel/ava/ava-ex.js b/test/src/exp/babel/ava/ava-ex.js similarity index 100% rename from test/src/babel/ava/ava-ex.js rename to test/src/exp/babel/ava/ava-ex.js diff --git a/test/src/babel/ava/ava-probs.js b/test/src/exp/babel/ava/ava-probs.js similarity index 100% rename from test/src/babel/ava/ava-probs.js rename to test/src/exp/babel/ava/ava-probs.js diff --git a/test/src/babel/ava/f.js b/test/src/exp/babel/ava/f.js similarity index 100% rename from test/src/babel/ava/f.js rename to test/src/exp/babel/ava/f.js diff --git a/test/src/babel/babel/@run.sh b/test/src/exp/babel/babel/@run.sh similarity index 100% rename from test/src/babel/babel/@run.sh rename to test/src/exp/babel/babel/@run.sh diff --git a/test/src/babel/babel/@transform.sh b/test/src/exp/babel/babel/@transform.sh similarity index 100% rename from test/src/babel/babel/@transform.sh rename to test/src/exp/babel/babel/@transform.sh diff --git a/test/src/babel/babel/src/await.js b/test/src/exp/babel/babel/src/await.js similarity index 100% rename from test/src/babel/babel/src/await.js rename to test/src/exp/babel/babel/src/await.js diff --git a/test/src/babel/babel/src/test7.js b/test/src/exp/babel/babel/src/test7.js similarity index 100% rename from test/src/babel/babel/src/test7.js rename to test/src/exp/babel/babel/src/test7.js diff --git a/test/src/babel/babel/src/test8.js b/test/src/exp/babel/babel/src/test8.js similarity index 100% rename from test/src/babel/babel/src/test8.js rename to test/src/exp/babel/babel/src/test8.js diff --git a/test/src/babel/babel/target/await.js b/test/src/exp/babel/babel/target/await.js similarity index 100% rename from test/src/babel/babel/target/await.js rename to test/src/exp/babel/babel/target/await.js diff --git a/test/src/babel/babel/target/test7.js b/test/src/exp/babel/babel/target/test7.js similarity index 100% rename from test/src/babel/babel/target/test7.js rename to test/src/exp/babel/babel/target/test7.js diff --git a/test/src/babel/babel/target/test8.js b/test/src/exp/babel/babel/target/test8.js similarity index 100% rename from test/src/babel/babel/target/test8.js rename to test/src/exp/babel/babel/target/test8.js diff --git a/test/src/babel/test-es7/one.js b/test/src/exp/babel/test-es7/one.js similarity index 100% rename from test/src/babel/test-es7/one.js rename to test/src/exp/babel/test-es7/one.js diff --git a/test/src/babel/test-es7/test6.js b/test/src/exp/babel/test-es7/test6.js similarity index 100% rename from test/src/babel/test-es7/test6.js rename to test/src/exp/babel/test-es7/test6.js diff --git a/test/src/babel/test-es7/two.js b/test/src/exp/babel/test-es7/two.js similarity index 100% rename from test/src/babel/test-es7/two.js rename to test/src/exp/babel/test-es7/two.js diff --git a/test/src/browser/chrome/close.html b/test/src/exp/browser/chrome/close.html similarity index 100% rename from test/src/browser/chrome/close.html rename to test/src/exp/browser/chrome/close.html diff --git a/test/src/browser/index.html b/test/src/exp/browser/index.html similarity index 100% rename from test/src/browser/index.html rename to test/src/exp/browser/index.html diff --git a/test/src/browser/karma/.gitkeep b/test/src/exp/browser/karma/.gitkeep similarity index 100% rename from test/src/browser/karma/.gitkeep rename to test/src/exp/browser/karma/.gitkeep diff --git a/test/src/browser/mozilla.js b/test/src/exp/browser/mozilla.js similarity index 100% rename from test/src/browser/mozilla.js rename to test/src/exp/browser/mozilla.js diff --git a/test/src/browser/nightmare/one.test.js b/test/src/exp/browser/nightmare/one.test.js similarity index 100% rename from test/src/browser/nightmare/one.test.js rename to test/src/exp/browser/nightmare/one.test.js diff --git a/test/src/browser/one.test.js b/test/src/exp/browser/one.test.js similarity index 100% rename from test/src/browser/one.test.js rename to test/src/exp/browser/one.test.js diff --git a/test/src/browser/phantomjs/one.test.js b/test/src/exp/browser/phantomjs/one.test.js similarity index 100% rename from test/src/browser/phantomjs/one.test.js rename to test/src/exp/browser/phantomjs/one.test.js diff --git a/test/src/browser/phantomjs/two.test.js b/test/src/exp/browser/phantomjs/two.test.js similarity index 100% rename from test/src/browser/phantomjs/two.test.js rename to test/src/exp/browser/phantomjs/two.test.js diff --git a/test/src/browser/selenium/one.test.js b/test/src/exp/browser/selenium/one.test.js similarity index 100% rename from test/src/browser/selenium/one.test.js rename to test/src/exp/browser/selenium/one.test.js diff --git a/test/src/browser/web-sockets/index.html b/test/src/exp/browser/web-sockets/index.html similarity index 100% rename from test/src/browser/web-sockets/index.html rename to test/src/exp/browser/web-sockets/index.html diff --git a/test/src/diagnostic/test-deps.js b/test/src/exp/diagnostic/test-deps.js similarity index 100% rename from test/src/diagnostic/test-deps.js rename to test/src/exp/diagnostic/test-deps.js diff --git a/test/src/domains/a.js b/test/src/exp/domains/a.js similarity index 100% rename from test/src/domains/a.js rename to test/src/exp/domains/a.js diff --git a/test/src/es5-es6/a.js b/test/src/exp/es5-es6/a.js similarity index 100% rename from test/src/es5-es6/a.js rename to test/src/exp/es5-es6/a.js diff --git a/test/src/es5-es6/async-registry-error/one.test.js b/test/src/exp/es5-es6/async-registry-error/one.test.js similarity index 100% rename from test/src/es5-es6/async-registry-error/one.test.js rename to test/src/exp/es5-es6/async-registry-error/one.test.js diff --git a/test/src/es5-es6/async-registry-error/two.test.js b/test/src/exp/es5-es6/async-registry-error/two.test.js similarity index 100% rename from test/src/es5-es6/async-registry-error/two.test.js rename to test/src/exp/es5-es6/async-registry-error/two.test.js diff --git a/test/src/es5-es6/b.ts b/test/src/exp/es5-es6/b.ts similarity index 100% rename from test/src/es5-es6/b.ts rename to test/src/exp/es5-es6/b.ts diff --git a/test/src/es5-es6/bail-feature/one.test.js b/test/src/exp/es5-es6/bail-feature/one.test.js similarity index 100% rename from test/src/es5-es6/bail-feature/one.test.js rename to test/src/exp/es5-es6/bail-feature/one.test.js diff --git a/test/src/es5-es6/build-recursion-tests/empty.test.js b/test/src/exp/es5-es6/build-recursion-tests/empty.test.js similarity index 100% rename from test/src/es5-es6/build-recursion-tests/empty.test.js rename to test/src/exp/es5-es6/build-recursion-tests/empty.test.js diff --git a/test/src/es5-es6/build-recursion-tests/recursion-check/recursion-check2/test9.js b/test/src/exp/es5-es6/build-recursion-tests/recursion-check/recursion-check2/test9.js similarity index 100% rename from test/src/es5-es6/build-recursion-tests/recursion-check/recursion-check2/test9.js rename to test/src/exp/es5-es6/build-recursion-tests/recursion-check/recursion-check2/test9.js diff --git a/test/src/es5-es6/build-recursion-tests/recursion-check/test8.js b/test/src/exp/es5-es6/build-recursion-tests/recursion-check/test8.js similarity index 100% rename from test/src/es5-es6/build-recursion-tests/recursion-check/test8.js rename to test/src/exp/es5-es6/build-recursion-tests/recursion-check/test8.js diff --git a/test/src/es5-es6/build-recursion-tests/tes-t7-start.test.js b/test/src/exp/es5-es6/build-recursion-tests/tes-t7-start.test.js similarity index 100% rename from test/src/es5-es6/build-recursion-tests/tes-t7-start.test.js rename to test/src/exp/es5-es6/build-recursion-tests/tes-t7-start.test.js diff --git a/test/src/es5-es6/build-recursion-tests/tes-t7.js b/test/src/exp/es5-es6/build-recursion-tests/tes-t7.js similarity index 100% rename from test/src/es5-es6/build-recursion-tests/tes-t7.js rename to test/src/exp/es5-es6/build-recursion-tests/tes-t7.js diff --git a/test/src/es5-es6/build-recursion-tests/test6.test.js b/test/src/exp/es5-es6/build-recursion-tests/test6.test.js similarity index 100% rename from test/src/es5-es6/build-recursion-tests/test6.test.js rename to test/src/exp/es5-es6/build-recursion-tests/test6.test.js diff --git a/test/src/es5-es6/c.js b/test/src/exp/es5-es6/c.js similarity index 100% rename from test/src/es5-es6/c.js rename to test/src/exp/es5-es6/c.js diff --git a/test/src/es5-es6/correct-exit-codes/async-registry-error/one.test.js b/test/src/exp/es5-es6/correct-exit-codes/async-registry-error/one.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/async-registry-error/one.test.js rename to test/src/exp/es5-es6/correct-exit-codes/async-registry-error/one.test.js diff --git a/test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/five.test.js b/test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/five.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/five.test.js rename to test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/five.test.js diff --git a/test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/four.test.js b/test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/four.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/four.test.js rename to test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/four.test.js diff --git a/test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/six.test.js b/test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/six.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/six.test.js rename to test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/six.test.js diff --git a/test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/three.test.js b/test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/three.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/three.test.js rename to test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/three.test.js diff --git a/test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/two.test.js b/test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/two.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/error-before-and-after-suman-init/two.test.js rename to test/src/exp/es5-es6/correct-exit-codes/error-before-and-after-suman-init/two.test.js diff --git a/test/src/es5-es6/correct-exit-codes/hook-error/one.test.js b/test/src/exp/es5-es6/correct-exit-codes/hook-error/one.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/hook-error/one.test.js rename to test/src/exp/es5-es6/correct-exit-codes/hook-error/one.test.js diff --git a/test/src/es5-es6/correct-exit-codes/hook-error/two.test.js b/test/src/exp/es5-es6/correct-exit-codes/hook-error/two.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/hook-error/two.test.js rename to test/src/exp/es5-es6/correct-exit-codes/hook-error/two.test.js diff --git a/test/src/es5-es6/correct-exit-codes/multiple-test-suites/two.test.js b/test/src/exp/es5-es6/correct-exit-codes/multiple-test-suites/two.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/multiple-test-suites/two.test.js rename to test/src/exp/es5-es6/correct-exit-codes/multiple-test-suites/two.test.js diff --git a/test/src/es5-es6/correct-exit-codes/root-suite-error/three.test.js b/test/src/exp/es5-es6/correct-exit-codes/root-suite-error/three.test.js similarity index 100% rename from test/src/es5-es6/correct-exit-codes/root-suite-error/three.test.js rename to test/src/exp/es5-es6/correct-exit-codes/root-suite-error/three.test.js diff --git a/test/src/es5-es6/dep-injection/injected-values/cb.test.js b/test/src/exp/es5-es6/dep-injection/injected-values/cb.test.js similarity index 100% rename from test/src/es5-es6/dep-injection/injected-values/cb.test.js rename to test/src/exp/es5-es6/dep-injection/injected-values/cb.test.js diff --git a/test/src/es5-es6/dep-injection/injected-values/one.test.js b/test/src/exp/es5-es6/dep-injection/injected-values/one.test.js similarity index 100% rename from test/src/es5-es6/dep-injection/injected-values/one.test.js rename to test/src/exp/es5-es6/dep-injection/injected-values/one.test.js diff --git a/test/src/es5-es6/dep-injection/one.test.js b/test/src/exp/es5-es6/dep-injection/one.test.js similarity index 100% rename from test/src/es5-es6/dep-injection/one.test.js rename to test/src/exp/es5-es6/dep-injection/one.test.js diff --git a/test/src/es5-es6/dep-injection/with-async-lib.js b/test/src/exp/es5-es6/dep-injection/with-async-lib.js similarity index 100% rename from test/src/es5-es6/dep-injection/with-async-lib.js rename to test/src/exp/es5-es6/dep-injection/with-async-lib.js diff --git a/test/src/es5-es6/deps.test.js b/test/src/exp/es5-es6/deps.test.js similarity index 100% rename from test/src/es5-es6/deps.test.js rename to test/src/exp/es5-es6/deps.test.js diff --git a/test/src/es5-es6/gulp-usage/two.js b/test/src/exp/es5-es6/gulp-usage/two.js similarity index 100% rename from test/src/es5-es6/gulp-usage/two.js rename to test/src/exp/es5-es6/gulp-usage/two.js diff --git a/test/src/es5-es6/integration-tests/test0.js b/test/src/exp/es5-es6/integration-tests/test0.js similarity index 100% rename from test/src/es5-es6/integration-tests/test0.js rename to test/src/exp/es5-es6/integration-tests/test0.js diff --git a/test/src/es5-es6/integration-tests/test1.js b/test/src/exp/es5-es6/integration-tests/test1.js similarity index 100% rename from test/src/es5-es6/integration-tests/test1.js rename to test/src/exp/es5-es6/integration-tests/test1.js diff --git a/test/src/es5-es6/integration-tests/test2.js b/test/src/exp/es5-es6/integration-tests/test2.js similarity index 100% rename from test/src/es5-es6/integration-tests/test2.js rename to test/src/exp/es5-es6/integration-tests/test2.js diff --git a/test/src/es5-es6/integration-tests/test3.js b/test/src/exp/es5-es6/integration-tests/test3.js similarity index 100% rename from test/src/es5-es6/integration-tests/test3.js rename to test/src/exp/es5-es6/integration-tests/test3.js diff --git a/test/src/es5-es6/integration-tests/test4.js b/test/src/exp/es5-es6/integration-tests/test4.js similarity index 100% rename from test/src/es5-es6/integration-tests/test4.js rename to test/src/exp/es5-es6/integration-tests/test4.js diff --git a/test/src/es5-es6/integration-tests/test5.js b/test/src/exp/es5-es6/integration-tests/test5.js similarity index 100% rename from test/src/es5-es6/integration-tests/test5.js rename to test/src/exp/es5-es6/integration-tests/test5.js diff --git a/test/src/es5-es6/integration-tests/test6.js b/test/src/exp/es5-es6/integration-tests/test6.js similarity index 100% rename from test/src/es5-es6/integration-tests/test6.js rename to test/src/exp/es5-es6/integration-tests/test6.js diff --git a/test/src/es5-es6/j.js b/test/src/exp/es5-es6/j.js similarity index 100% rename from test/src/es5-es6/j.js rename to test/src/exp/es5-es6/j.js diff --git a/test/src/es5-es6/module-load-precedence/cluster-load.js b/test/src/exp/es5-es6/module-load-precedence/cluster-load.js similarity index 100% rename from test/src/es5-es6/module-load-precedence/cluster-load.js rename to test/src/exp/es5-es6/module-load-precedence/cluster-load.js diff --git a/test/src/es5-es6/multiple-test-suites/one.test.js b/test/src/exp/es5-es6/multiple-test-suites/one.test.js similarity index 100% rename from test/src/es5-es6/multiple-test-suites/one.test.js rename to test/src/exp/es5-es6/multiple-test-suites/one.test.js diff --git a/test/src/es5-es6/multiple-test-suites/two.test.js b/test/src/exp/es5-es6/multiple-test-suites/two.test.js similarity index 100% rename from test/src/es5-es6/multiple-test-suites/two.test.js rename to test/src/exp/es5-es6/multiple-test-suites/two.test.js diff --git a/test/src/es5-es6/other-tests/test3.js b/test/src/exp/es5-es6/other-tests/test3.js similarity index 100% rename from test/src/es5-es6/other-tests/test3.js rename to test/src/exp/es5-es6/other-tests/test3.js diff --git a/test/src/es5-es6/other-tests/test4.js b/test/src/exp/es5-es6/other-tests/test4.js similarity index 100% rename from test/src/es5-es6/other-tests/test4.js rename to test/src/exp/es5-es6/other-tests/test4.js diff --git a/test/src/es5-es6/other-tests/test5.js b/test/src/exp/es5-es6/other-tests/test5.js similarity index 100% rename from test/src/es5-es6/other-tests/test5.js rename to test/src/exp/es5-es6/other-tests/test5.js diff --git a/test/src/es5-es6/other-tests/test6.js b/test/src/exp/es5-es6/other-tests/test6.js similarity index 100% rename from test/src/es5-es6/other-tests/test6.js rename to test/src/exp/es5-es6/other-tests/test6.js diff --git a/test/src/es5-es6/par-vs-series/par-vs-series-1.js b/test/src/exp/es5-es6/par-vs-series/par-vs-series-1.js similarity index 100% rename from test/src/es5-es6/par-vs-series/par-vs-series-1.js rename to test/src/exp/es5-es6/par-vs-series/par-vs-series-1.js diff --git a/test/src/es5-es6/par-vs-series/par-vs-series-2.js b/test/src/exp/es5-es6/par-vs-series/par-vs-series-2.js similarity index 100% rename from test/src/es5-es6/par-vs-series/par-vs-series-2.js rename to test/src/exp/es5-es6/par-vs-series/par-vs-series-2.js diff --git a/test/src/es5-es6/par-vs-series/par-vs-series-3.js b/test/src/exp/es5-es6/par-vs-series/par-vs-series-3.js similarity index 100% rename from test/src/es5-es6/par-vs-series/par-vs-series-3.js rename to test/src/exp/es5-es6/par-vs-series/par-vs-series-3.js diff --git a/test/src/es5-es6/parallel-tests/@run.sh b/test/src/exp/es5-es6/parallel-tests/@run.sh similarity index 100% rename from test/src/es5-es6/parallel-tests/@run.sh rename to test/src/exp/es5-es6/parallel-tests/@run.sh diff --git a/test/src/es5-es6/parallel-tests/@transform.sh b/test/src/exp/es5-es6/parallel-tests/@transform.sh similarity index 100% rename from test/src/es5-es6/parallel-tests/@transform.sh rename to test/src/exp/es5-es6/parallel-tests/@transform.sh diff --git a/test/src/es5-es6/parallel-tests/src/par-test.js b/test/src/exp/es5-es6/parallel-tests/src/par-test.js similarity index 100% rename from test/src/es5-es6/parallel-tests/src/par-test.js rename to test/src/exp/es5-es6/parallel-tests/src/par-test.js diff --git a/test/src/es5-es6/parallel-tests/src/ptest1.js b/test/src/exp/es5-es6/parallel-tests/src/ptest1.js similarity index 100% rename from test/src/es5-es6/parallel-tests/src/ptest1.js rename to test/src/exp/es5-es6/parallel-tests/src/ptest1.js diff --git a/test/src/es5-es6/parallel-tests/target/par-test.js b/test/src/exp/es5-es6/parallel-tests/target/par-test.js similarity index 100% rename from test/src/es5-es6/parallel-tests/target/par-test.js rename to test/src/exp/es5-es6/parallel-tests/target/par-test.js diff --git a/test/src/es5-es6/parallel-tests/target/ptest1.js b/test/src/exp/es5-es6/parallel-tests/target/ptest1.js similarity index 100% rename from test/src/es5-es6/parallel-tests/target/ptest1.js rename to test/src/exp/es5-es6/parallel-tests/target/ptest1.js diff --git a/test/src/es5-es6/plan-and-confirm/one.test.js b/test/src/exp/es5-es6/plan-and-confirm/one.test.js similarity index 100% rename from test/src/es5-es6/plan-and-confirm/one.test.js rename to test/src/exp/es5-es6/plan-and-confirm/one.test.js diff --git a/test/src/es5-es6/plan-and-confirm/two.test.js b/test/src/exp/es5-es6/plan-and-confirm/two.test.js similarity index 100% rename from test/src/es5-es6/plan-and-confirm/two.test.js rename to test/src/exp/es5-es6/plan-and-confirm/two.test.js diff --git a/test/src/es5-es6/simple-tests/one-1.js b/test/src/exp/es5-es6/simple-tests/one-1.js similarity index 100% rename from test/src/es5-es6/simple-tests/one-1.js rename to test/src/exp/es5-es6/simple-tests/one-1.js diff --git a/test/src/es5-es6/skip-and-only/one.test.js b/test/src/exp/es5-es6/skip-and-only/one.test.js similarity index 100% rename from test/src/es5-es6/skip-and-only/one.test.js rename to test/src/exp/es5-es6/skip-and-only/one.test.js diff --git a/test/src/es5-es6/skip-and-only/three.test.js b/test/src/exp/es5-es6/skip-and-only/three.test.js similarity index 100% rename from test/src/es5-es6/skip-and-only/three.test.js rename to test/src/exp/es5-es6/skip-and-only/three.test.js diff --git a/test/src/es5-es6/skip-and-only/two.test.js b/test/src/exp/es5-es6/skip-and-only/two.test.js similarity index 100% rename from test/src/es5-es6/skip-and-only/two.test.js rename to test/src/exp/es5-es6/skip-and-only/two.test.js diff --git a/test/src/es5-es6/stubbed-hooks-and-test-cases/one.test.js b/test/src/exp/es5-es6/stubbed-hooks-and-test-cases/one.test.js similarity index 100% rename from test/src/es5-es6/stubbed-hooks-and-test-cases/one.test.js rename to test/src/exp/es5-es6/stubbed-hooks-and-test-cases/one.test.js diff --git a/test/src/es5-es6/stubbed-hooks-and-test-cases/two.test.js b/test/src/exp/es5-es6/stubbed-hooks-and-test-cases/two.test.js similarity index 100% rename from test/src/es5-es6/stubbed-hooks-and-test-cases/two.test.js rename to test/src/exp/es5-es6/stubbed-hooks-and-test-cases/two.test.js diff --git a/test/src/es5-es6/suman-single-process/par-vs-series-1.js b/test/src/exp/es5-es6/suman-single-process/par-vs-series-1.js similarity index 100% rename from test/src/es5-es6/suman-single-process/par-vs-series-1.js rename to test/src/exp/es5-es6/suman-single-process/par-vs-series-1.js diff --git a/test/src/es5-es6/suman-single-process/par-vs-series-2.js b/test/src/exp/es5-es6/suman-single-process/par-vs-series-2.js similarity index 100% rename from test/src/es5-es6/suman-single-process/par-vs-series-2.js rename to test/src/exp/es5-es6/suman-single-process/par-vs-series-2.js diff --git a/test/src/es5-es6/suman-single-process/par-vs-series-3.js b/test/src/exp/es5-es6/suman-single-process/par-vs-series-3.js similarity index 100% rename from test/src/es5-es6/suman-single-process/par-vs-series-3.js rename to test/src/exp/es5-es6/suman-single-process/par-vs-series-3.js diff --git a/test/src/es5-es6/test-suites-in-series/a.test.js b/test/src/exp/es5-es6/test-suites-in-series/a.test.js similarity index 100% rename from test/src/es5-es6/test-suites-in-series/a.test.js rename to test/src/exp/es5-es6/test-suites-in-series/a.test.js diff --git a/test/src/es5-es6/test-suites-in-series/b.test.js b/test/src/exp/es5-es6/test-suites-in-series/b.test.js similarity index 100% rename from test/src/es5-es6/test-suites-in-series/b.test.js rename to test/src/exp/es5-es6/test-suites-in-series/b.test.js diff --git a/test/src/es5-es6/test-tests/generatorz-babel.js b/test/src/exp/es5-es6/test-tests/generatorz-babel.js similarity index 100% rename from test/src/es5-es6/test-tests/generatorz-babel.js rename to test/src/exp/es5-es6/test-tests/generatorz-babel.js diff --git a/test/src/es5-es6/test-tests/generatorz.js b/test/src/exp/es5-es6/test-tests/generatorz.js similarity index 100% rename from test/src/es5-es6/test-tests/generatorz.js rename to test/src/exp/es5-es6/test-tests/generatorz.js diff --git a/test/src/es5-es6/test-tests/many-commands.js b/test/src/exp/es5-es6/test-tests/many-commands.js similarity index 100% rename from test/src/es5-es6/test-tests/many-commands.js rename to test/src/exp/es5-es6/test-tests/many-commands.js diff --git a/test/src/es5-es6/test-tests/one.js b/test/src/exp/es5-es6/test-tests/one.js similarity index 100% rename from test/src/es5-es6/test-tests/one.js rename to test/src/exp/es5-es6/test-tests/one.js diff --git a/test/src/es5-es6/test-tests/two.js b/test/src/exp/es5-es6/test-tests/two.js similarity index 100% rename from test/src/es5-es6/test-tests/two.js rename to test/src/exp/es5-es6/test-tests/two.js diff --git a/test/src/es5-es6/use-async-lib/one.test.js b/test/src/exp/es5-es6/use-async-lib/one.test.js similarity index 100% rename from test/src/es5-es6/use-async-lib/one.test.js rename to test/src/exp/es5-es6/use-async-lib/one.test.js diff --git a/test/src/es5-es6/use-async-lib/two.test.js b/test/src/exp/es5-es6/use-async-lib/two.test.js similarity index 100% rename from test/src/es5-es6/use-async-lib/two.test.js rename to test/src/exp/es5-es6/use-async-lib/two.test.js diff --git a/test/src/fly-user/Dockerfile b/test/src/exp/fly-user/Dockerfile similarity index 100% rename from test/src/fly-user/Dockerfile rename to test/src/exp/fly-user/Dockerfile diff --git a/test/src/fly-user/open-subl.js b/test/src/exp/fly-user/open-subl.js similarity index 100% rename from test/src/fly-user/open-subl.js rename to test/src/exp/fly-user/open-subl.js diff --git a/test/src/fly-user/script.sh b/test/src/exp/fly-user/script.sh similarity index 100% rename from test/src/fly-user/script.sh rename to test/src/exp/fly-user/script.sh diff --git a/test/src/fly-user/use-docker2.sh b/test/src/exp/fly-user/use-docker2.sh similarity index 100% rename from test/src/fly-user/use-docker2.sh rename to test/src/exp/fly-user/use-docker2.sh diff --git a/test/src/fly/Dockerfile b/test/src/exp/fly/Dockerfile similarity index 100% rename from test/src/fly/Dockerfile rename to test/src/exp/fly/Dockerfile diff --git a/test/src/fly/script.sh b/test/src/exp/fly/script.sh similarity index 100% rename from test/src/fly/script.sh rename to test/src/exp/fly/script.sh diff --git a/test/src/injections-suites/one.test.js b/test/src/exp/injections-suites/one.test.js similarity index 100% rename from test/src/injections-suites/one.test.js rename to test/src/exp/injections-suites/one.test.js diff --git a/test/src/installation/Dockerfile b/test/src/exp/installation/Dockerfile similarity index 100% rename from test/src/installation/Dockerfile rename to test/src/exp/installation/Dockerfile diff --git a/test/src/installation/package.json b/test/src/exp/installation/package.json similarity index 100% rename from test/src/installation/package.json rename to test/src/exp/installation/package.json diff --git a/test/src/installation/run-docker-test.sh b/test/src/exp/installation/run-docker-test.sh similarity index 100% rename from test/src/installation/run-docker-test.sh rename to test/src/exp/installation/run-docker-test.sh diff --git a/test/src/installation/test-install-post-publish2.sh b/test/src/exp/installation/test-install-post-publish2.sh similarity index 100% rename from test/src/installation/test-install-post-publish2.sh rename to test/src/exp/installation/test-install-post-publish2.sh diff --git a/test/src/installation/test-install-pre-publish.sh b/test/src/exp/installation/test-install-pre-publish.sh similarity index 100% rename from test/src/installation/test-install-pre-publish.sh rename to test/src/exp/installation/test-install-pre-publish.sh diff --git a/test/src/installation/test-new-install.js b/test/src/exp/installation/test-new-install.js similarity index 100% rename from test/src/installation/test-new-install.js rename to test/src/exp/installation/test-new-install.js diff --git a/test/src/installation/test-new-install.sh b/test/src/exp/installation/test-new-install.sh similarity index 100% rename from test/src/installation/test-new-install.sh rename to test/src/exp/installation/test-new-install.sh diff --git a/test/src/installation/test-suman.sh b/test/src/exp/installation/test-suman.sh similarity index 100% rename from test/src/installation/test-suman.sh rename to test/src/exp/installation/test-suman.sh diff --git a/test/src/interactive/interactive.js b/test/src/exp/interactive/interactive.js similarity index 100% rename from test/src/interactive/interactive.js rename to test/src/exp/interactive/interactive.js diff --git a/test/src/mocha/@run.sh b/test/src/exp/mocha/@run.sh similarity index 100% rename from test/src/mocha/@run.sh rename to test/src/exp/mocha/@run.sh diff --git a/test/src/mocha/mocha1.js b/test/src/exp/mocha/mocha1.js similarity index 100% rename from test/src/mocha/mocha1.js rename to test/src/exp/mocha/mocha1.js diff --git a/test/src/mocha/mocha2.js b/test/src/exp/mocha/mocha2.js similarity index 100% rename from test/src/mocha/mocha2.js rename to test/src/exp/mocha/mocha2.js diff --git a/test/src/mocha/one.mocha.test.js b/test/src/exp/mocha/one.mocha.test.js similarity index 100% rename from test/src/mocha/one.mocha.test.js rename to test/src/exp/mocha/one.mocha.test.js diff --git a/test/src/npmlinkup/one.test.js b/test/src/exp/npmlinkup/one.test.js similarity index 100% rename from test/src/npmlinkup/one.test.js rename to test/src/exp/npmlinkup/one.test.js diff --git a/test/src/observables/first.test.js b/test/src/exp/observables/first.test.js similarity index 100% rename from test/src/observables/first.test.js rename to test/src/exp/observables/first.test.js diff --git a/test/src/once-pre/one.test.js b/test/src/exp/once-pre/one.test.js similarity index 100% rename from test/src/once-pre/one.test.js rename to test/src/exp/once-pre/one.test.js diff --git a/test/src/programmatic/macros/call.js b/test/src/exp/programmatic/macros/call.js similarity index 100% rename from test/src/programmatic/macros/call.js rename to test/src/exp/programmatic/macros/call.js diff --git a/test/src/programmatic/macros/one.test.js b/test/src/exp/programmatic/macros/one.test.js similarity index 100% rename from test/src/programmatic/macros/one.test.js rename to test/src/exp/programmatic/macros/one.test.js diff --git a/test/src/programmatic/strm-sync-tests/output6.js b/test/src/exp/programmatic/strm-sync-tests/output6.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/output6.js rename to test/src/exp/programmatic/strm-sync-tests/output6.js diff --git a/test/src/programmatic/strm-sync-tests/output7.js b/test/src/exp/programmatic/strm-sync-tests/output7.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/output7.js rename to test/src/exp/programmatic/strm-sync-tests/output7.js diff --git a/test/src/programmatic/strm-sync-tests/output8.js b/test/src/exp/programmatic/strm-sync-tests/output8.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/output8.js rename to test/src/exp/programmatic/strm-sync-tests/output8.js diff --git a/test/src/programmatic/strm-sync-tests/output9.js b/test/src/exp/programmatic/strm-sync-tests/output9.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/output9.js rename to test/src/exp/programmatic/strm-sync-tests/output9.js diff --git a/test/src/programmatic/strm-sync-tests/test6.js b/test/src/exp/programmatic/strm-sync-tests/test6.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/test6.js rename to test/src/exp/programmatic/strm-sync-tests/test6.js diff --git a/test/src/programmatic/strm-sync-tests/test7.js b/test/src/exp/programmatic/strm-sync-tests/test7.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/test7.js rename to test/src/exp/programmatic/strm-sync-tests/test7.js diff --git a/test/src/programmatic/strm-sync-tests/test8.js b/test/src/exp/programmatic/strm-sync-tests/test8.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/test8.js rename to test/src/exp/programmatic/strm-sync-tests/test8.js diff --git a/test/src/programmatic/strm-sync-tests/test9.js b/test/src/exp/programmatic/strm-sync-tests/test9.js similarity index 100% rename from test/src/programmatic/strm-sync-tests/test9.js rename to test/src/exp/programmatic/strm-sync-tests/test9.js diff --git a/test/src/promises-patch/one.test.js b/test/src/exp/promises-patch/one.test.js similarity index 100% rename from test/src/promises-patch/one.test.js rename to test/src/exp/promises-patch/one.test.js diff --git a/test/src/promises-patch/two.test.js b/test/src/exp/promises-patch/two.test.js similarity index 100% rename from test/src/promises-patch/two.test.js rename to test/src/exp/promises-patch/two.test.js diff --git a/test/src/sqlite3/one.test.js b/test/src/exp/sqlite3/one.test.js similarity index 100% rename from test/src/sqlite3/one.test.js rename to test/src/exp/sqlite3/one.test.js diff --git a/test/src/sqlite3/two.test.js b/test/src/exp/sqlite3/two.test.js similarity index 100% rename from test/src/sqlite3/two.test.js rename to test/src/exp/sqlite3/two.test.js diff --git a/test/src/sqlite3/waterfall.test.js b/test/src/exp/sqlite3/waterfall.test.js similarity index 100% rename from test/src/sqlite3/waterfall.test.js rename to test/src/exp/sqlite3/waterfall.test.js diff --git a/test/src/streams/first.test.js b/test/src/exp/streams/first.test.js similarity index 100% rename from test/src/streams/first.test.js rename to test/src/exp/streams/first.test.js diff --git a/test/src/tap-output/@config.json b/test/src/exp/tap-output/@config.json similarity index 100% rename from test/src/tap-output/@config.json rename to test/src/exp/tap-output/@config.json diff --git a/test/src/tap-output/@src/tap-producer1.ts b/test/src/exp/tap-output/@src/tap-producer1.ts similarity index 100% rename from test/src/tap-output/@src/tap-producer1.ts rename to test/src/exp/tap-output/@src/tap-producer1.ts diff --git a/test/src/tap-output/@src/tap-producer2.ts b/test/src/exp/tap-output/@src/tap-producer2.ts similarity index 100% rename from test/src/tap-output/@src/tap-producer2.ts rename to test/src/exp/tap-output/@src/tap-producer2.ts diff --git a/test/src/tap-output/@target/tap-producer1.js b/test/src/exp/tap-output/@target/tap-producer1.js similarity index 100% rename from test/src/tap-output/@target/tap-producer1.js rename to test/src/exp/tap-output/@target/tap-producer1.js diff --git a/test/src/tap-output/@target/tap-producer2.js b/test/src/exp/tap-output/@target/tap-producer2.js similarity index 100% rename from test/src/tap-output/@target/tap-producer2.js rename to test/src/exp/tap-output/@target/tap-producer2.js diff --git a/test/src/tap-output/tsconfig.json b/test/src/exp/tap-output/tsconfig.json similarity index 100% rename from test/src/tap-output/tsconfig.json rename to test/src/exp/tap-output/tsconfig.json diff --git a/test/src/tap-parsing/one.test.js b/test/src/exp/tap-parsing/one.test.js similarity index 100% rename from test/src/tap-parsing/one.test.js rename to test/src/exp/tap-parsing/one.test.js diff --git a/test/src/typescript/@run.sh b/test/src/exp/typescript/@run.sh similarity index 100% rename from test/src/typescript/@run.sh rename to test/src/exp/typescript/@run.sh diff --git a/test/src/typescript/@src/a.test.ts b/test/src/exp/typescript/@src/a.test.ts similarity index 100% rename from test/src/typescript/@src/a.test.ts rename to test/src/exp/typescript/@src/a.test.ts diff --git a/test/src/typescript/@src/a2.test.ts b/test/src/exp/typescript/@src/a2.test.ts similarity index 100% rename from test/src/typescript/@src/a2.test.ts rename to test/src/exp/typescript/@src/a2.test.ts diff --git a/test/src/typescript/@src/b.test.ts b/test/src/exp/typescript/@src/b.test.ts similarity index 100% rename from test/src/typescript/@src/b.test.ts rename to test/src/exp/typescript/@src/b.test.ts diff --git a/test/src/typescript/@src/b2.test.ts b/test/src/exp/typescript/@src/b2.test.ts similarity index 100% rename from test/src/typescript/@src/b2.test.ts rename to test/src/exp/typescript/@src/b2.test.ts diff --git a/test/src/typescript/@target/a.test.js b/test/src/exp/typescript/@target/a.test.js similarity index 100% rename from test/src/typescript/@target/a.test.js rename to test/src/exp/typescript/@target/a.test.js diff --git a/test/src/typescript/@target/a2.test.js b/test/src/exp/typescript/@target/a2.test.js similarity index 100% rename from test/src/typescript/@target/a2.test.js rename to test/src/exp/typescript/@target/a2.test.js diff --git a/test/src/typescript/@target/b.test.js b/test/src/exp/typescript/@target/b.test.js similarity index 100% rename from test/src/typescript/@target/b.test.js rename to test/src/exp/typescript/@target/b.test.js diff --git a/test/src/typescript/@target/b2.test.js b/test/src/exp/typescript/@target/b2.test.js similarity index 100% rename from test/src/typescript/@target/b2.test.js rename to test/src/exp/typescript/@target/b2.test.js diff --git a/test/src/typescript/@transform.sh b/test/src/exp/typescript/@transform.sh similarity index 100% rename from test/src/typescript/@transform.sh rename to test/src/exp/typescript/@transform.sh diff --git a/test/src/typescript/tsconfig.json b/test/src/exp/typescript/tsconfig.json similarity index 100% rename from test/src/typescript/tsconfig.json rename to test/src/exp/typescript/tsconfig.json diff --git a/test/src/unit/one-test.js b/test/src/exp/unit/one-test.js similarity index 100% rename from test/src/unit/one-test.js rename to test/src/exp/unit/one-test.js From 01de89a70c7b5a0a772ab80262dcdb735b4d86f7 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 18:40:55 -0700 Subject: [PATCH 05/32] pdev:set --- lib/helpers/handle-suman-counts.js | 1 - lib/helpers/handle-suman-counts.ts | 1 - lib/injection/injection-container.js | 37 +++++++++ lib/injection/injection-container.ts | 48 +++++++++++ lib/suman.d.ts | 5 +- lib/suman.ts | 8 +- .../test-suite-base-constructor.d.ts | 1 + .../test-suite-base-constructor.js | 6 +- .../test-suite-base-constructor.ts | 7 +- lib/test-suite-methods/make-describe.js | 1 + lib/test-suite-methods/make-describe.ts | 2 +- lib/test-suite-methods/make-it.js | 10 ++- lib/test-suite-methods/make-it.ts | 11 ++- test/src/dev/node/1.test.js | 79 +++++++++++++++++++ test/{ => src/exp}/ajax1.js | 0 test/{ => src/exp}/before-each.js | 0 test/src/{ => exp}/exp.js | 0 test/{ => src/exp}/one.js | 0 test/{ => src/exp}/regexp.js | 0 test/{ => src/exp}/simple.js | 0 test/{ => src/exp}/vm.js | 0 test/{ => src/exp}/zoom.js | 0 22 files changed, 204 insertions(+), 13 deletions(-) create mode 100644 test/src/dev/node/1.test.js rename test/{ => src/exp}/ajax1.js (100%) rename test/{ => src/exp}/before-each.js (100%) rename test/src/{ => exp}/exp.js (100%) rename test/{ => src/exp}/one.js (100%) rename test/{ => src/exp}/regexp.js (100%) rename test/{ => src/exp}/simple.js (100%) rename test/{ => src/exp}/vm.js (100%) rename test/{ => src/exp}/zoom.js (100%) diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 9cde33a9..1140a868 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -59,7 +59,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { }; }; waitForStdioToDrain(function () { - _suman.log('suman child is all done and exitting.'); process.exit(highestExitCode); }); }); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index aebfe8ad..0e624090 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -96,7 +96,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { }; waitForStdioToDrain(function () { - _suman.log('suman child is all done and exitting.'); process.exit(highestExitCode) }); diff --git a/lib/injection/injection-container.js b/lib/injection/injection-container.js index e10ff77b..0b63677b 100755 --- a/lib/injection/injection-container.js +++ b/lib/injection/injection-container.js @@ -5,10 +5,47 @@ var global = require('suman-browser-polyfills/modules/global'); var pragmatik = require('pragmatik'); var _suman = global.__suman = (global.__suman || {}); var rules = require('../helpers/handle-varargs'); +var possibleProps = { + describe: true, + beforeeach: true, + aftereach: true, + after: true, + before: true, + context: true, + it: true, + test: true, + skip: true, + fatal: true, + parallel: true, + series: true, + cb: true, + only: true, + plan: true, + throws: true, + timeout: true, + always: true, + last: true, + __preParsed: true +}; exports.makeInjectionContainer = function (suman) { var getProxy = function (val, props) { return new Proxy(val, { get: function (target, prop) { + debugger; + if (typeof prop === 'symbol') { + return Reflect.get.apply(Reflect, arguments); + } + var meth = String(prop).toLowerCase(); + if (!possibleProps[meth]) { + try { + debugger; + return Reflect.get.apply(Reflect, arguments); + } + catch (err) { + throw new Error("Test suite may not have a '" + prop + "' property or method.\n" + err.stack); + } + } + debugger; var hasSkip = false; var newProps = props.concat(String(prop)).filter(function (v, i, a) { if (String(v) === 'skip') { diff --git a/lib/injection/injection-container.ts b/lib/injection/injection-container.ts index 55f6065d..d9718bc3 100755 --- a/lib/injection/injection-container.ts +++ b/lib/injection/injection-container.ts @@ -27,6 +27,34 @@ const rules = require('../helpers/handle-varargs'); //////////////////////////////////////////////////////////////////*/ +const possibleProps = { + + //methods + describe: true, + beforeeach: true, + aftereach: true, + after: true, + before: true, + context: true, + it: true, + test: true, + + // options + skip: true, + fatal: true, + parallel: true, + series: true, + cb: true, + only: true, + plan: true, + throws: true, + timeout: true, + always: true, + last: true, + __preParsed: true + +}; + export const makeInjectionContainer = function (suman: ISuman) { const getProxy = function (val: Object, props: Array): any { @@ -34,6 +62,26 @@ export const makeInjectionContainer = function (suman: ISuman) { return new Proxy(val, { get: function (target, prop) { + debugger; + + if (typeof prop === 'symbol') { + return Reflect.get(...arguments); + } + + let meth = String(prop).toLowerCase(); + + if (!possibleProps[meth] /*&& !(prop in target)*/) { + try { + debugger; + return Reflect.get(...arguments); + } + catch (err) { + throw new Error(`Test suite may not have a '${prop}' property or method.\n${err.stack}`) + } + } + + debugger; + let hasSkip = false; let newProps = props.concat(String(prop)).filter(function (v, i, a) { if (String(v) === 'skip') { diff --git a/lib/suman.d.ts b/lib/suman.d.ts index 352f93ed..4886fe7b 100755 --- a/lib/suman.d.ts +++ b/lib/suman.d.ts @@ -2,12 +2,15 @@ import { ITestSuite } from "suman-types/dts/test-suite"; import { ISumanConfig } from "suman-types/dts/global"; import { ISumanInputs } from "suman-types/dts/suman"; import { ITestDataObj } from "suman-types/dts/it"; +export interface ITestBlockMethodCache { + [key: string]: Function; +} export declare class Suman { ctx?: ITestSuite; interface: string; $inject: Object; private __inject; - testBlockMethodCache: Object; + testBlockMethodCache: ITestBlockMethodCache; iocData: Object; fileName: string; slicedFileName: string; diff --git a/lib/suman.ts b/lib/suman.ts index 98810351..d08ad80a 100755 --- a/lib/suman.ts +++ b/lib/suman.ts @@ -46,6 +46,12 @@ if (process.env.DEFAULT_PARALLEL_TOTAL_LIMIT && (envTotal = Number(process.env.D ////////////////////////////////////////////////////////////////////////////// +export interface ITestBlockMethodCache { + [key: string]: Function +} + +/////////////////////////////////////////////////////////////////////////////// + let sumanId = 0; export class Suman { @@ -54,7 +60,7 @@ export class Suman { interface: string; $inject: Object; private __inject: Object; - testBlockMethodCache: Object; + testBlockMethodCache: ITestBlockMethodCache; iocData: Object; fileName: string; slicedFileName: string; diff --git a/lib/test-suite-helpers/test-suite-base-constructor.d.ts b/lib/test-suite-helpers/test-suite-base-constructor.d.ts index c5252fca..95a96fd7 100755 --- a/lib/test-suite-helpers/test-suite-base-constructor.d.ts +++ b/lib/test-suite-helpers/test-suite-base-constructor.d.ts @@ -8,6 +8,7 @@ export declare class TestSuiteBase { isSetupComplete: boolean; parallel: boolean; skipped: boolean; + fixed: boolean; only: boolean; filename: string; getAfterAllParentHooks: Function; diff --git a/lib/test-suite-helpers/test-suite-base-constructor.js b/lib/test-suite-helpers/test-suite-base-constructor.js index 308734c4..635d1dfc 100755 --- a/lib/test-suite-helpers/test-suite-base-constructor.js +++ b/lib/test-suite-helpers/test-suite-base-constructor.js @@ -10,8 +10,10 @@ var TestSuiteBase = (function () { this.opts = obj.opts; this.testId = incrementer_1.incr(); this.isSetupComplete = false; - this.parallel = sumanOpts.parallel || - (!sumanOpts.series && (obj.opts.parallel === true || obj.opts.mode === 'parallel')); + var parallel = obj.opts.parallel; + var mode = obj.opts.mode; + var fixed = this.fixed = (this.opts.fixed || false); + this.parallel = (sumanOpts.parallel && !fixed) || (!sumanOpts.series && (parallel === true || mode === 'parallel')); this.skipped = this.opts.skip || false; this.only = this.opts.only || false; this.filename = suman.filename; diff --git a/lib/test-suite-helpers/test-suite-base-constructor.ts b/lib/test-suite-helpers/test-suite-base-constructor.ts index 49ecae73..958a210b 100755 --- a/lib/test-suite-helpers/test-suite-base-constructor.ts +++ b/lib/test-suite-helpers/test-suite-base-constructor.ts @@ -38,6 +38,7 @@ export class TestSuiteBase { isSetupComplete: boolean; parallel: boolean; skipped: boolean; + fixed: boolean; only: boolean; filename: string; getAfterAllParentHooks: Function; @@ -68,8 +69,10 @@ export class TestSuiteBase { this.opts = obj.opts; this.testId = incr(); this.isSetupComplete = false; - this.parallel = sumanOpts.parallel || - (!sumanOpts.series && (obj.opts.parallel === true || obj.opts.mode === 'parallel')); + let parallel = obj.opts.parallel; + let mode = obj.opts.mode; + let fixed = this.fixed = (this.opts.fixed || false); + this.parallel = (sumanOpts.parallel && !fixed) || (!sumanOpts.series && (parallel === true || mode === 'parallel')); this.skipped = this.opts.skip || false; this.only = this.opts.only || false; this.filename = suman.filename; diff --git a/lib/test-suite-methods/make-describe.js b/lib/test-suite-methods/make-describe.js index 15b25a1f..5bc4d966 100755 --- a/lib/test-suite-methods/make-describe.js +++ b/lib/test-suite-methods/make-describe.js @@ -22,6 +22,7 @@ var acceptableOptions = { only: true, delay: true, parallel: true, + limit: true, series: true, mode: true, __preParsed: true diff --git a/lib/test-suite-methods/make-describe.ts b/lib/test-suite-methods/make-describe.ts index 57b623a1..040ab4e0 100755 --- a/lib/test-suite-methods/make-describe.ts +++ b/lib/test-suite-methods/make-describe.ts @@ -50,6 +50,7 @@ const acceptableOptions = { only: true, delay: true, parallel: true, + limit: true, series: true, mode: true, __preParsed: true @@ -77,7 +78,6 @@ export const makeDescribe = function (suman: ISuman, gracefulExit: Function, Tes const {sumanOpts} = _suman; handleSetupComplete(zuite, 'describe'); - const args = pragmatik.parse(arguments, rules.blockSignature, { preParsed: su.isObject($opts) ? $opts.__preParsed : null }); diff --git a/lib/test-suite-methods/make-it.js b/lib/test-suite-methods/make-it.js index 1f56979e..007bfafd 100755 --- a/lib/test-suite-methods/make-it.js +++ b/lib/test-suite-methods/make-it.js @@ -20,6 +20,7 @@ var acceptableOptions = { cb: true, parallel: true, series: true, + mode: true, timeout: true, only: true, skip: true, @@ -88,6 +89,10 @@ exports.makeIt = function (suman, zuite) { if (opts.only) { suman.itOnlyIsTriggered = true; } + var isSeries = zuite.series || opts.series === true || opts.parallel === false; + var isFixedParallel = !isSeries && (zuite.parallel || opts.parallel === true || opts.mode === 'parallel'); + var isParallel = (sumanOpts.parallel || sumanOpts.parallel_max) || (!sumanOpts.series && isFixedParallel); + var isOverallParallel = (opts.fixed && isFixedParallel) || isParallel; var testData = { alreadyInitiated: false, testId: inc, @@ -99,7 +104,8 @@ exports.makeIt = function (suman, zuite) { skip: opts.skip, value: opts.value, throws: opts.throws, - parallel: (!sumanOpts.series && (opts.parallel === true || opts.mode === 'parallel')), + fixed: opts.fixed, + parallel: isOverallParallel, mode: opts.mode, delay: opts.delay, cb: opts.cb, @@ -112,7 +118,7 @@ exports.makeIt = function (suman, zuite) { complete: false, error: null }; - if (sumanOpts.parallel || (!sumanOpts.series && (opts.parallel || (zuite.parallel && opts.parallel !== false)))) { + if (isOverallParallel) { zuite.getParallelTests().push(testData); } else { diff --git a/lib/test-suite-methods/make-it.ts b/lib/test-suite-methods/make-it.ts index 4f013f33..d94460e7 100755 --- a/lib/test-suite-methods/make-it.ts +++ b/lib/test-suite-methods/make-it.ts @@ -40,6 +40,7 @@ const acceptableOptions = { cb: true, parallel: true, series: true, + mode: true, timeout: true, only: true, skip: true, @@ -130,6 +131,11 @@ export const makeIt = function (suman: ISuman, zuite: ITestSuite): ItFn { suman.itOnlyIsTriggered = true; } + const isSeries = zuite.series || opts.series === true || opts.parallel === false; + const isFixedParallel = !isSeries && (zuite.parallel || opts.parallel === true || opts.mode === 'parallel'); + const isParallel = (sumanOpts.parallel || sumanOpts.parallel_max) || (!sumanOpts.series && isFixedParallel); + const isOverallParallel = (opts.fixed && isFixedParallel) || isParallel; + const testData: ITestDataObj = { alreadyInitiated: false, testId: inc, @@ -141,7 +147,8 @@ export const makeIt = function (suman: ISuman, zuite: ITestSuite): ItFn { skip: opts.skip, value: opts.value, throws: opts.throws, - parallel: (!sumanOpts.series && (opts.parallel === true || opts.mode === 'parallel')), + fixed: opts.fixed, + parallel: isOverallParallel, mode: opts.mode, delay: opts.delay, cb: opts.cb, @@ -155,7 +162,7 @@ export const makeIt = function (suman: ISuman, zuite: ITestSuite): ItFn { error: null }; - if (sumanOpts.parallel || (!sumanOpts.series && (opts.parallel || (zuite.parallel && opts.parallel !== false)))) { + if (isOverallParallel) { zuite.getParallelTests().push(testData); } else { diff --git a/test/src/dev/node/1.test.js b/test/src/dev/node/1.test.js new file mode 100644 index 00000000..6490579c --- /dev/null +++ b/test/src/dev/node/1.test.js @@ -0,0 +1,79 @@ +#!/usr/bin/env node +'use strict'; + +const suman = require('suman'); +const Test = suman.init(module); + +/////////////////////////////////////////////////////////////////////// + +let count = 0; +const opts = {series: true, fixed: true}; + + +Test.create(opts, function (assert, describe, before, beforeEach, after, afterEach, it) { + + before(h => { + count++; + h.assert.equal(count, 1); + }); + + it('sync test', t => { + assert(true); + }); + + describe('nested1', () => { + + // console.log('before => ', before); + + assert.equal(count, 0); + + before(h => { + count++; + h.assert.equal(count, 2); + }); + + after(h => { + count++; + h.assert.equal(count, 6); + }); + + describe('nested2', () => { + + assert.equal(count, 0); + + before(h => { + count++; + h.assert.equal(count, 3); + }); + + after(h => { + count++; + h.assert.equal(count, 5); + }); + + }); + + }); + + describe('nested3', () => { + + assert.equal(count, 0); + + before('zoomy', h => { + count++; + h.assert.equal(count, 4); + }); + + }); + + after.last('roomy', h => { + count++; + h.assert.equal(count, 8); + }); + + after('roomy', h => { + count++; + h.assert.equal(count, 7); + }); + +}); diff --git a/test/ajax1.js b/test/src/exp/ajax1.js similarity index 100% rename from test/ajax1.js rename to test/src/exp/ajax1.js diff --git a/test/before-each.js b/test/src/exp/before-each.js similarity index 100% rename from test/before-each.js rename to test/src/exp/before-each.js diff --git a/test/src/exp.js b/test/src/exp/exp.js similarity index 100% rename from test/src/exp.js rename to test/src/exp/exp.js diff --git a/test/one.js b/test/src/exp/one.js similarity index 100% rename from test/one.js rename to test/src/exp/one.js diff --git a/test/regexp.js b/test/src/exp/regexp.js similarity index 100% rename from test/regexp.js rename to test/src/exp/regexp.js diff --git a/test/simple.js b/test/src/exp/simple.js similarity index 100% rename from test/simple.js rename to test/src/exp/simple.js diff --git a/test/vm.js b/test/src/exp/vm.js similarity index 100% rename from test/vm.js rename to test/src/exp/vm.js diff --git a/test/zoom.js b/test/src/exp/zoom.js similarity index 100% rename from test/zoom.js rename to test/src/exp/zoom.js From 8b72ce36b001ce1be1e8ba5c5807651c639c6e0b Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 18:54:33 -0700 Subject: [PATCH 06/32] pdev:set --- lib/test-suite-helpers/make-proxy.d.ts | 3 + lib/test-suite-helpers/make-proxy.js | 42 +++++++++++++ lib/test-suite-helpers/make-proxy.ts | 76 +++++++++++++++++++++++ lib/test-suite-helpers/make-test-suite.js | 40 +----------- lib/test-suite-helpers/make-test-suite.ts | 64 +------------------ lib/test-suite-methods/make-describe.js | 3 + lib/test-suite-methods/make-describe.ts | 4 ++ test/src/dev/node/1.test.js | 8 +-- 8 files changed, 136 insertions(+), 104 deletions(-) create mode 100644 lib/test-suite-helpers/make-proxy.d.ts create mode 100644 lib/test-suite-helpers/make-proxy.js create mode 100644 lib/test-suite-helpers/make-proxy.ts diff --git a/lib/test-suite-helpers/make-proxy.d.ts b/lib/test-suite-helpers/make-proxy.d.ts new file mode 100644 index 00000000..8de534e0 --- /dev/null +++ b/lib/test-suite-helpers/make-proxy.d.ts @@ -0,0 +1,3 @@ +import { Suman } from "../suman"; +import { ITestSuite } from "suman-types/dts/test-suite"; +export declare const makeProxy: (suman: Suman, ctx: ITestSuite) => Function; diff --git a/lib/test-suite-helpers/make-proxy.js b/lib/test-suite-helpers/make-proxy.js new file mode 100644 index 00000000..d8a0cd15 --- /dev/null +++ b/lib/test-suite-helpers/make-proxy.js @@ -0,0 +1,42 @@ +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +var pragmatik = require('pragmatik'); +exports.makeProxy = function (suman, ctx) { + return function getProxy(method, rule, props) { + return new Proxy(method, { + get: function (target, prop) { + props = props || []; + var hasSkip = false; + var newProps = props.concat(String(prop)).filter(function (v, i, a) { + if (String(v).toLowerCase() === 'skip') { + hasSkip = true; + } + return a.indexOf(v) === i; + }) + .sort() + .map(function (v) { return String(v).toLowerCase(); }); + if (hasSkip) { + newProps = ['skip']; + } + var cache, cacheId = newProps.join('-'); + var fnCache = ctx.testBlockMethodCache.get(method); + if (!fnCache) { + fnCache = {}; + ctx.testBlockMethodCache.set(method, fnCache); + } + if (cache = ctx.testBlockMethodCache.get(method)[cacheId]) { + return cache; + } + var fn = function () { + var args = pragmatik.parse(arguments, rule); + newProps.forEach(function (p) { + args[1][p] = true; + }); + args[1].__preParsed = true; + return method.apply(ctx, args); + }; + return fnCache[cacheId] = getProxy(fn, rule, newProps); + } + }); + }; +}; diff --git a/lib/test-suite-helpers/make-proxy.ts b/lib/test-suite-helpers/make-proxy.ts new file mode 100644 index 00000000..a1eff57f --- /dev/null +++ b/lib/test-suite-helpers/make-proxy.ts @@ -0,0 +1,76 @@ +'use strict'; + +//dts +import {ISuman, Suman} from "../suman"; +import {ITestSuite} from "suman-types/dts/test-suite"; + +//npm +const pragmatik = require('pragmatik'); + +/////////////////////////////////////////////////////////////////////////////////////////// + +export const makeProxy = function (suman: ISuman, ctx: ITestSuite) : Function { + + return function getProxy(method: Function, rule: Object, props?: Array): Function { + + /* + NOTE + this function allows us to dynamically generate functions such as + => after.last.always.skip(); + this way we only create the functions we need, instead of enumerating them all here. + this makes for a leaner and more maintenable codebase as well as potentially higher performance. + */ + + return new Proxy(method, { + get: function (target, prop) { + + props = props || []; + let hasSkip = false; + let newProps = props.concat(String(prop)).filter(function (v, i, a) { + if (String(v).toLowerCase() === 'skip') { + // if skip, none of the other properties matter + hasSkip = true; + } + // we use this filter to get a unique list + return a.indexOf(v) === i; + }) + // sort the properties alphabetically so that we need to use fewer number of caches + .sort() + .map(v => String(v).toLowerCase()); + + if (hasSkip) { + // if any of the props are "skip" then we can reduce it to just "skip" + newProps = ['skip']; + } + + let cache, cacheId = newProps.join('-'); + + let fnCache = ctx.testBlockMethodCache.get(method); + if (!fnCache) { + fnCache = {}; + ctx.testBlockMethodCache.set(method, fnCache); + } + + if (cache = ctx.testBlockMethodCache.get(method)[cacheId]) { + return cache; + } + + let fn = function () { + + let args = pragmatik.parse(arguments, rule); + + newProps.forEach(function (p) { + args[1][p] = true; + }); + + args[1].__preParsed = true; + return method.apply(ctx, args); + }; + + return fnCache[cacheId] = getProxy(fn, rule, newProps); + + } + }); + }; + +}; diff --git a/lib/test-suite-helpers/make-test-suite.js b/lib/test-suite-helpers/make-test-suite.js index bceeb6be..cc67fbbe 100755 --- a/lib/test-suite-helpers/make-test-suite.js +++ b/lib/test-suite-helpers/make-test-suite.js @@ -9,6 +9,7 @@ var _suman = global.__suman = (global.__suman || {}); var rules = require('../helpers/handle-varargs'); var constants = require('../../config/suman-constants').constants; var test_suite_base_constructor_1 = require("./test-suite-base-constructor"); +var make_proxy_1 = require("./make-proxy"); var makeStartSuite = require('./make-start-suite').makeStartSuite; var make_handle_befores_afters_1 = require("./make-handle-befores-afters"); var makeNotifyParent = require('./notify-parent-that-child-is-complete').makeNotifyParent; @@ -34,7 +35,6 @@ exports.makeTestSuiteMaker = function (suman, gracefulExit, blockInjector) { this.interface = suman.interface; this.desc = this.title = obj.desc; var zuite = this; - var ctx = this; this.resume = function () { var args = Array.from(arguments); process.nextTick(function () { @@ -49,43 +49,7 @@ exports.makeTestSuiteMaker = function (suman, gracefulExit, blockInjector) { var it = make_it_1.makeIt(suman, zuite); var afterAllParentHooks = make_after_all_parent_hooks_1.makeAfterAllParentHooks(suman, zuite); var describe = make_describe_1.makeDescribe(suman, gracefulExit, TestSuiteMaker, zuite, notifyParent, blockInjector); - var getProxy = function (method, rule, props) { - return new Proxy(method, { - get: function (target, prop) { - props = props || []; - var hasSkip = false; - var newProps = props.concat(String(prop)).filter(function (v, i, a) { - if (String(v).toLowerCase() === 'skip') { - hasSkip = true; - } - return a.indexOf(v) === i; - }) - .sort() - .map(function (v) { return String(v).toLowerCase(); }); - if (hasSkip) { - newProps = ['skip']; - } - var cache, cacheId = newProps.join('-'); - var fnCache = ctx.testBlockMethodCache.get(method); - if (!fnCache) { - fnCache = {}; - ctx.testBlockMethodCache.set(method, fnCache); - } - if (cache = ctx.testBlockMethodCache.get(method)[cacheId]) { - return cache; - } - var fn = function () { - var args = pragmatik.parse(arguments, rule); - newProps.forEach(function (p) { - args[1][p] = true; - }); - args[1].__preParsed = true; - return method.apply(ctx, args); - }; - return fnCache[cacheId] = getProxy(fn, rule, newProps); - } - }); - }; + var getProxy = make_proxy_1.makeProxy(suman, zuite); this.describe = this.context = this.suite = getProxy(describe, rules.blockSignature); this.it = this.test = getProxy(it, rules.testCaseSignature); this.inject = getProxy(inject, rules.hookSignature); diff --git a/lib/test-suite-helpers/make-test-suite.ts b/lib/test-suite-helpers/make-test-suite.ts index a726063c..7e11b3b1 100755 --- a/lib/test-suite-helpers/make-test-suite.ts +++ b/lib/test-suite-helpers/make-test-suite.ts @@ -32,6 +32,7 @@ const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); const rules = require('../helpers/handle-varargs'); const {constants} = require('../../config/suman-constants'); import {TestSuiteBase} from './test-suite-base-constructor'; +import {makeProxy} from './make-proxy'; import {freezeExistingProps} from 'freeze-existing-props' const {makeStartSuite} = require('./make-start-suite'); import {makeHandleBeforesAndAfters} from './make-handle-befores-afters'; @@ -79,7 +80,6 @@ export const makeTestSuiteMaker this.interface = suman.interface; this.desc = this.title = obj.desc; const zuite = this; - const ctx = this; this.resume = function () { const args = Array.from(arguments); @@ -101,67 +101,7 @@ export const makeTestSuiteMaker ///////////////////////////////////////////////////////////////////////////////////////// - const getProxy = function (method: Function, rule: Object, props?: Array): Function { - - /* - NOTE - this function allows us to dynamically generate functions such as - => after.last.always.skip(); - this way we only create the functions we need, instead of enumerating them all here. - this makes for a leaner and more maintenable codebase as well as potentially higher performance. - */ - - return new Proxy(method, { - get: function (target, prop) { - - props = props || []; - let hasSkip = false; - let newProps = props.concat(String(prop)).filter(function (v, i, a) { - if (String(v).toLowerCase() === 'skip') { - // if skip, none of the other properties matter - hasSkip = true; - } - // we use this filter to get a unique list - return a.indexOf(v) === i; - }) - // sort the properties alphabetically so that we need to use fewer number of caches - .sort() - .map(v => String(v).toLowerCase()); - - if (hasSkip) { - // if any of the props are "skip" then we can reduce it to just "skip" - newProps = ['skip']; - } - - let cache, cacheId = newProps.join('-'); - - let fnCache = ctx.testBlockMethodCache.get(method); - if (!fnCache) { - fnCache = {}; - ctx.testBlockMethodCache.set(method, fnCache); - } - - if (cache = ctx.testBlockMethodCache.get(method)[cacheId]) { - return cache; - } - - let fn = function () { - - let args = pragmatik.parse(arguments, rule); - - newProps.forEach(function (p) { - args[1][p] = true; - }); - - args[1].__preParsed = true; - return method.apply(ctx, args); - }; - - return fnCache[cacheId] = getProxy(fn, rule, newProps); - - } - }); - }; + const getProxy = makeProxy(suman, zuite); // _interface === 'TDD' ? this.setup = before : this.before = before; this.describe = this.context = this.suite = getProxy(describe, rules.blockSignature) as IDescribeFn; diff --git a/lib/test-suite-methods/make-describe.js b/lib/test-suite-methods/make-describe.js index 5bc4d966..20c4f418 100755 --- a/lib/test-suite-methods/make-describe.js +++ b/lib/test-suite-methods/make-describe.js @@ -83,6 +83,9 @@ exports.makeDescribe = function (suman, gracefulExit, TestSuiteMaker, zuite, not return; } var suite = TestSuiteMaker({ desc: desc, title: desc, opts: opts }); + if (zuite.fixed) { + suite.fixed = true; + } suite.skipped = opts.skip || zuite.skipped; if (!suite.only && suman.describeOnlyIsTriggered) { suite.skipped = suite.skippedDueToDescribeOnly = true; diff --git a/lib/test-suite-methods/make-describe.ts b/lib/test-suite-methods/make-describe.ts index 040ab4e0..7af9ac47 100755 --- a/lib/test-suite-methods/make-describe.ts +++ b/lib/test-suite-methods/make-describe.ts @@ -134,6 +134,10 @@ export const makeDescribe = function (suman: ISuman, gracefulExit: Function, Tes // note: zuite is the parent of suite; aka, suite is the child of zuite const suite = TestSuiteMaker({desc, title: desc, opts}); + if(zuite.fixed){ + suite.fixed = true; + } + // if parent is skipped, child is skipped, suite.skipped = opts.skip || zuite.skipped; diff --git a/test/src/dev/node/1.test.js b/test/src/dev/node/1.test.js index 6490579c..b1fcb985 100644 --- a/test/src/dev/node/1.test.js +++ b/test/src/dev/node/1.test.js @@ -34,7 +34,7 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa after(h => { count++; - h.assert.equal(count, 6); + h.assert.equal(count, 5); }); describe('nested2', () => { @@ -48,7 +48,7 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa after(h => { count++; - h.assert.equal(count, 5); + h.assert.equal(count, 4); }); }); @@ -61,7 +61,7 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa before('zoomy', h => { count++; - h.assert.equal(count, 4); + h.assert.equal(count, 6); }); }); @@ -71,7 +71,7 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa h.assert.equal(count, 8); }); - after('roomy', h => { + after.always('roomy', h => { count++; h.assert.equal(count, 7); }); From 514b2f4a2ed0d2bffdd9d83036c5338236f80c97 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 19:12:58 -0700 Subject: [PATCH 07/32] pdev:set --- lib/injection/injection-container.js | 6 ++++-- lib/injection/injection-container.ts | 9 +++++---- lib/test-suite-helpers/make-proxy.js | 9 +++++---- lib/test-suite-helpers/make-proxy.ts | 14 +++++++------- test/src/dev/node/1.test.js | 8 +++++--- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/injection/injection-container.js b/lib/injection/injection-container.js index 0b63677b..d2fa853f 100755 --- a/lib/injection/injection-container.js +++ b/lib/injection/injection-container.js @@ -47,8 +47,10 @@ exports.makeInjectionContainer = function (suman) { } debugger; var hasSkip = false; - var newProps = props.concat(String(prop)).filter(function (v, i, a) { - if (String(v) === 'skip') { + var newProps = props.concat(String(prop)) + .map(function (v) { return String(v).toLowerCase(); }) + .filter(function (v, i, a) { + if (v === 'skip') { hasSkip = true; } return a.indexOf(v) === i; diff --git a/lib/injection/injection-container.ts b/lib/injection/injection-container.ts index d9718bc3..e594536a 100755 --- a/lib/injection/injection-container.ts +++ b/lib/injection/injection-container.ts @@ -83,12 +83,13 @@ export const makeInjectionContainer = function (suman: ISuman) { debugger; let hasSkip = false; - let newProps = props.concat(String(prop)).filter(function (v, i, a) { - if (String(v) === 'skip') { + let newProps = props.concat(String(prop)) + .map(v => String(v).toLowerCase()) // we map to lowercase first, so we can use indexOf afterwards + .filter(function (v, i, a) { + if (v === 'skip') { hasSkip = true; } - // we use this filter to get a unique list - return a.indexOf(v) === i; + return a.indexOf(v) === i; // we use this filter to get a unique list }); let method = String(newProps.shift()).toLowerCase(); diff --git a/lib/test-suite-helpers/make-proxy.js b/lib/test-suite-helpers/make-proxy.js index d8a0cd15..78facdc0 100644 --- a/lib/test-suite-helpers/make-proxy.js +++ b/lib/test-suite-helpers/make-proxy.js @@ -7,14 +7,15 @@ exports.makeProxy = function (suman, ctx) { get: function (target, prop) { props = props || []; var hasSkip = false; - var newProps = props.concat(String(prop)).filter(function (v, i, a) { - if (String(v).toLowerCase() === 'skip') { + var newProps = props.concat(String(prop)) + .map(function (v) { return String(v).toLowerCase(); }) + .filter(function (v, i, a) { + if (v === 'skip') { hasSkip = true; } return a.indexOf(v) === i; }) - .sort() - .map(function (v) { return String(v).toLowerCase(); }); + .sort(); if (hasSkip) { newProps = ['skip']; } diff --git a/lib/test-suite-helpers/make-proxy.ts b/lib/test-suite-helpers/make-proxy.ts index a1eff57f..2e99ab08 100644 --- a/lib/test-suite-helpers/make-proxy.ts +++ b/lib/test-suite-helpers/make-proxy.ts @@ -26,17 +26,17 @@ export const makeProxy = function (suman: ISuman, ctx: ITestSuite) : Function { props = props || []; let hasSkip = false; - let newProps = props.concat(String(prop)).filter(function (v, i, a) { - if (String(v).toLowerCase() === 'skip') { - // if skip, none of the other properties matter + let newProps = props.concat(String(prop)) + .map(v => String(v).toLowerCase()) // we map to lowercase first, so we can use indexOf afterwards + .filter(function (v, i, a) { + if (v === 'skip') { // if skip, none of the other properties matter hasSkip = true; } - // we use this filter to get a unique list - return a.indexOf(v) === i; + return a.indexOf(v) === i; // we use this filter to get a unique list }) // sort the properties alphabetically so that we need to use fewer number of caches - .sort() - .map(v => String(v).toLowerCase()); + .sort(); + if (hasSkip) { // if any of the props are "skip" then we can reduce it to just "skip" diff --git a/test/src/dev/node/1.test.js b/test/src/dev/node/1.test.js index b1fcb985..97bfeaca 100644 --- a/test/src/dev/node/1.test.js +++ b/test/src/dev/node/1.test.js @@ -12,14 +12,16 @@ const opts = {series: true, fixed: true}; Test.create(opts, function (assert, describe, before, beforeEach, after, afterEach, it) { + + it('sync test', t => { + assert(true); + }); + before(h => { count++; h.assert.equal(count, 1); }); - it('sync test', t => { - assert(true); - }); describe('nested1', () => { From 57bd60bc23c132dbfae99524e338ab906daa74e1 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 19:28:36 -0700 Subject: [PATCH 08/32] pdev:set --- lib/default-conf-files/suman.default.conf.js | 8 +++++++- suman-todos.txt | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/default-conf-files/suman.default.conf.js b/lib/default-conf-files/suman.default.conf.js index c33d2764..86a25353 100755 --- a/lib/default-conf-files/suman.default.conf.js +++ b/lib/default-conf-files/suman.default.conf.js @@ -109,8 +109,14 @@ module.exports = { }, }, + scripts: { + // usage: $ suman --scripts example + example: 'NODE_ENV=test echo "I love hippos";' + }, + reporters: { - 'tap': 'suman/reporters/tap' + // usage: $ suman --reporters tap + 'tap': 'suman-reporters/modules/tap' }, servers: { // list of servers to output test result data to, with the os.hostname() as the key diff --git a/suman-todos.txt b/suman-todos.txt index 2f801640..c62d191b 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -4,6 +4,12 @@ three SO profiles: 2. via facebook login on chrome 3. the1mills@yahoo.com on firefox "Olegzandr Denman" +/// + + suman --scripts abc + + => should run the script that's in suman.conf.js + /// => wrapErrorFirst should also trap errors with try/catch just like wrap? From 9d6561ade27d3b7d9ef97d8ac2d546f7be37cc59 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 19:37:49 -0700 Subject: [PATCH 09/32] pdev:set --- lib/default-conf-files/suman.default.conf.js | 28 +++++--------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/lib/default-conf-files/suman.default.conf.js b/lib/default-conf-files/suman.default.conf.js index 86a25353..9660bad7 100755 --- a/lib/default-conf-files/suman.default.conf.js +++ b/lib/default-conf-files/suman.default.conf.js @@ -5,7 +5,6 @@ const os = require('os'); const path = require('path'); const numOfCPUs = os.cpus().length || 1; - module.exports = { // Array @@ -88,25 +87,14 @@ module.exports = { }, watch: { - - '//tests': { - 'default': { // (re) execute the test file that changed - script: function (p) { - return `./node_modules/.bin/suman ${p}` - }, - include: [], - exclude: ['^test.*'] - } - }, - - '//project': { - 'default': { //run all tests when a file changes in project - script: './node_modules/.bin/suman', - include: [], - exclude: ['^test.*'] + per: { + 'zoom': { + exec: 'suman test', + includes: [__dirname], + excludes: ['/test/', '/node_modules/', '/.git/'], + confOverride: {} } - - }, + } }, scripts: { @@ -120,7 +108,6 @@ module.exports = { }, servers: { // list of servers to output test result data to, with the os.hostname() as the key - '*default': { host: '127.0.0.1', port: 6969 @@ -130,7 +117,6 @@ module.exports = { host: '127.0.0.1', port: 6969 }, - }, babelRegisterOpts: { From eeb7e33ee82d0d88446bcd7ea92ba72a05d89933 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 21:33:50 -0700 Subject: [PATCH 10/32] pdev:set --- cli/suman-d.sh | 6 +- cli/suman-daemon.sh | 54 ++-- exp.js | 2 + lib/cli-commands/suman-daemon/index.d.ts | 0 lib/cli-commands/suman-daemon/index.js | 57 ----- lib/cli-commands/suman-daemon/index.ts | 92 ------- lib/cli-commands/suman-daemon/index1.d.ts | 3 - lib/cli-commands/suman-daemon/index1.js | 152 ------------ lib/cli-commands/suman-daemon/index1.ts | 230 ------------------ lib/cli-commands/suman-daemon/start-script.js | 119 --------- package.json | 4 +- suman-todos.txt | 10 + "\342\210\206open-suman-home.sh" | 3 + 13 files changed, 47 insertions(+), 685 deletions(-) delete mode 100644 lib/cli-commands/suman-daemon/index.d.ts delete mode 100644 lib/cli-commands/suman-daemon/index.js delete mode 100644 lib/cli-commands/suman-daemon/index.ts delete mode 100755 lib/cli-commands/suman-daemon/index1.d.ts delete mode 100755 lib/cli-commands/suman-daemon/index1.js delete mode 100755 lib/cli-commands/suman-daemon/index1.ts delete mode 100755 lib/cli-commands/suman-daemon/start-script.js create mode 100755 "\342\210\206open-suman-home.sh" diff --git a/cli/suman-d.sh b/cli/suman-d.sh index 55778364..1f2a578b 100755 --- a/cli/suman-d.sh +++ b/cli/suman-d.sh @@ -17,7 +17,7 @@ NEW_PATH=${PATH}:~/.suman/global/node_modules/.bin if [[ "${LOCAL_SUMAN_ALREADY_FOUND}" == "yes" ]]; then # we know that this directory contains the local version of suman we want to use - NODE_PATH=${NEW_NODE_PATH} PATH=${NEW_PATH} SUMAN_EXTRANEOUS_EXECUTABLE=yes node "${X}/cli.js" --suman-d $@ + NODE_PATH=${NEW_NODE_PATH} PATH=${NEW_PATH} SUMAN_EXTRANEOUS_EXECUTABLE=yes node "${X}/cli.js" --suman-d "$@" else # we are probably in the global install space, so let's find the local installation given pwd/cwd LOCAL_SUMAN="$(node ${X}/scripts/find-local-suman-executable.js)" @@ -26,11 +26,11 @@ else # no local version found, so we fallback on the version in this directory, global or not echo " => No local Suman executable could be found, given the current directory => $PWD" echo " => Attempting to run installed version of Suman here => '${X}/cli.js'" - NODE_PATH=${NEW_NODE_PATH} PATH=${NEW_PATH} SUMAN_EXTRANEOUS_EXECUTABLE=yes node "${X}/cli.js" --suman-d $@ + NODE_PATH=${NEW_NODE_PATH} PATH=${NEW_PATH} SUMAN_EXTRANEOUS_EXECUTABLE=yes node "${X}/cli.js" --suman-d "$@" else # local version found, so we run it - NODE_PATH=${NEW_NODE_PATH} PATH=${NEW_PATH} SUMAN_EXTRANEOUS_EXECUTABLE=yes node "${LOCAL_SUMAN}" --suman-d $@ + NODE_PATH=${NEW_NODE_PATH} PATH=${NEW_PATH} SUMAN_EXTRANEOUS_EXECUTABLE=yes node "${LOCAL_SUMAN}" --suman-d "$@" fi fi diff --git a/cli/suman-daemon.sh b/cli/suman-daemon.sh index 6bd10037..00b23bc8 100755 --- a/cli/suman-daemon.sh +++ b/cli/suman-daemon.sh @@ -7,44 +7,45 @@ fi #set -e; -# TODO: we could use either $(npm root -g)/suman-daemon or .suman/global/node_modules/suman-daemon - echo "checking if existing process is listening on port" -which_false=$(which false); # /bin/false or /usr/bin/false depending on system +# which_false=$(which false); # /bin/false or /usr/bin/false depending on system + -pkill -f suman-daemon # kill any existing suman-daemon process +if [[ "$1" != "--force" ]]; then -nc -zv localhost 9091 > /dev/null 2>&1 -nc_exit=$? + nc -zv localhost 9091 > /dev/null 2>&1 + nc_exit=$? -echo "nc_exit => $nc_exit" + if [ ${nc_exit} -eq 0 ]; then + echo "a process is already listening on the default port" + echo "please choose another port with --port=x" + echo "suman-daemon may already be running - check with 'ps aux | grep suman-daemon'" + exit 1; + fi -if [ ${nc_exit} -eq 0 ]; then - echo "a process is already listening on the default port" - echo "please choose another port with --port=x" - echo "suman-daemon may already be running - check with 'ps aux | grep suman-daemon'" - exit 1; +else + pkill -f suman-daemon # kill any existing suman-daemon process fi + # we use supervisor, so do not need to force kill # we have to use the global version, # because otherwise we would not know which suman installation to pre-load -mkdir -p ~/.suman/global -mkdir -p ~/.suman/logs - +mkdir -p "$HOME/.suman/global" +mkdir -p "$HOME/.suman/logs" NPM_ROOT_GLOBAL="$(npm root -g)"; -export NODE_PATH=${NODE_PATH}:"~/.suman/global/node_modules" -export PATH="~/.suman/global/node_modules/.bin":"${NPM_ROOT_GLOBAL}/suman-daemon/node_modules/.bin":${PATH} +export NODE_PATH=${NODE_PATH}:"$HOME/.suman/global/node_modules" +export PATH="$HOME/.suman/global/node_modules/.bin":"${NPM_ROOT_GLOBAL}/suman-daemon/node_modules/.bin":${PATH} export SUMAN_LIBRARY_ROOT_PATH="${NPM_ROOT_GLOBAL}/suman"; -WHICH_FOREVER=$(which forever); +WHICH_FOREVER="$(which forever)"; if [[ -z ${WHICH_FOREVER} ]]; then - (cd ~/.suman/global && npm install forever) + (cd "$HOME/.suman/global" && npm install forever) fi if [[ -L "${NPM_ROOT_GLOBAL}/suman" || -d "${NPM_ROOT_GLOBAL}/suman" ]]; then @@ -52,25 +53,26 @@ if [[ -L "${NPM_ROOT_GLOBAL}/suman" || -d "${NPM_ROOT_GLOBAL}/suman" ]]; then else # we need to install suman globally so that suman-daemon always pre-loads the same version of suman echo "suman is not installed globally, we will install suman globally now."; - npm install -g suman + npm install -g suman; fi daemon_log="$HOME/.suman/logs/suman-daemon.log"; -echo "begin of new daemon process" > ${daemon_log}; +echo "beginning of new daemon process" > ${daemon_log}; if [[ -L "${NPM_ROOT_GLOBAL}/suman-daemon" || -d "${NPM_ROOT_GLOBAL}/suman-daemon" ]]; then - echo "found suman-daemon global" - node "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" > ${daemon_log} 2>&1 # & -# forever start "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" --workingDir $(pwd) + echo "found suman-daemon global installation." + echo "now starting suman-daemon..." + node "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" > "${daemon_log}" 2>&1 # & + # forever start "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" --workingDir $(pwd) else echo "installing suman-daemon globally, use --force-local to enforce local installations."; npm install -g suman-daemon && - node "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" > ${daemon_log} 2>&1 #& -# forever start "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" --workingDir $(pwd) + node "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" > "${daemon_log}" 2>&1 #& + # forever start "${NPM_ROOT_GLOBAL}/suman-daemon/index.js" --workingDir $(pwd) fi diff --git a/exp.js b/exp.js index 7bcdf617..96673af5 100644 --- a/exp.js +++ b/exp.js @@ -9,6 +9,8 @@ // console.log(obj[sym2]); // +// hi + console.log('the beginning'); const chai = require('chai'); diff --git a/lib/cli-commands/suman-daemon/index.d.ts b/lib/cli-commands/suman-daemon/index.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/cli-commands/suman-daemon/index.js b/lib/cli-commands/suman-daemon/index.js deleted file mode 100644 index 336c44d9..00000000 --- a/lib/cli-commands/suman-daemon/index.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); -var process = require('suman-browser-polyfills/modules/process'); -var global = require('suman-browser-polyfills/modules/global'); -var fs = require("fs"); -var path = require("path"); -var net = require("net"); -var util = require("util"); -var su = require("suman-utils"); -var residence = require("residence"); -var poolio_1 = require("poolio"); -var JSONStream = require("JSONStream"); -var _suman = global.__suman = (global.__suman || {}); -var port = 9091; -var projectRoot = residence.findProjectRoot(process.cwd()); -var sumanLibRoot = path.resolve(__dirname + '/../../../'); -console.log('project root => ', projectRoot); -console.log('suman lib root => ', sumanLibRoot); -if (!process.stdout.isTTY) { - _suman.logError('process is not a tty, cannot run suman-daemon.'); - process.exit(1); -} -var f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); -try { - fs.writeFileSync(f, String(process.pid)); -} -catch (err) { - _suman.logError('\n', su.getCleanErrorString(err), '\n'); - process.exit(1); -} -_suman.log('suman daemon loaded.'); -var p = new poolio_1.Pool({ - filePath: path.resolve(__dirname + '/start-script.js'), - size: 3, - env: Object.assign({}, process.env, { - SUMAN_LIBRARY_ROOT_PATH: sumanLibRoot, - SUMAN_PROJECT_ROOT: projectRoot - }), - streamStdioAfterDelegation: true, - oneTimeOnly: true, - inheritStdio: false, - resolveWhenWorkerExits: true -}); -p.on('error', function (e) { - _suman.logError('suman-daemon worker pool error => ', su.getCleanErrorString(e)); -}); -var s = net.createServer(function (socket) { - console.log('socket connection made.'); - socket.pipe(JSONStream.parse()).on('data', function (obj) { - console.log('message from ', util.inspect(obj)); - return p.any(obj, { socket: socket }); - }); -}); -s.once('listening', function () { - _suman.log("suman-daemon tcp server listening on port " + port); -}); -s.listen(port); diff --git a/lib/cli-commands/suman-daemon/index.ts b/lib/cli-commands/suman-daemon/index.ts deleted file mode 100644 index 635daf9c..00000000 --- a/lib/cli-commands/suman-daemon/index.ts +++ /dev/null @@ -1,92 +0,0 @@ -'use strict'; - -//dts -import {IGlobalSumanObj} from "suman-types/dts/global"; - -//polyfills -const process = require('suman-browser-polyfills/modules/process'); -const global = require('suman-browser-polyfills/modules/global'); - -//core -import fs = require('fs'); -import path = require('path'); -import * as net from 'net'; -import util = require('util'); - -//npm -import su = require('suman-utils'); -import residence = require('residence'); -import {Pool} from 'poolio'; -import JSONStream = require('JSONStream'); - -//project -const _suman : IGlobalSumanObj = global.__suman = (global.__suman || {}); -const port = 9091; -const projectRoot = residence.findProjectRoot(process.cwd()); -const sumanLibRoot = path.resolve(__dirname + '/../../../'); - -/////////////////////////////////////////////////////////////////////////////////////////////// - -console.log('project root => ', projectRoot); -console.log('suman lib root => ', sumanLibRoot); - -if (!process.stdout.isTTY) { - _suman.logError('process is not a tty, cannot run suman-daemon.'); - process.exit(1); -} - -const f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); - -try { - fs.writeFileSync(f, String(process.pid)); -} -catch (err) { - _suman.logError('\n', su.getCleanErrorString(err), '\n'); - process.exit(1); -} - -_suman.log('suman daemon loaded.'); - -const p = new Pool({ - filePath: path.resolve(__dirname + '/start-script.js'), - size: 3, - env: Object.assign({}, process.env, { - SUMAN_LIBRARY_ROOT_PATH: sumanLibRoot, - SUMAN_PROJECT_ROOT: projectRoot - }), - streamStdioAfterDelegation: true, - oneTimeOnly: true, - inheritStdio: false, - resolveWhenWorkerExits: true -}); - -p.on('error', function (e: Error) { - _suman.logError('suman-daemon worker pool error => ', su.getCleanErrorString(e)); -}); - -const s = net.createServer(function (socket) { - - console.log('socket connection made.'); - - socket.pipe(JSONStream.parse()).on('data', function (obj: Object) { - - console.log('message from ', util.inspect(obj)); - return p.any(obj, {socket}); - }); - -}); - - -s.once('listening', function () { - _suman.log(`suman-daemon tcp server listening on port ${port}`); -}); - -s.listen(port); - - - - - - - - diff --git a/lib/cli-commands/suman-daemon/index1.d.ts b/lib/cli-commands/suman-daemon/index1.d.ts deleted file mode 100755 index 5e66c1bf..00000000 --- a/lib/cli-commands/suman-daemon/index1.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare const run: (projectRoot: string, sumanLibRoot: string, cb: Function) => any; -export declare const run2: (projectRoot: string, cb: Function) => any; -export declare const run3: (projectRoot: string, sumanLibRoot: string, cb: Function) => any; diff --git a/lib/cli-commands/suman-daemon/index1.js b/lib/cli-commands/suman-daemon/index1.js deleted file mode 100755 index d052f646..00000000 --- a/lib/cli-commands/suman-daemon/index1.js +++ /dev/null @@ -1,152 +0,0 @@ -'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); -var process = require('suman-browser-polyfills/modules/process'); -var global = require('suman-browser-polyfills/modules/global'); -var fs = require("fs"); -var path = require("path"); -var net = require("net"); -var util = require("util"); -var poolio_1 = require("poolio"); -var JSONStream = require("JSONStream"); -console.log('starting this thing.'); -exports.run = function (projectRoot, sumanLibRoot, cb) { - if (process.argv.indexOf('--daemon') < 1) { - console.log('not a daemon process.'); - return process.nextTick(cb); - } - if (!process.stdout.isTTY) { - return process.nextTick(cb, 'process is not a tty, cannot run suman-daemon.'); - } - var f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); - try { - fs.writeFileSync(f, String(process.pid)); - } - catch (err) { - return process.nextTick(cb, err); - } - console.log('suman daemon loaded.'); - var p = new poolio_1.Pool({ - filePath: path.resolve(__dirname + '/start-script.js'), - size: 3, - env: Object.assign({}, process.env, { - SUMAN_LIBRARY_ROOT_PATH: sumanLibRoot, - SUMAN_PROJECT_ROOT: projectRoot - }), - streamStdioAfterDelegation: true, - oneTimeOnly: true, - inheritStdio: false, - resolveWhenWorkerExits: true - }); - p.on('error', function (e) { - console.error('pool error => ', e.stack || e); - }); - var s = net.createServer(function (socket) { - console.log('socket connection made.'); - socket.pipe(JSONStream.parse()).on('data', function (obj) { - console.log('message from ', util.inspect(obj)); - return p.any(obj, { socket: socket }); - }); - }); - var port = 9091; - s.once('listening', function () { - console.log("suman daemon tcp server listening on port " + port); - }); - s.listen(port); -}; -exports.run2 = function (projectRoot, cb) { - if (process.argv.indexOf('--daemon') < 1) { - console.log('no daemon'); - return process.nextTick(cb); - } - var f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); - try { - fs.writeFileSync(f, String(process.pid)); - } - catch (err) { - return process.nextTick(cb, err); - } - console.log('suman daemon loaded.'); - var p = path.resolve(projectRoot + '/SUMANPIPEIN'); - var fd = fs.openSync(p, fs.constants.O_NONBLOCK | fs.constants.O_RDWR); - var socket = new net.Socket({ fd: fd, readable: true, writable: true }); - socket.on('data', function (d) { - if (String(d).trim() === '[stdin end]') { - console.log('received stdin and stuff.'); - return process.nextTick(cb); - } - console.log('received command line argument => ', d); - process.argv.push(String(d).trim()); - }); - var pkg = require('../../../package.json'); - Object.keys(pkg.dependencies).forEach(function (name) { - try { - require(name); - } - catch (err) { - console.error(err.message); - } - }); -}; -exports.run3 = function (projectRoot, sumanLibRoot, cb) { - if (process.argv.indexOf('--daemon') < 1) { - console.log('not a daemon process.'); - return process.nextTick(cb); - } - if (!process.stdout.isTTY) { - return process.nextTick(cb, 'process is not a tty, cannot run suman-daemon.'); - } - var f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); - try { - fs.writeFileSync(f, String(process.pid)); - } - catch (err) { - return process.nextTick(cb, err); - } - console.log('suman daemon loaded.'); - var p = new poolio_1.Pool({ - filePath: path.resolve(__dirname + '/start-script.js'), - size: 3, - env: Object.assign({}, process.env, { - SUMAN_LIBRARY_ROOT_PATH: sumanLibRoot, - SUMAN_PROJECT_ROOT: projectRoot - }), - streamStdioAfterDelegation: true, - oneTimeOnly: true, - inheritStdio: false, - resolveWhenWorkerExits: true, - }); - p.on('error', function (e) { - console.error('pool error => ', e.stack || e); - }); - console.log('listening for stdin...'); - var rawData = ''; - var pid = null; - var file = null; - process.stdin - .setEncoding('utf8') - .resume() - .on('data', function (d) { - console.log(p.getCurrentStats()); - rawData += String(d); - if (rawData.match('stdin-end')) { - var argz = String(rawData).match(/\S+/g); - rawData = ''; - var args = argz.filter(function (item) { - if (item.match('#pid')) { - pid = item.split('#')[0]; - return false; - } - if (item.match('SUMAN_FILE_TO_LOG')) { - file = item.split('#')[0]; - console.log('file in index => ', file); - return false; - } - if (item.match('stdin-end')) { - return false; - } - return true; - }); - return p.any({ args: args, pid: pid }, { file: file }); - } - }); -}; diff --git a/lib/cli-commands/suman-daemon/index1.ts b/lib/cli-commands/suman-daemon/index1.ts deleted file mode 100755 index 9fa1b09c..00000000 --- a/lib/cli-commands/suman-daemon/index1.ts +++ /dev/null @@ -1,230 +0,0 @@ -'use strict'; - -//polyfills -const process = require('suman-browser-polyfills/modules/process'); -const global = require('suman-browser-polyfills/modules/global'); - -//core -import fs = require('fs'); -import path = require('path'); -import * as net from 'net'; -import util = require('util'); - -//npm -import {Pool} from 'poolio'; -import JSONStream = require('JSONStream'); - - -console.log('starting this thing.'); - -/////////////////////////////////////////////// - -export const run = function (projectRoot: string, sumanLibRoot: string, cb: Function) { - - if (process.argv.indexOf('--daemon') < 1) { - console.log('not a daemon process.'); - return process.nextTick(cb); - } - - if(!process.stdout.isTTY){ - return process.nextTick(cb,'process is not a tty, cannot run suman-daemon.'); - } - - const f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); - try { - fs.writeFileSync(f, String(process.pid)); - } - catch (err) { - return process.nextTick(cb, err); - } - - console.log('suman daemon loaded.'); - - const p = new Pool({ - filePath: path.resolve(__dirname + '/start-script.js'), - size: 3, - env: Object.assign({}, process.env, { - SUMAN_LIBRARY_ROOT_PATH: sumanLibRoot, - SUMAN_PROJECT_ROOT: projectRoot - }), - streamStdioAfterDelegation: true, - oneTimeOnly: true, - inheritStdio: false, - resolveWhenWorkerExits: true - }); - - p.on('error', function (e: Error) { - console.error('pool error => ', e.stack || e); - }); - - const s = net.createServer(function(socket){ - - console.log('socket connection made.'); - - socket.pipe(JSONStream.parse()).on('data', function(obj: Object){ - - console.log('message from ',util.inspect(obj)); - - // socket.write('pinnochio'); - return p.any(obj, {socket}); - }); - - }); - - const port = 9091; - - s.once('listening', function(){ - console.log(`suman daemon tcp server listening on port ${port}`); - }); - - s.listen(port); - - - -}; - -export const run2 = function (projectRoot: string, cb: Function) { - - if (process.argv.indexOf('--daemon') < 1) { - console.log('no daemon'); - return process.nextTick(cb); - } - - const f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); - try { - fs.writeFileSync(f, String(process.pid)); - } - catch (err) { - return process.nextTick(cb, err); - } - - console.log('suman daemon loaded.'); - - const p = path.resolve(projectRoot + '/SUMANPIPEIN'); - - const fd = fs.openSync(p, fs.constants.O_NONBLOCK | fs.constants.O_RDWR); - const socket = new net.Socket({fd, readable: true, writable: true}); - - socket.on('data', function (d) { - - if (String(d).trim() === '[stdin end]') { - // done = true; - console.log('received stdin and stuff.'); - // process.stdin.end(); - return process.nextTick(cb); - } - console.log('received command line argument => ', d); - process.argv.push(String(d).trim()); - - }); - - const pkg = require('../../../package.json'); - // pre-load all dependencies - Object.keys(pkg.dependencies).forEach(function (name: string) { - - try { - require(name); - } - catch (err) { - console.error(err.message); - } - - }); - -}; - -export const run3 = function (projectRoot: string, sumanLibRoot: string, cb: Function) { - - if (process.argv.indexOf('--daemon') < 1) { - console.log('not a daemon process.'); - return process.nextTick(cb); - } - - if(!process.stdout.isTTY){ - return process.nextTick(cb,'process is not a tty, cannot run suman-daemon.'); - } - - const f = path.resolve(process.env.HOME + '/.suman/daemon.pid'); - try { - fs.writeFileSync(f, String(process.pid)); - } - catch (err) { - return process.nextTick(cb, err); - } - - console.log('suman daemon loaded.'); - - const p = new Pool({ - filePath: path.resolve(__dirname + '/start-script.js'), - size: 3, - env: Object.assign({}, process.env, { - SUMAN_LIBRARY_ROOT_PATH: sumanLibRoot, - SUMAN_PROJECT_ROOT: projectRoot - }), - streamStdioAfterDelegation: true, - oneTimeOnly: true, - inheritStdio: false, - resolveWhenWorkerExits: true, - // getSharedWritableStream: function () { - // console.log('getting sumanpipeout...2'); - // // const fd = fs.openSync(path.resolve(process.env.HOME + '/.suman/SUMANPIPEOUT'),'r+'); - // // return fs.createWriteStream(null, {fd}) - // // return fs.createWriteStream(path.resolve(process.env.HOME + '/.suman/SUMANPIPEOUT')); - // return fs.createWriteStream(path.resolve(process.env.HOME + '/.suman/somefile.log')); - // } - }); - - p.on('error', function (e: Error) { - console.error('pool error => ', e.stack || e); - }); - - console.log('listening for stdin...'); - - let rawData: string = ''; - let pid: string = null; - let file: string = null; - - process.stdin - .setEncoding('utf8') - .resume() - .on('data', function (d: string) { - - console.log(p.getCurrentStats()); - - rawData += String(d); - - if (rawData.match('stdin-end')) { - - //match all non-whitespace tokens - const argz = String(rawData).match(/\S+/g); - - rawData = ''; - - // console.log('argz => ', argz); - - const args = argz.filter(function (item) { - if (item.match('#pid')) { - pid = item.split('#')[0]; - return false; - } - if(item.match('SUMAN_FILE_TO_LOG')){ - file = item.split('#')[0]; - console.log('file in index => ', file); - return false; - } - if(item.match('stdin-end')){ - // - return false; - } - return true; - }); - - return p.any({args, pid}, {file}); - - } - - }); - -}; - - diff --git a/lib/cli-commands/suman-daemon/start-script.js b/lib/cli-commands/suman-daemon/start-script.js deleted file mode 100755 index c0d557a9..00000000 --- a/lib/cli-commands/suman-daemon/start-script.js +++ /dev/null @@ -1,119 +0,0 @@ -const util = require('util'); -const path = require('path'); -const cp = require('child_process'); -const fs = require('fs'); - -const sumanIndex = process.env['SUMAN_LIBRARY_ROOT_PATH']; -const sumanProjectRoot = process.env['SUMAN_PROJECT_ROOT']; - -process.on('message', function (msg) { - - const _suman = global.__suman = (global.__suman || {}); - - _suman.absoluteLastHook = function () { - try { - cp.execSync(`kill -INT ${msg.msg.pid}`) - } - catch (err) { - console.error(err.message); - } - }; - - msg.msg.args.forEach(function (a) { - process.argv.push(a); - }); - - console.log(util.inspect(msg)); - - process.argv.push('--force-inception-level-zero'); - process.env.SUMAN_EXTRANEOUS_EXECUTABLE = 'yes'; - // require(path.resolve(process.env.HOME + '/WebstormProjects/oresoftware/sumanjs/suman/test/regexp.js')); - // require(path.resolve(process.env.HOME + '/WebstormProjects/oresoftware/sumanjs/suman/test/regexp.js')); - require(path.resolve(sumanIndex + '/cli.js')); - -}); - -const sumanFilesToLoad = [ - 'lib/index.js', - 'lib/exec-suite.js', - 'lib/suman.js' -]; - -process.once('SIGINT', function () { - console.log('SIGINT received by suman-d.'); - process.exit(1); -}); - -fs.readdirSync(path.resolve(sumanIndex + '/lib/test-suite-helpers')) -.filter(v => String(v).endsWith('.js')) -.forEach(function (item) { - sumanFilesToLoad.push(`lib/test-suite-helpers/${item}`); -}); - -fs.readdirSync(path.resolve(sumanIndex + '/lib/test-suite-methods')) -.filter(v => String(v).endsWith('.js')) -.forEach(function (item) { - sumanFilesToLoad.push(`lib/test-suite-methods/${item}`); -}); - -fs.readdirSync(path.resolve(sumanIndex + '/lib/injection')) -.filter(v => String(v).endsWith('.js')) -.forEach(function (item) { - sumanFilesToLoad.push(`lib/injection/${item}`); -}); - -fs.readdirSync(path.resolve(sumanIndex + '/lib/helpers')) -.filter(v => String(v).endsWith('.js')) -.forEach(function (item) { - sumanFilesToLoad.push(`lib/helpers/${item}`); -}); - -fs.readdirSync(path.resolve(sumanIndex + '/lib/index-helpers')) -.filter(v => String(v).endsWith('.js')) -.forEach(function (item) { - sumanFilesToLoad.push(`lib/index-helpers/${item}`); -}); - -fs.readdirSync(path.resolve(sumanIndex + '/lib/acquire-dependencies')) -.filter(v => String(v).endsWith('.js')) -.forEach(function (item) { - sumanFilesToLoad.push(`lib/acquire-dependencies/${item}`); -}); - -try { - require(path.resolve(sumanProjectRoot + '/suman.conf.js')); -} -catch (err) { - console.error(err.message); -} - -const pkgJSON = require(path.resolve(sumanIndex + '/package.json')); - -sumanFilesToLoad.forEach(function (dep) { - try { - let p = path.resolve(sumanIndex + '/' + dep); - require(p); - } - catch (err) { - console.error(err.message || err); - } -}); - -Object.keys(pkgJSON.dependencies).forEach(function (k) { - try { - // console.log('attempting to load => ', k); - require(k); - // console.log('loaded 1 => ', k); - } - catch (err) { - console.error(err.message || err); - try { - // console.log('attempting to load 2 => ', k); - require(path.resolve(sumanProjectRoot + '/node_modules/' + k)); - console.log('loaded 2 => ', k); - } - catch (err) { - console.error(err.message || err); - } - } -}); diff --git a/package.json b/package.json index 631aadfe..4925455c 100644 --- a/package.json +++ b/package.json @@ -97,9 +97,7 @@ "@types/node": "^7.0.29", "@types/socket.io": "^1.4.29", "@types/socket.io-client": "^1.4.29", - "babel-loader": "^6.4.1", - "babel-polyfill": "^6.23.0", - "babel-preset-latest": "^6.24.0", + "bluebird": "^3.4.7", "browserify-fs": "^1.0.0", "ignore-loader": "^0.1.2", diff --git a/suman-todos.txt b/suman-todos.txt index c62d191b..f5e27972 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -10,6 +10,16 @@ three SO profiles: => should run the script that's in suman.conf.js +/// + + babel: + + removed these from {package.json}.devDependencies: + + "babel-loader": "^6.4.1", + "babel-polyfill": "^6.23.0", + "babel-preset-latest": "^6.24.0", + /// => wrapErrorFirst should also trap errors with try/catch just like wrap? diff --git "a/\342\210\206open-suman-home.sh" "b/\342\210\206open-suman-home.sh" new file mode 100755 index 00000000..dcb07ca6 --- /dev/null +++ "b/\342\210\206open-suman-home.sh" @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +subl "$HOME/.suman"; From 9edd2a1ac59ebd988cfb391a8fa770dec8a27785 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 23:18:10 -0700 Subject: [PATCH 11/32] pdev:set --- .npmignore | 1 + cli/suman-daemon.sh | 2 +- cli/suman-f.sh | 2 +- exp.js | 43 +-------- lib/exec-suite.ts | 2 +- lib/helpers/load-reporters-last-ditch.js | 3 +- lib/helpers/load-reporters-last-ditch.ts | 9 +- lib/helpers/load-reporters.js | 1 - lib/helpers/load-reporters.ts | 16 ++-- lib/index-helpers/socketio-child-client.d.ts | 1 + lib/runner-helpers/handle-fatal-message.d.ts | 1 + lib/runner-helpers/handle-integrant-info.d.ts | 1 + lib/runner-helpers/socket-cp-hash.d.ts | 1 + lib/runner-helpers/socketio-server.d.ts | 1 + lib/test-suite-helpers/make-start-suite.js | 2 +- lib/test-suite-helpers/make-start-suite.ts | 2 +- lib/test-suite-methods/make-after.js | 3 + lib/test-suite-methods/make-after.ts | 3 + suman-todos.txt | 9 ++ suman.conf.js | 2 +- test/_suman/gantt-4.html | 2 +- test/src/dev/browser/README.md | 2 + test/src/dev/node/1.test.js | 12 +++ test/src/dev/node/2.test.js | 93 +++++++++++++++++++ test/src/dev/node/README.md | 2 + tsconfig.json | 12 +-- 26 files changed, 158 insertions(+), 70 deletions(-) create mode 100644 test/src/dev/browser/README.md create mode 100644 test/src/dev/node/2.test.js create mode 100644 test/src/dev/node/README.md diff --git a/.npmignore b/.npmignore index 204b3966..edbe0580 100755 --- a/.npmignore +++ b/.npmignore @@ -18,6 +18,7 @@ test/ dist/ ### files +exp.js .gitignore .github .npmignore diff --git a/cli/suman-daemon.sh b/cli/suman-daemon.sh index 00b23bc8..729340f6 100755 --- a/cli/suman-daemon.sh +++ b/cli/suman-daemon.sh @@ -20,6 +20,7 @@ if [[ "$1" != "--force" ]]; then echo "a process is already listening on the default port" echo "please choose another port with --port=x" echo "suman-daemon may already be running - check with 'ps aux | grep suman-daemon'" + echo "otherwise, use '$ suman-daemon --force'." exit 1; fi @@ -28,7 +29,6 @@ else fi - # we use supervisor, so do not need to force kill # we have to use the global version, # because otherwise we would not know which suman installation to pre-load diff --git a/cli/suman-f.sh b/cli/suman-f.sh index e1434b07..28d3338b 100755 --- a/cli/suman-f.sh +++ b/cli/suman-f.sh @@ -10,7 +10,7 @@ fi mkdir -p "${HOME}/.suman/global" mkdir -p "${HOME}/.suman/logs" -trap 'echo " (note that your test ran with suman-f, not suman) "; echo ""' INT +trap 'echo ""; echo " (note that your test ran with suman-f, not suman) "; echo "";' INT BASH_PID="$$" diff --git a/exp.js b/exp.js index 96673af5..719ab1da 100644 --- a/exp.js +++ b/exp.js @@ -11,45 +11,6 @@ // hi +const path = require('path'); -console.log('the beginning'); -const chai = require('chai'); -const chaiAssert = chai.assert; - -const assrt = function() { - try { - return chaiAssert.apply(chaiAssert, arguments); - } catch (e) { - return console.error(e); - } -}; - -const v = {}; -v.assert = new Proxy(assrt, { - get: function(target, prop) { - - if (typeof prop === 'symbol') { - return Reflect.get(...arguments); - } - - - return function() { - try { - return chaiAssert[prop].apply(chaiAssert, arguments); - } catch (e) { - console.error(`Looks like property '${prop}' does not exist on chai assert object.`) - return console.error(e); - } - } - } -}); - -console.log('v => ',v); // in Node.js, this kind of call will cause the issue whereby ghost properties are sent -// to the get method of the Proxy. - -JSON.stringify(v); - -// but we can see that Proxy works here: -v.assert.equal(true,true,'whoops nope'); - -console.log('the end'); +console.error(`${path.basename(__dirname)} reporter may be unable to properly indent output.`); diff --git a/lib/exec-suite.ts b/lib/exec-suite.ts index f5b4c759..8b4f1237 100755 --- a/lib/exec-suite.ts +++ b/lib/exec-suite.ts @@ -291,7 +291,7 @@ export const execSuite = function (suman: ISuman): Function { const sumanOpts = _suman.sumanOpts; _suman.currentPaddingCount = _suman.currentPaddingCount || {}; - _suman.currentPaddingCount.val = 1; // always reset to 4... + _suman.currentPaddingCount.val = 1; // always reset function runSuite(suite: ITestSuite, cb: Function) { diff --git a/lib/helpers/load-reporters-last-ditch.js b/lib/helpers/load-reporters-last-ditch.js index ee5c5077..7d4095b6 100755 --- a/lib/helpers/load-reporters-last-ditch.js +++ b/lib/helpers/load-reporters-last-ditch.js @@ -1,5 +1,7 @@ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); +var process = require('suman-browser-polyfills/modules/process'); +var global = require('suman-browser-polyfills/modules/global'); var assert = require("assert"); var EE = require("events"); var su = require("suman-utils"); @@ -16,7 +18,6 @@ exports.run = function () { } _suman.currentPaddingCount = _suman.currentPaddingCount || {}; var optsCopy = Object.assign({}, _suman.sumanOpts); - optsCopy.currPadCount = _suman.currentPaddingCount; if (sumanReporters.length < 1) { var fn = void 0; if (_suman.inceptionLevel > 0 || _suman.sumanOpts.$useTAPOutput || _suman.usingRunner) { diff --git a/lib/helpers/load-reporters-last-ditch.ts b/lib/helpers/load-reporters-last-ditch.ts index d91aff31..0d099c76 100755 --- a/lib/helpers/load-reporters-last-ditch.ts +++ b/lib/helpers/load-reporters-last-ditch.ts @@ -1,6 +1,12 @@ 'use strict'; + +//dts import {IGlobalSumanObj} from "suman-types/dts/global"; +//polyfills +const process = require('suman-browser-polyfills/modules/process'); +const global = require('suman-browser-polyfills/modules/global'); + //core import cp = require('child_process'); import fs = require('fs'); @@ -31,9 +37,8 @@ export const run = function () { } _suman.currentPaddingCount = _suman.currentPaddingCount || {}; - const optsCopy = Object.assign({}, _suman.sumanOpts); // we do not want the user to modify sumanOpts at runtime! so we copy it - optsCopy.currPadCount = _suman.currentPaddingCount; + const optsCopy = Object.assign({}, _suman.sumanOpts); if (sumanReporters.length < 1) { let fn: Function; diff --git a/lib/helpers/load-reporters.js b/lib/helpers/load-reporters.js index b38fe282..6fa6c114 100755 --- a/lib/helpers/load-reporters.js +++ b/lib/helpers/load-reporters.js @@ -20,7 +20,6 @@ exports.loadReporters = function (sumanOpts, projectRoot, sumanConfig) { loaded = true; _suman.currentPaddingCount = _suman.currentPaddingCount || {}; var optsCopy = Object.assign({}, sumanOpts); - optsCopy.currPadCount = _suman.currentPaddingCount; var sumanReporters = _suman.sumanReporters = _.flattenDeep([sumanOpts.reporter_paths || []]) .filter(function (v) { if (!v) { diff --git a/lib/helpers/load-reporters.ts b/lib/helpers/load-reporters.ts index 150b08d8..5328f8e6 100755 --- a/lib/helpers/load-reporters.ts +++ b/lib/helpers/load-reporters.ts @@ -1,5 +1,7 @@ 'use strict'; -import {ISumanConfig, ISumanOpts} from "suman-types/dts/global"; + +//dts +import {ISumanConfig, ISumanOpts, IGlobalSumanObj} from "suman-types/dts/global"; //polyfills const process = require('suman-browser-polyfills/modules/process'); @@ -20,7 +22,7 @@ import {events} from 'suman-events'; import * as _ from 'lodash'; //project -const _suman = global.__suman = (global.__suman || {}); +const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); const reporterRets = _suman.reporterRets = (_suman.reporterRets || []); let loaded = false; @@ -37,7 +39,6 @@ export const loadReporters = function (sumanOpts: ISumanOpts, projectRoot: strin _suman.currentPaddingCount = _suman.currentPaddingCount || {}; const optsCopy = Object.assign({}, sumanOpts); - optsCopy.currPadCount = _suman.currentPaddingCount; const sumanReporters = _suman.sumanReporters = _.flattenDeep([sumanOpts.reporter_paths || []]) .filter(v => { @@ -45,7 +46,8 @@ export const loadReporters = function (sumanOpts: ISumanOpts, projectRoot: strin _suman.logWarning('a reporter path was undefined.'); } return v; - }).map(function (item: string) { + }) + .map(function (item: string) { if (!path.isAbsolute(item)) { item = path.resolve(projectRoot + '/' + item); } @@ -116,20 +118,18 @@ export const loadReporters = function (sumanOpts: ISumanOpts, projectRoot: strin } } - try{ + try { fn = fn.default || fn; assert(typeof fn === 'function', 'reporter module does not export a function, at path = "' + val + '"'); fn.pathToReporter = val; // val might not refer to a path... sumanReporters.push(fn); } - catch(err){ + catch (err) { throw new Error(chalk.red('Could not load reporter with name => "' + item + '"') + '\n => ' + (err.stack || err) + '\n'); } - - }); if (process.env.SUMAN_INCEPTION_LEVEL > 0 || sumanOpts.$useTAPOutput) { diff --git a/lib/index-helpers/socketio-child-client.d.ts b/lib/index-helpers/socketio-child-client.d.ts index d917b32d..0ac7374a 100755 --- a/lib/index-helpers/socketio-child-client.d.ts +++ b/lib/index-helpers/socketio-child-client.d.ts @@ -1 +1,2 @@ +/// export declare const getClient: () => SocketIOClient.Socket; diff --git a/lib/runner-helpers/handle-fatal-message.d.ts b/lib/runner-helpers/handle-fatal-message.d.ts index f64152fb..544d17cb 100755 --- a/lib/runner-helpers/handle-fatal-message.d.ts +++ b/lib/runner-helpers/handle-fatal-message.d.ts @@ -1,2 +1,3 @@ +/// import { ISumanChildProcess } from "suman-types/dts/runner"; export declare const handleFatalMessage: ($msg: Object, n: ISumanChildProcess, socket: SocketIOClient.Socket) => void; diff --git a/lib/runner-helpers/handle-integrant-info.d.ts b/lib/runner-helpers/handle-integrant-info.d.ts index a2e71c58..76469533 100755 --- a/lib/runner-helpers/handle-integrant-info.d.ts +++ b/lib/runner-helpers/handle-integrant-info.d.ts @@ -1,3 +1,4 @@ +/// import { IRunnerObj, ISumanChildProcess } from "suman-types/dts/runner"; import { IIntegrantHash } from "../runner"; export declare const makeHandleIntegrantInfo: (runnerObj: IRunnerObj, allOncePostKeys: string[][], integrantHashKeyVals: IIntegrantHash) => (msg: Object, n: ISumanChildProcess, s: SocketIOClient.Socket) => any; diff --git a/lib/runner-helpers/socket-cp-hash.d.ts b/lib/runner-helpers/socket-cp-hash.d.ts index 86cb012f..c2ea2234 100755 --- a/lib/runner-helpers/socket-cp-hash.d.ts +++ b/lib/runner-helpers/socket-cp-hash.d.ts @@ -1,3 +1,4 @@ +/// import { ISumanChildProcess } from "suman-types/dts/runner"; export interface ICpHash { [key: string]: ISumanChildProcess; diff --git a/lib/runner-helpers/socketio-server.d.ts b/lib/runner-helpers/socketio-server.d.ts index 547829ba..430b91a4 100755 --- a/lib/runner-helpers/socketio-server.d.ts +++ b/lib/runner-helpers/socketio-server.d.ts @@ -1,2 +1,3 @@ +/// export declare const initializeSocketServer: (cb: Function) => void; export declare const getSocketServer: () => SocketIO.Server; diff --git a/lib/test-suite-helpers/make-start-suite.js b/lib/test-suite-helpers/make-start-suite.js index 9eb0ce5c..20c5f22d 100755 --- a/lib/test-suite-helpers/make-start-suite.js +++ b/lib/test-suite-helpers/make-start-suite.js @@ -17,7 +17,7 @@ exports.makeStartSuite = function (suman, gracefulExit, handleBeforesAndAfters, var runTheTrap = makeTheTrap(suman, gracefulExit); var sumanOpts = _suman.sumanOpts, sumanConfig = _suman.sumanConfig; if (sumanOpts.series) { - console.log('\n', su.padWithXSpaces(_suman.currentPaddingCount.val), chalk.underline('▽ ' + chalk.gray.bold.italic(self.desc))); + console.log('\n', su.padWithXSpaces(_suman.currentPaddingCount.val), chalk.underline.gray.bold.italic("\u25B6 " + self.desc + " \u25B7 ")); } if (suman.describeOnlyIsTriggered && !this.only) { this.skippedDueToOnly = this.skipped = true; diff --git a/lib/test-suite-helpers/make-start-suite.ts b/lib/test-suite-helpers/make-start-suite.ts index dfc16219..75b37083 100755 --- a/lib/test-suite-helpers/make-start-suite.ts +++ b/lib/test-suite-helpers/make-start-suite.ts @@ -46,7 +46,7 @@ export const makeStartSuite = function (suman: ISuman, gracefulExit: Function, h if (sumanOpts.series) { console.log('\n', su.padWithXSpaces(_suman.currentPaddingCount.val), - chalk.underline('▽ ' + chalk.gray.bold.italic(self.desc))); + chalk.underline.gray.bold.italic(`▶ ${self.desc} ▷ `)); } //TODO: if a child describe is only, but the parent is not, then we still need to run hooks for parent diff --git a/lib/test-suite-methods/make-after.js b/lib/test-suite-methods/make-after.js index 00d3e176..993956d2 100755 --- a/lib/test-suite-methods/make-after.js +++ b/lib/test-suite-methods/make-after.js @@ -20,6 +20,9 @@ var acceptableOptions = { skip: true, always: true, last: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; var handleBadOptions = function (opts) { diff --git a/lib/test-suite-methods/make-after.ts b/lib/test-suite-methods/make-after.ts index 6e737a6f..2c32ff8f 100755 --- a/lib/test-suite-methods/make-after.ts +++ b/lib/test-suite-methods/make-after.ts @@ -36,6 +36,9 @@ const acceptableOptions = { skip: true, always: true, last: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; diff --git a/suman-todos.txt b/suman-todos.txt index f5e27972..31178bc1 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -10,6 +10,11 @@ three SO profiles: => should run the script that's in suman.conf.js +/// + + the following should be in yellow or magenta: + (note that your test ran with suman-f, not suman) + /// babel: @@ -28,6 +33,10 @@ three SO profiles: options should have "successEvents", "errorEvents" +/// + + before / beforeEach hooks should attach a value to suman.$inject if a value is returned + /// // after always may not be run in the right order diff --git a/suman.conf.js b/suman.conf.js index 485181b0..bd9f8723 100755 --- a/suman.conf.js +++ b/suman.conf.js @@ -18,7 +18,7 @@ module.exports = Object.freeze({ //string testDir: 'test', - testSrcDir: 'test/src', + testSrcDir: 'test/src/dev/node', testTargetDir: 'test/target', sumanHelpersDir: 'test/_suman', uniqueAppName: '', diff --git a/test/_suman/gantt-4.html b/test/_suman/gantt-4.html index ee2a234f..2a71c388 100644 --- a/test/_suman/gantt-4.html +++ b/test/_suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506813880270,"endDate":1506813881770,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/exp.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506838641224,"endDate":1506838641753,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1506838641218,"endDate":1506838641761,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"}]'); let tasks = []; diff --git a/test/src/dev/browser/README.md b/test/src/dev/browser/README.md new file mode 100644 index 00000000..8c1b9461 --- /dev/null +++ b/test/src/dev/browser/README.md @@ -0,0 +1,2 @@ + +# These are the basic browser tests used for "TDD" when developing Suman itself. diff --git a/test/src/dev/node/1.test.js b/test/src/dev/node/1.test.js index 97bfeaca..20fecb76 100644 --- a/test/src/dev/node/1.test.js +++ b/test/src/dev/node/1.test.js @@ -34,6 +34,10 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa h.assert.equal(count, 2); }); + it('sync test', t => { + assert(true); + }); + after(h => { count++; h.assert.equal(count, 5); @@ -43,6 +47,10 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa assert.equal(count, 0); + it('sync test', t => { + assert(true); + }); + before(h => { count++; h.assert.equal(count, 3); @@ -66,6 +74,10 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa h.assert.equal(count, 6); }); + it('sync test', t => { + assert(true); + }); + }); after.last('roomy', h => { diff --git a/test/src/dev/node/2.test.js b/test/src/dev/node/2.test.js new file mode 100644 index 00000000..20fecb76 --- /dev/null +++ b/test/src/dev/node/2.test.js @@ -0,0 +1,93 @@ +#!/usr/bin/env node +'use strict'; + +const suman = require('suman'); +const Test = suman.init(module); + +/////////////////////////////////////////////////////////////////////// + +let count = 0; +const opts = {series: true, fixed: true}; + + +Test.create(opts, function (assert, describe, before, beforeEach, after, afterEach, it) { + + + it('sync test', t => { + assert(true); + }); + + before(h => { + count++; + h.assert.equal(count, 1); + }); + + + describe('nested1', () => { + + // console.log('before => ', before); + + assert.equal(count, 0); + + before(h => { + count++; + h.assert.equal(count, 2); + }); + + it('sync test', t => { + assert(true); + }); + + after(h => { + count++; + h.assert.equal(count, 5); + }); + + describe('nested2', () => { + + assert.equal(count, 0); + + it('sync test', t => { + assert(true); + }); + + before(h => { + count++; + h.assert.equal(count, 3); + }); + + after(h => { + count++; + h.assert.equal(count, 4); + }); + + }); + + }); + + describe('nested3', () => { + + assert.equal(count, 0); + + before('zoomy', h => { + count++; + h.assert.equal(count, 6); + }); + + it('sync test', t => { + assert(true); + }); + + }); + + after.last('roomy', h => { + count++; + h.assert.equal(count, 8); + }); + + after.always('roomy', h => { + count++; + h.assert.equal(count, 7); + }); + +}); diff --git a/test/src/dev/node/README.md b/test/src/dev/node/README.md new file mode 100644 index 00000000..3eedcb58 --- /dev/null +++ b/test/src/dev/node/README.md @@ -0,0 +1,2 @@ + +# These are the basic Node.js tests used for "TDD" when developing Suman itself. diff --git a/tsconfig.json b/tsconfig.json index 6451a258..6dd8fd4f 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,16 +3,8 @@ "declaration": true, "baseUrl": ".", "typeRoots": [ - "./node_modules/@types", - "./node_modules/suman-types/dts", - "./node_modules/suman-types/dts/*", - "./node_modules/suman-types" - ], - "types": [ - "node", - "async", - "lodash", - "chai" + "node_modules/@types", + "node_modules/suman-types/dts" ], "allowJs": false, "target": "es5", From 18557c6cae8293fc0a948edac8f3998d8b559a2b Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 23:28:21 -0700 Subject: [PATCH 12/32] pdev:set --- .npmignore | 9 +++++---- lib/exec-suite.ts | 15 ++++++++------- suman-todos.txt | 4 ++++ test/_suman/gantt-4.html | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.npmignore b/.npmignore index edbe0580..dd826f83 100755 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,5 @@ -### all files + +### matching files *.sh *.ts *.md @@ -8,7 +9,7 @@ *.yml *.DS_Store -### directories +### folders .idea node_modules coverage/ @@ -16,17 +17,17 @@ coverage/ yarn.lock test/ dist/ +.github +.tscmultiwatch ### files exp.js .gitignore -.github .npmignore webpack.config.js .gitattributes suman.conf.js .editorconfig -.tscmultiwatch .babelrc .dockerignore diff --git a/lib/exec-suite.ts b/lib/exec-suite.ts index 8b4f1237..2dd7bf38 100755 --- a/lib/exec-suite.ts +++ b/lib/exec-suite.ts @@ -2,7 +2,7 @@ //dts import {ITestSuite} from "suman-types/dts/test-suite"; -import {IGlobalSumanObj, IPseudoError, ISumanDomain} from "suman-types/dts/global"; +import {IGlobalSumanObj, IPseudoError, ISumanDomain, ICurrentPaddingCount} from "suman-types/dts/global"; import {ISuman, Suman} from "./suman"; import {ICreateOpts, TCreateHook} from "suman-types/dts/index-init"; import {IInjectionDeps} from "suman-types/dts/injection"; @@ -290,8 +290,9 @@ export const execSuite = function (suman: ISuman): Function { const sumanOpts = _suman.sumanOpts; - _suman.currentPaddingCount = _suman.currentPaddingCount || {}; - _suman.currentPaddingCount.val = 1; // always reset + const currentPaddingCount = _suman.currentPaddingCount + = (_suman.currentPaddingCount || ({} as ICurrentPaddingCount)); + currentPaddingCount.val = 1; // always reset function runSuite(suite: ITestSuite, cb: Function) { @@ -325,16 +326,17 @@ export const execSuite = function (suman: ISuman): Function { return process.nextTick(cb) } - sumanOpts.series && (_suman.currentPaddingCount.val += 3); + sumanOpts.series && (currentPaddingCount.val += 3); async.eachLimit(children, limit, function (child: ITestSuite, cb: Function) { + // this could be reduced, but leave it for clarity runSuite(child, cb); }, function (err: IPseudoError) { - sumanOpts.series && (_suman.currentPaddingCount.val -= 3); - err && _suman.logError('Suman implementation error => ', err.stack || err); + sumanOpts.series && (currentPaddingCount.val -= 3); + err && _suman.logError('Suman implementation error:', err.stack || err); process.nextTick(cb); }); @@ -355,7 +357,6 @@ export const execSuite = function (suman: ISuman): Function { if (sumanOpts.parallel_max) { suman.getQueue().drain = function () { - debugger; onSumanCompleted(0, null); } } diff --git a/suman-todos.txt b/suman-todos.txt index 31178bc1..8e10106b 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -4,6 +4,10 @@ three SO profiles: 2. via facebook login on chrome 3. the1mills@yahoo.com on firefox "Olegzandr Denman" +/// + + the runner hangs every few runs, there must be a race condition + /// suman --scripts abc diff --git a/test/_suman/gantt-4.html b/test/_suman/gantt-4.html index 2a71c388..b22e3e6f 100644 --- a/test/_suman/gantt-4.html +++ b/test/_suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506838641224,"endDate":1506838641753,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1506838641218,"endDate":1506838641761,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506839298100,"endDate":1506839298612,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506839298096,"endDate":1506839298609,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; From b7e2c9d30eaabea5ab4e65f885b5d455bb29c34b Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 23:39:16 -0700 Subject: [PATCH 13/32] pdev:set --- .gitignore | 2 + package-lock.json | 6076 --------------------------------------------- suman-todos.txt | 15 + 3 files changed, 17 insertions(+), 6076 deletions(-) delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 6d0d99d9..d851e57a 100755 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,6 @@ coverage/ *.log ### files +package-lock.json +yarn.lock *.DS_Store diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 34ff8f3e..00000000 --- a/package-lock.json +++ /dev/null @@ -1,6076 +0,0 @@ -{ - "name": "suman", - "version": "1.1.512245", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/async": { - "version": "2.0.42", - "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.42.tgz", - "integrity": "sha512-rmsnoIPcAHn9k0HtBktG0vFQIJlQQvLofo70pWly8itQzqG5c/ILSZqmXLsCdJpT1X5wpxO0F3rb3GB5xCiDAA==", - "dev": true - }, - "@types/chai": { - "version": "https://registry.npmjs.org/@types/chai/-/chai-4.0.4.tgz", - "integrity": "sha1-/oYxXZpmgn/usW9zvJVGiOyVDhg=", - "dev": true - }, - "@types/chalk": { - "version": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", - "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=", - "dev": true - }, - "@types/core-js": { - "version": "0.9.43", - "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-0.9.43.tgz", - "integrity": "sha512-Y11dktBJ5YwKXX8DfHSb9V6shXKSHN5P2URPZLHTRjX3OsO/u8u1kZnSJvsuSH74aTg8f5ZKcpEeCdIJOcBkHg==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.74", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.74.tgz", - "integrity": "sha512-BZknw3E/z3JmCLqQVANcR17okqVTPZdlxvcIz0fJiJVLUCbSH1hK3zs9r634PVSmrzAxN+n/fxlVRiYoArdOIQ==", - "dev": true - }, - "@types/node": { - "version": "7.0.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.43.tgz", - "integrity": "sha512-7scYwwfHNppXvH/9JzakbVxk0o0QUILVk1Lv64GRaxwPuGpnF1QBiwdvhDpLcymb8BpomQL3KYoWKq3wUdDMhQ==", - "dev": true - }, - "@types/socket.io": { - "version": "https://registry.npmjs.org/@types/socket.io/-/socket.io-1.4.30.tgz", - "integrity": "sha1-jSflle1Ij4CuR1zuphKir9PyIQY=", - "dev": true, - "requires": { - "@types/node": "7.0.43" - } - }, - "@types/socket.io-client": { - "version": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.30.tgz", - "integrity": "sha1-p21aFzit7YiJxhK/5/U/O1KYv8M=", - "dev": true - }, - "abstract-leveldown": { - "version": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "dev": true, - "requires": { - "xtend": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" - }, - "dependencies": { - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "accepts": { - "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "requires": { - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" - } - }, - "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", - "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", - "dev": true - }, - "acorn-dynamic-import": { - "version": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" - }, - "dependencies": { - "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "after": { - "version": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - } - }, - "ajv-keywords": { - "version": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "3.2.2", - "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-256-colors": { - "version": "https://registry.npmjs.org/ansi-256-colors/-/ansi-256-colors-1.1.0.tgz", - "integrity": "sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "dev": true, - "requires": { - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "micromatch": "2.3.11" - } - }, - "argparse": { - "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz" - } - }, - "arr-flatten": { - "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arraybuffer.slice": { - "version": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" - }, - "arrify": { - "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "ascii-table": { - "version": "https://registry.npmjs.org/ascii-table/-/ascii-table-0.0.9.tgz", - "integrity": "sha1-BqZgTWpV1L9BqaR9mHLXp42jHnM=" - }, - "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "asn1.js": { - "version": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" - } - }, - "assert": { - "version": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz" - } - }, - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=" - }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "4.17.4" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "asynckit": { - "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws4": { - "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-call-delegate": { - "version": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-define-map": { - "version": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", - "dev": true, - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "lodash": "4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-function-name": { - "version": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-get-function-arity": { - "version": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-hoist-variables": { - "version": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-optimise-call-expression": { - "version": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-regex": { - "version": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "lodash": "4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-replace-supers": { - "version": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-loader": { - "version": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", - "dev": true, - "requires": { - "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } - }, - "babel-messages": { - "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "babel-plugin-syntax-async-functions": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-helper-optimise-call-expression": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "babel-helper-get-function-arity": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "regexpu-core": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "babel-plugin-syntax-exponentiation-operator": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-regenerator": { - "version": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", - "dev": true, - "requires": { - "regenerator-transform": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" - }, - "dependencies": { - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - } - } - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - } - } - }, - "babel-preset-es2015": { - "version": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "babel-plugin-transform-es2015-arrow-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "babel-plugin-transform-es2015-block-scoped-functions": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "babel-plugin-transform-es2015-block-scoping": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "babel-plugin-transform-es2015-classes": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "babel-plugin-transform-es2015-computed-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "babel-plugin-transform-es2015-destructuring": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "babel-plugin-transform-es2015-duplicate-keys": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "babel-plugin-transform-es2015-for-of": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "babel-plugin-transform-es2015-function-name": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "babel-plugin-transform-es2015-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "babel-plugin-transform-es2015-modules-amd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "babel-plugin-transform-es2015-modules-commonjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "babel-plugin-transform-es2015-modules-systemjs": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "babel-plugin-transform-es2015-modules-umd": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "babel-plugin-transform-es2015-object-super": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "babel-plugin-transform-es2015-parameters": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "babel-plugin-transform-es2015-shorthand-properties": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "babel-plugin-transform-es2015-spread": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "babel-plugin-transform-es2015-sticky-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "babel-plugin-transform-es2015-template-literals": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "babel-plugin-transform-es2015-typeof-symbol": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "babel-plugin-transform-es2015-unicode-regex": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "babel-plugin-transform-regenerator": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz" - } - }, - "babel-preset-es2016": { - "version": "https://registry.npmjs.org/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz", - "integrity": "sha1-+QC/k+LrwNJ235uKtZck6/2Vn4s=", - "dev": true, - "requires": { - "babel-plugin-transform-exponentiation-operator": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz" - } - }, - "babel-preset-es2017": { - "version": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz", - "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "babel-plugin-transform-async-to-generator": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz" - } - }, - "babel-preset-latest": { - "version": "https://registry.npmjs.org/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz", - "integrity": "sha1-Z33gaRVKdIXC0lxXfAL2JLhbheg=", - "dev": true, - "requires": { - "babel-preset-es2015": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "babel-preset-es2016": "https://registry.npmjs.org/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz", - "babel-preset-es2017": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz" - } - }, - "babel-runtime": { - "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "dev": true, - "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" - } - }, - "babel-template": { - "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.3.tgz", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "dev": true, - "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.3.tgz", - "debug": "2.6.8", - "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "4.17.4" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "babel-types": { - "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "4.17.4", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } - }, - "babylon": { - "version": "https://registry.npmjs.org/babylon/-/babylon-6.17.3.tgz", - "integrity": "sha1-EyfXCZULVY8gTlNSWH/QKQ+Njkg=", - "dev": true - }, - "backo2": { - "version": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-arraybuffer": { - "version": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "base64-js": { - "version": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", - "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", - "dev": true - }, - "base64id": { - "version": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "better-assert": { - "version": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" - } - }, - "big.js": { - "version": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", - "dev": true - }, - "binary-extensions": { - "version": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", - "dev": true - }, - "bl": { - "version": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", - "dev": true, - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "blob": { - "version": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" - }, - "bluebird": { - "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", - "dev": true - }, - "bn.js": { - "version": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - }, - "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "dev": true, - "requires": { - "buffer-xor": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "browserify-cipher": { - "version": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "browserify-des": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" - } - }, - "browserify-des": { - "version": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "des.js": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "browserify-fs": { - "version": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", - "dev": true, - "requires": { - "level-filesystem": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "level-js": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "levelup": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz" - } - }, - "browserify-rsa": { - "version": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "browserify-sign": { - "version": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz" - } - }, - "browserify-zlib": { - "version": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" - } - }, - "buffer": { - "version": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", - "ieee754": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } - }, - "buffer-xor": { - "version": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "callsite": { - "version": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "caseless": { - "version": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "center-align": { - "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" - } - }, - "chai": { - "version": "https://registry.npmjs.org/chai/-/chai-4.0.2.tgz", - "integrity": "sha1-L3MnxN5vOF3XeHmZ4qsCaXoyuDs=", - "requires": { - "assertion-error": "1.0.2", - "check-error": "1.0.2", - "deep-eql": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.3" - } - }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" - }, - "chmodr": { - "version": "https://registry.npmjs.org/chmodr/-/chmodr-1.0.2.tgz", - "integrity": "sha1-BGYrky0PAuxm3qorDqQoEZaOPrk=" - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "async-each": "1.0.1", - "fsevents": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "glob-parent": "2.0.0", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "readdirp": "2.1.0" - } - }, - "cipher-base": { - "version": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" - } - }, - "clone": { - "version": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", - "dev": true - }, - "co": { - "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "requires": { - "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - } - }, - "color-name": { - "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - } - }, - "commondir": { - "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-bind": { - "version": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - } - }, - "console-browserify": { - "version": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" - } - }, - "constants-browserify": { - "version": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "cookie": { - "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-ecdh": { - "version": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz" - } - }, - "create-hash": { - "version": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, - "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" - } - }, - "create-hmac": { - "version": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, - "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" - } - }, - "crypto-browserify": { - "version": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", - "integrity": "sha1-NlKgkGq5sqfgw85mpAjpV6JIVSI=", - "dev": true, - "requires": { - "browserify-cipher": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "browserify-sign": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "create-ecdh": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "diffie-hellman": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "public-encrypt": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "dashdash": { - "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - } - }, - "date-now": { - "version": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-eql": { - "version": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", - "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", - "requires": { - "type-detect": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz" - }, - "dependencies": { - "type-detect": { - "version": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", - "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=" - } - } - }, - "deferred-leveldown": { - "version": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", - "dev": true, - "requires": { - "abstract-leveldown": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz" - } - }, - "delayed-stream": { - "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "des.js": { - "version": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" - } - }, - "diffie-hellman": { - "version": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "miller-rabin": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "domain-browser": { - "version": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "du": { - "version": "https://registry.npmjs.org/du/-/du-0.1.0.tgz", - "integrity": "sha1-8m40CgnHvFtv1pr2263qYPqMb00=", - "requires": { - "async": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" - }, - "dependencies": { - "async": { - "version": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=" - } - } - }, - "duplexify": { - "version": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", - "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", - "requires": { - "end-of-stream": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "stream-shift": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "elliptic": { - "version": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", - "hmac-drbg": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - } - }, - "emojis-list": { - "version": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "end-of-stream": { - "version": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", - "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" - }, - "dependencies": { - "once": { - "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - } - } - }, - "engine.io": { - "version": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.0.tgz", - "integrity": "sha1-XKQ4486f28kVxKIcjdnhJmcG5X4=", - "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "base64id": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "debug": "2.6.8", - "engine.io-parser": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz", - "uws": "0.14.5", - "ws": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-client": { - "version": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz", - "integrity": "sha1-QVqYUrrbFPoAj6PvHjFgjbZ2EyU=", - "requires": { - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "component-inherit": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "debug": "2.6.8", - "engine.io-parser": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz", - "has-cors": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "parsejson": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "parseqs": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "parseuri": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "ws": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "xmlhttprequest-ssl": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "yeast": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "engine.io-parser": { - "version": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz", - "integrity": "sha1-4Ps/DgRi9/WLt3waUun1p+JuRmg=", - "requires": { - "after": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "arraybuffer.slice": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "base64-arraybuffer": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "blob": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "has-binary2": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz" - } - }, - "errno": { - "version": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true, - "requires": { - "prr": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" - } - }, - "error-ex": { - "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - } - }, - "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events": { - "version": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "events-to-array": { - "version": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=" - }, - "evp_bytestokey": { - "version": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "dev": true, - "requires": { - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extend": { - "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-cache-dir": { - "version": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" - } - }, - "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "freeze-existing-props": { - "version": "0.0.1001", - "resolved": "https://registry.npmjs.org/freeze-existing-props/-/freeze-existing-props-0.0.1001.tgz", - "integrity": "sha1-fpMzu+sauu0XAm70/ULgvs/Gyp4=" - }, - "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha1-MoK3E/s62A7eDp/PRhG1qm/AM/Q=", - "dev": true, - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "aproba": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", - "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", - "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", - "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", - "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "function-arguments": { - "version": "https://registry.npmjs.org/function-arguments/-/function-arguments-1.0.8.tgz", - "integrity": "sha1-uaAdrKa4lO/4w9NoQDde2WNqbA8=" - }, - "fwd-stream": { - "version": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", - "dev": true, - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "get-caller-file": { - "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" - }, - "getpass": { - "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - } - }, - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "requires": { - "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" - }, - "dependencies": { - "async": { - "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-binary2": { - "version": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", - "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "hash-base": { - "version": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "hash.js": { - "version": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", - "integrity": "sha1-EzL/ABVsCg/92CNgE9B7d6BFFXM=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "hmac-drbg": { - "version": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - } - }, - "hosted-git-info": { - "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", - "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", - "dev": true - }, - "https-browserify": { - "version": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "idb-wrapper": { - "version": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.1.tgz", - "integrity": "sha1-ajJnASLhc6hOzFz6lmj6LOsiGwQ=", - "dev": true - }, - "ieee754": { - "version": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "ignore-loader": { - "version": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", - "integrity": "sha1-2B8kA3bQuk8Nd4lyw60lh0EXpGM=", - "dev": true - }, - "indexof": { - "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "interpret": { - "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "invariant": { - "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" - } - }, - "invert-kv": { - "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is": { - "version": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", - "dev": true - }, - "is-arrayish": { - "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" - }, - "is-builtin-module": { - "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-object": { - "version": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", - "dev": true - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-typedarray": { - "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isbuffer": { - "version": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } - }, - "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", - "dev": true - }, - "js-yaml": { - "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", - "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", - "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "esprima": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsesc": { - "version": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-loader": { - "version": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", - "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", - "dev": true - }, - "json-schema": { - "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - } - }, - "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "JSONStream": { - "version": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", - "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", - "requires": { - "jsonparse": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.5" - } - }, - "lazy-cache": { - "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" - } - }, - "level-blobs": { - "version": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", - "dev": true, - "requires": { - "level-peek": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "level-filesystem": { - "version": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", - "dev": true, - "requires": { - "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "fwd-stream": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "level-blobs": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "level-peek": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "level-sublevel": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "octal": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz" - }, - "dependencies": { - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", - "dev": true - } - } - }, - "level-fix-range": { - "version": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=", - "dev": true - }, - "level-hooks": { - "version": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", - "dev": true, - "requires": { - "string-range": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz" - } - }, - "level-js": { - "version": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", - "dev": true, - "requires": { - "abstract-leveldown": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "idb-wrapper": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.1.tgz", - "isbuffer": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "ltgt": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.0.tgz", - "typedarray-to-buffer": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz" - }, - "dependencies": { - "object-keys": { - "version": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz" - } - } - } - }, - "level-peek": { - "version": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", - "dev": true, - "requires": { - "level-fix-range": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz" - } - }, - "level-sublevel": { - "version": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", - "dev": true, - "requires": { - "level-fix-range": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "level-hooks": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "string-range": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz" - }, - "dependencies": { - "level-fix-range": { - "version": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", - "dev": true, - "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz" - } - }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", - "dev": true, - "requires": { - "is-object": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "object-keys": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz" - } - } - } - }, - "levelup": { - "version": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", - "dev": true, - "requires": { - "bl": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "deferred-leveldown": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "prr": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=", - "dev": true - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "load-json-file": { - "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - } - }, - "loader-runner": { - "version": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "emojis-list": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - } - }, - "lockfile": { - "version": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.3.tgz", - "integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=" - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash.flatten": { - "version": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.flattendeep": { - "version": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, - "lodash.includes": { - "version": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.intersection": { - "version": "https://registry.npmjs.org/lodash.intersection/-/lodash.intersection-4.4.0.tgz", - "integrity": "sha1-ChG6Yx0OlcI8fy9Mu5ppLtF45wU=" - }, - "lodash.mapvalues": { - "version": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=" - }, - "lodash.merge": { - "version": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" - }, - "lodash.shuffle": { - "version": "https://registry.npmjs.org/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz", - "integrity": "sha1-FFtQU8+HX29cKjP0i26ZSMbse0s=" - }, - "lodash.sortby": { - "version": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.uniq": { - "version": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "lodash.uniqby": { - "version": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=" - }, - "log-prepend": { - "version": "0.0.1005", - "resolved": "https://registry.npmjs.org/log-prepend/-/log-prepend-0.0.1005.tgz", - "integrity": "sha1-Xo5dTIB9IVhXhoWEVi1UKEzcWYw=" - }, - "longest": { - "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loose-envify": { - "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz" - } - }, - "ltgt": { - "version": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.0.tgz", - "integrity": "sha1-tlul/LNJopkkyOMz98alVi8uSEI=", - "dev": true - }, - "make-beep": { - "version": "https://registry.npmjs.org/make-beep/-/make-beep-0.0.1.tgz", - "integrity": "sha1-3ZjnWI2BxuB36diJZ6AY5Z1euGk=", - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - } - }, - "memory-fs": { - "version": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz" - } - }, - "miller-rabin": { - "version": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - } - }, - "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" - }, - "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz" - } - }, - "minimalistic-assert": { - "version": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" - } - }, - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - }, - "dependencies": { - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" - }, - "negotiator": { - "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "node-check-fast": { - "version": "https://registry.npmjs.org/node-check-fast/-/node-check-fast-0.0.1008.tgz", - "integrity": "sha1-c4kJ3G2fWUpEsdPc0A2nTE5KcEk=", - "dev": true, - "requires": { - "async": "2.5.0", - "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "lodash.flattendeep": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz" - } - }, - "node-libs-browser": { - "version": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "dev": true, - "requires": { - "assert": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "browserify-zlib": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "buffer": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "console-browserify": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "constants-browserify": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "crypto-browserify": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz", - "domain-browser": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "events": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "https-browserify": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "os-browserify": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "path-browserify": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "process": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "querystring-es3": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "stream-browserify": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "stream-http": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "timers-browserify": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", - "tty-browserify": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "url": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "util": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "vm-browserify": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz" - }, - "dependencies": { - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "normalize-package-data": { - "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", - "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", - "dev": true, - "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "5.4.1", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz" - } - }, - "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-component": { - "version": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "object-keys": { - "version": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", - "dev": true, - "requires": { - "foreach": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "is": "https://registry.npmjs.org/is/-/is-0.2.7.tgz" - } - }, - "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.5", - "is-extendable": "0.1.1" - } - }, - "octal": { - "version": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", - "dev": true - }, - "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "optimist": { - "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" - }, - "dependencies": { - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" - } - } - }, - "os-browserify": { - "version": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", - "dev": true - }, - "os-locale": { - "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" - } - }, - "pako": { - "version": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parse-asn1": { - "version": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" - } - }, - "parsejson": { - "version": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" - } - }, - "parseqs": { - "version": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" - } - }, - "parseuri": { - "version": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" - } - }, - "path-browserify": { - "version": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-type": { - "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" - }, - "pbkdf2": { - "version": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", - "dev": true, - "requires": { - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" - } - }, - "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } - }, - "pkg-dir": { - "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - } - }, - "pragmatik": { - "version": "0.0.407", - "resolved": "https://registry.npmjs.org/pragmatik/-/pragmatik-0.0.407.tgz", - "integrity": "sha1-z88zXHyW/ktEsGRkiD7MBTpJ6+8=", - "requires": { - "debug": "2.6.9", - "function-arguments": "https://registry.npmjs.org/function-arguments/-/function-arguments-1.0.8.tgz" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "prepend-transform": { - "version": "0.0.1007", - "resolved": "https://registry.npmjs.org/prepend-transform/-/prepend-transform-0.0.1007.tgz", - "integrity": "sha1-AP4HaQCWGvZKOk/Z5dPTmWXtXZ0=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "private": { - "version": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process": { - "version": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "progress": { - "version": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" - }, - "proxy-mcproxy": { - "version": "0.0.1003", - "resolved": "https://registry.npmjs.org/proxy-mcproxy/-/proxy-mcproxy-0.0.1003.tgz", - "integrity": "sha1-7emD0Kr5fLd4hnHRKcnYE1Lg1aE=", - "requires": { - "freeze-existing-props": "0.0.1001" - } - }, - "prr": { - "version": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - }, - "public-encrypt": { - "version": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "browserify-rsa": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "parse-asn1": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "querystring": { - "version": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz" - }, - "dependencies": { - "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", - "integrity": "sha1-/kyEYDl/nqqqWOc75GJzQIpF4iM=", - "dev": true - } - } - }, - "read-pkg": { - "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - } - }, - "read-pkg-up": { - "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" - } - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "integrity": "sha1-B5azH412iAB/8Lk6gIjTSqF8D3I=", - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "set-immediate-shim": "1.0.1" - } - }, - "regenerate": { - "version": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "regenerator-runtime": { - "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regenerator-transform": { - "version": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "private": "https://registry.npmjs.org/private/-/private-0.1.7.tgz" - } - }, - "regex-cache": { - "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "regexpu-core": { - "version": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "regjsgen": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "regjsparser": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" - } - }, - "regjsgen": { - "version": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - } - }, - "remove-trailing-separator": { - "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "readable-stream": "2.3.3" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "request": { - "version": "2.82.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.82.0.tgz", - "integrity": "sha512-/QWqfmyTfQ4OYs6EhB1h2wQsX9ZxbuNePCvCm0Mdz/mxw73mjdg0D4QdIl0TQBFs35CZmMXLjk0iCGK395CUDg==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "2.1.17", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "2.3.3", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "uuid": "3.1.0" - }, - "dependencies": { - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "requires": { - "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "mime-types": "2.1.17" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.2.2", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "jsprim": "1.4.1", - "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "extsprintf": "1.3.0", - "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "verror": "1.10.0" - } - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "sntp": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", - "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", - "requires": { - "hoek": "4.2.0" - } - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "extsprintf": "1.3.0" - } - } - } - }, - "require-directory": { - "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" - }, - "require-main-filename": { - "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "residence": { - "version": "0.0.205", - "resolved": "https://registry.npmjs.org/residence/-/residence-0.0.205.tgz", - "integrity": "sha1-EHis4NvMqXtR/UIaNgHU/IMs+/Y=" - }, - "right-align": { - "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" - } - }, - "ripemd160": { - "version": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, - "requires": { - "hash-base": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "rxjs": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz", - "integrity": "sha512-fSNi+y+P9ss+EZuV0GcIIqPUK07DEaMRUtLJvdcvMyFjc9dizuDjere+A4V7JrLGnm9iCc+nagV/4QdMTkqC4A==", - "dev": true, - "requires": { - "symbol-observable": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz" - } - }, - "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "set-blocking": { - "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "should": { - "version": "https://registry.npmjs.org/should/-/should-11.2.1.tgz", - "integrity": "sha1-kPVRRVUtAc/CAGZuToGKHJZw7aI=", - "dev": true, - "requires": { - "should-equal": "https://registry.npmjs.org/should-equal/-/should-equal-1.0.1.tgz", - "should-format": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "should-type": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "should-type-adaptors": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.0.1.tgz", - "should-util": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz" - } - }, - "should-equal": { - "version": "https://registry.npmjs.org/should-equal/-/should-equal-1.0.1.tgz", - "integrity": "sha1-C26VFvJgGp+wuy3MNpr6HH4gCvc=", - "dev": true, - "requires": { - "should-type": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz" - } - }, - "should-format": { - "version": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "should-type-adaptors": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.0.1.tgz" - } - }, - "should-type": { - "version": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.0.1.tgz", - "integrity": "sha1-7+VVPN9oz/ZuXF9RtxLcNRx3vqo=", - "dev": true, - "requires": { - "should-type": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "should-util": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz" - } - }, - "should-util": { - "version": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", - "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", - "dev": true - }, - "siamese": { - "version": "https://registry.npmjs.org/siamese/-/siamese-2.0.4.tgz", - "integrity": "sha1-BgcwcmL1nn7R3+RxvKNOiD55UzQ=" - }, - "socket.io": { - "version": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.3.tgz", - "integrity": "sha1-Q1nwaiSTOua9CHeYr3jGgOrjReM=", - "requires": { - "debug": "2.6.8", - "engine.io": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "socket.io-adapter": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.0.tgz", - "socket.io-client": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz", - "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-adapter": { - "version": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.0.tgz", - "integrity": "sha1-x6pGUB3VVsLLiiivj/lcC14dqkw=", - "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" - } - } - }, - "socket.io-client": { - "version": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz", - "integrity": "sha1-bK9K/5+FsZ/ZG2zhPWmttWT4hzs=", - "requires": { - "backo2": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "base64-arraybuffer": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "component-bind": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "debug": "2.6.8", - "engine.io-client": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz", - "has-cors": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "object-component": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "parseqs": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "parseuri": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", - "to-array": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "socket.io-parser": { - "version": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", - "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", - "requires": { - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "debug": "2.6.8", - "has-binary2": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz" - }, - "dependencies": { - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "spdx-correct": { - "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" - } - }, - "spdx-expression-parse": { - "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "sprintf-js": { - "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sqlite3": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.12.tgz", - "integrity": "sha1-KzoUsXFi456KpuHiSHpB0HlTltg=", - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.38" - }, - "dependencies": { - "node-pre-gyp": { - "version": "0.6.38", - "bundled": true, - "requires": { - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.4.1", - "tar": "2.2.1", - "tar-pack": "3.4.0" - }, - "dependencies": { - "hawk": { - "version": "3.1.3", - "bundled": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - }, - "dependencies": { - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "requires": { - "boom": "2.10.1" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - } - } - } - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - }, - "dependencies": { - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "readable-stream": { - "version": "2.3.3", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - } - } - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true - } - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "requires": { - "string-width": "1.0.2" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - } - } - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - } - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - }, - "dependencies": { - "aws-sign2": { - "version": "0.6.0", - "bundled": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - }, - "dependencies": { - "delayed-stream": { - "version": "1.0.0", - "bundled": true - } - } - }, - "extend": { - "version": "3.0.1", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - }, - "dependencies": { - "asynckit": { - "version": "0.4.0", - "bundled": true - } - } - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "bundled": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - }, - "dependencies": { - "co": { - "version": "4.6.0", - "bundled": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonify": "0.0.0" - }, - "dependencies": { - "jsonify": { - "version": "0.0.0", - "bundled": true - } - } - } - } - }, - "har-schema": { - "version": "1.0.5", - "bundled": true - } - } - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "bundled": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - } - } - } - } - }, - "sshpk": { - "version": "1.13.1", - "bundled": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "bundled": true - }, - "assert-plus": { - "version": "1.0.0", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - } - } - } - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true - }, - "mime-types": { - "version": "2.1.17", - "bundled": true, - "requires": { - "mime-db": "1.30.0" - }, - "dependencies": { - "mime-db": { - "version": "1.30.0", - "bundled": true - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true - }, - "qs": { - "version": "6.4.0", - "bundled": true - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "stringstream": { - "version": "0.0.5", - "bundled": true - }, - "tough-cookie": { - "version": "2.3.3", - "bundled": true, - "requires": { - "punycode": "1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "bundled": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "uuid": { - "version": "3.1.0", - "bundled": true - } - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "requires": { - "glob": "7.1.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - } - } - } - } - }, - "semver": { - "version": "5.4.1", - "bundled": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - }, - "dependencies": { - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "bundled": true - } - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - } - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "bundled": true - } - } - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "inherits": { - "version": "2.0.3", - "bundled": true - } - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.8" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.8", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - } - } - } - } - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, - "readable-stream": { - "version": "2.3.3", - "bundled": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - } - } - }, - "uid-number": { - "version": "0.0.6", - "bundled": true - } - } - } - } - } - } - }, - "sshpk": { - "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "ecc-jsbn": "0.1.1", - "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "stream-browserify": { - "version": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz" - } - }, - "stream-http": { - "version": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha1-QKBQ7I3DtTsz2ZCUFcAsC/Gr+60=", - "dev": true, - "requires": { - "builtin-status-codes": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "to-arraybuffer": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "stream-shift": { - "version": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", - "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz" - } - }, - "string-range": { - "version": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", - "dev": true - }, - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "3.0.1" - } - }, - "stringstream": { - "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - } - }, - "suman-browser-polyfills": { - "version": "0.0.1008", - "resolved": "https://registry.npmjs.org/suman-browser-polyfills/-/suman-browser-polyfills-0.0.1008.tgz", - "integrity": "sha1-Nja90Wqe/xcPQeWQSq9nLd7eLpA=", - "requires": { - "async": "2.5.0" - } - }, - "suman-debug": { - "version": "0.0.111", - "resolved": "https://registry.npmjs.org/suman-debug/-/suman-debug-0.0.111.tgz", - "integrity": "sha1-hwqlurdcywiAdvYXyvnjPeNE8fk=", - "requires": { - "colors": "1.1.2", - "suman-browser-polyfills": "0.0.1008" - } - }, - "suman-events": { - "version": "0.0.115", - "resolved": "https://registry.npmjs.org/suman-events/-/suman-events-0.0.115.tgz", - "integrity": "sha1-aoRJwSAC9d2YM68MfJn+tYNMeQ4=", - "requires": { - "chalk": "2.1.0", - "suman-browser-polyfills": "0.0.1008" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "4.4.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "suman-reporters": { - "version": "0.0.1004", - "resolved": "https://registry.npmjs.org/suman-reporters/-/suman-reporters-0.0.1004.tgz", - "integrity": "sha1-pb3Fych98Sv+waElDyUJ/NR4wnM=", - "requires": { - "chalk": "2.1.0", - "suman-browser-polyfills": "0.0.1008", - "suman-events": "0.0.115", - "suman-utils": "0.0.73117" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "4.4.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "suman-run-plugins": { - "version": "0.0.104", - "resolved": "https://registry.npmjs.org/suman-run-plugins/-/suman-run-plugins-0.0.104.tgz", - "integrity": "sha1-hBGv1ZPP+anZkMoGA6dJhoe4cXY=" - }, - "suman-transform-plugins": { - "version": "0.0.103", - "resolved": "https://registry.npmjs.org/suman-transform-plugins/-/suman-transform-plugins-0.0.103.tgz", - "integrity": "sha1-rO+3DQNH1aRcKHwjbK0LaLAU/fU=" - }, - "suman-utils": { - "version": "0.0.73117", - "resolved": "https://registry.npmjs.org/suman-utils/-/suman-utils-0.0.73117.tgz", - "integrity": "sha1-CXyL0X7/1AxWYBgCGSx9jrR7se8=", - "requires": { - "async": "2.5.0", - "colors": "1.1.2", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "residence": "0.0.205", - "rimraf": "2.6.2", - "suman-browser-polyfills": "0.0.1008", - "suman-debug": "0.0.111" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "symbol-observable": { - "version": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=", - "dev": true - }, - "tap-json-parser": { - "version": "0.0.1003", - "resolved": "https://registry.npmjs.org/tap-json-parser/-/tap-json-parser-0.0.1003.tgz", - "integrity": "sha1-tzrFEeKmXE6RP9TTKMB3Vq6QyN0=" - }, - "tap-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", - "integrity": "sha1-aQfolyXXt/pq5B7ixGTD20MYiuw=", - "requires": { - "events-to-array": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz" - } - }, - "tcp-ping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/tcp-ping/-/tcp-ping-0.1.1.tgz", - "integrity": "sha1-At1/QrW/fXy3jVt6rO+hVf2PfAw=" - }, - "through": { - "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "timers-browserify": { - "version": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", - "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", - "dev": true, - "requires": { - "setimmediate": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - } - }, - "to-array": { - "version": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "tty-browserify": { - "version": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=" - }, - "typedarray": { - "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", - "dev": true - }, - "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "optional": true, - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" - } - }, - "uglify-to-browserify": { - "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "ultron": { - "version": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "url": { - "version": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "querystring": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" - }, - "dependencies": { - "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "util": { - "version": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "dependencies": { - "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" - }, - "uws": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", - "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=", - "optional": true - }, - "v8flags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.0.tgz", - "integrity": "sha1-S+lgRIjgxBI2Rd73BbGEjRa44B8=", - "requires": { - "user-home": "1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" - } - } - }, - "validate-npm-package-license": { - "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" - } - }, - "vamoot": { - "version": "0.0.102", - "resolved": "https://registry.npmjs.org/vamoot/-/vamoot-0.0.102.tgz", - "integrity": "sha1-bTklid+uC5jtCW5HIBn7zEIjEek=", - "requires": { - "freeze-existing-props": "0.0.1001" - } - }, - "vm-browserify": { - "version": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" - } - }, - "webpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", - "integrity": "sha1-sqEiaAQ3P/09A+qca9UlBnA09rE=", - "dev": true, - "requires": { - "acorn": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", - "acorn-dynamic-import": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "ajv-keywords": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "async": "2.5.0", - "enhanced-resolve": "3.4.1", - "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "json-loader": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "loader-runner": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "loader-utils": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "node-libs-browser": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "3.2.3", - "tapable": "0.2.8", - "uglify-js": "2.8.29", - "watchpack": "1.4.0", - "webpack-sources": "1.0.1", - "yargs": "6.6.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "tapable": "0.2.8" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "2.5.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - } - }, - "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "3.0.1" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - } - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - } - } - }, - "websocket-stream": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-4.0.0.tgz", - "integrity": "sha1-NYOGyrGwBw4XsytDf3TxvBnhOJA=", - "requires": { - "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.11.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "ws": "2.3.1", - "xtend": "4.0.1" - }, - "dependencies": { - "ultron": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", - "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" - }, - "ws": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "ultron": "1.1.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - } - } - }, - "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "optional": true - }, - "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", - "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "ultron": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz" - }, - "dependencies": { - "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" - } - } - }, - "xmlhttprequest-ssl": { - "version": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=" - }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "optional": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" - }, - "dependencies": { - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "optional": true - } - } - }, - "yeast": { - "version": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/suman-todos.txt b/suman-todos.txt index 8e10106b..ce7d2dfd 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -10,6 +10,21 @@ three SO profiles: /// +cd $(dirname "$0") +[ ! -d "node_modules/babel-runtime" ] && npm install babel-runtime +[ ! -d "node_modules/babel-core" ] && npm install babel-core +[ ! -d "node_modules/babel-plugin-transform-runtime" ] && npm install babel-plugin-transform-runtime +[ ! -d "node_modules/babel-preset-es2015" ] && npm install babel-preset-es2015 +[ ! -d "node_modules/babel-preset-es2016" ] && npm install babel-preset-es2016 +[ ! -d "node_modules/babel-polyfill" ] && npm install babel-polyfill +[ ! -d "node_modules/babel-preset-stage-0" ] && npm install babel-preset-stage-0 +[ ! -d "node_modules/babel-preset-stage-1" ] && npm install babel-preset-stage-1 +[ ! -d "node_modules/babel-preset-stage-2" ] && npm install babel-preset-stage-2 +[ ! -d "node_modules/babel-preset-stage-3" ] && npm install babel-preset-stage-3 + + +//// + suman --scripts abc => should run the script that's in suman.conf.js From 3fd7a5d1b5221f600e6a739212829699dfe17900 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 23:41:49 -0700 Subject: [PATCH 14/32] pdev:set --- tsconfig-test.json => test/tsconfig.json | 7 ----- tsconfig-browser-pf.json | 39 ----------------------- tsconfig-browser.json | 40 ------------------------ 3 files changed, 86 deletions(-) rename tsconfig-test.json => test/tsconfig.json (78%) delete mode 100755 tsconfig-browser-pf.json delete mode 100755 tsconfig-browser.json diff --git a/tsconfig-test.json b/test/tsconfig.json similarity index 78% rename from tsconfig-test.json rename to test/tsconfig.json index 051d1033..3bd4d9d7 100755 --- a/tsconfig-test.json +++ b/test/tsconfig.json @@ -1,9 +1,5 @@ { "compilerOptions": { - "outDir": "test/target", - "types": [ - "node" - ], "typeRoots": [ "node_modules/@types" ], @@ -21,9 +17,6 @@ "dom" ] }, - "include": [ - "test/src/**/*.ts" - ], "exclude": [ "node_modules" ] diff --git a/tsconfig-browser-pf.json b/tsconfig-browser-pf.json deleted file mode 100755 index 1407edc2..00000000 --- a/tsconfig-browser-pf.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "compilerOptions": { - "outFile": "dist/suman-browser-polyfills.js", - "declaration": true, - "baseUrl": ".", - "paths": { - }, - "types": [ - "node", - "async", - "lodash" - ], - "typeRoots": [ - "node_modules/@types" - ], - "target": "es5", - "module": "system", - "moduleResolution": "node", - "noImplicitAny": true, - "removeComments": true, - "allowUnreachableCode": true, - "lib": [ - "es2015", - "es2016", - "es2017", - "dom" - ] - }, - "allowJs": true, - "compileOnSave": false, - "include": [ - "browser-polyfills/src/**/*.js" - ], - "exclude": [ - "test", - "node_modules", - "dist" - ] -} diff --git a/tsconfig-browser.json b/tsconfig-browser.json deleted file mode 100755 index bba06c32..00000000 --- a/tsconfig-browser.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "compilerOptions": { - "outFile": "dist/suman-systemjs.js", - "declaration": true, - "baseUrl": ".", - "paths": { - }, - "types": [ - "node", - "async", - "lodash" - ], - "typeRoots": [ - "node_modules/@types" - ], - "target": "es5", - "module": "system", - "moduleResolution": "node", - "noImplicitAny": false, - "removeComments": true, - "allowUnreachableCode": true, - "lib": [ - "es2015", - "es2016", - "es2017", - "dom" - ] - }, - "allowJs": true, - "compileOnSave": false, - "include": [ - "**/*.js", - "**/*.ts" - ], - "exclude": [ - "test", - "node_modules", - "dist" - ] -} From 9895bb799750702d81b661bc59f010bc588dc9b0 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sat, 30 Sep 2017 23:42:55 -0700 Subject: [PATCH 15/32] feature:merge:1506840174993 --- test/_suman/gantt-4.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/_suman/gantt-4.html b/test/_suman/gantt-4.html index b22e3e6f..558a9600 100644 --- a/test/_suman/gantt-4.html +++ b/test/_suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506839298100,"endDate":1506839298612,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506839298096,"endDate":1506839298609,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506840133006,"endDate":1506840133540,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506840133000,"endDate":1506840133540,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; From 41a4bf825989d1a8be2015d68ff00116cb60bd67 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sun, 1 Oct 2017 12:59:27 -0700 Subject: [PATCH 16/32] pdev:set --- .npmignore | 13 +++--- lib/cli-commands/watching/index.ts | 41 ++++++++++--------- lib/default-conf-files/suman.default.conf.js | 8 +++- suman.conf.js | 3 +- .babelrc => test/.babelrc | 0 test/{_suman => .suman}/Dockerfile | 0 test/{_suman => .suman}/gantt-2.hbs | 0 test/{_suman => .suman}/gantt-3.html | 0 test/{_suman => .suman}/gantt-4.html | 0 test/{_suman => .suman}/gantt.html | 0 test/{_suman => .suman}/logs/.readme | 0 test/{_suman => .suman}/report/x.html | 0 test/{_suman => .suman}/reporters/tap.js | 0 test/{_suman => .suman}/scripts/a.sh | 0 test/{_suman => .suman}/scripts/b.sh | 0 test/{_suman => .suman}/scripts/c.sh | 0 test/{_suman => .suman}/suman.globals.d.ts | 0 test/{_suman => .suman}/suman.globals.js | 0 test/{_suman => .suman}/suman.globals.ts | 0 test/{_suman => .suman}/suman.groups-old.d.ts | 0 test/{_suman => .suman}/suman.groups-old.js | 0 test/{_suman => .suman}/suman.groups-old.ts | 0 test/{_suman => .suman}/suman.groups.d.ts | 0 test/{_suman => .suman}/suman.groups.js | 0 test/{_suman => .suman}/suman.groups.ts | 0 test/{_suman => .suman}/suman.hooks.d.ts | 0 test/{_suman => .suman}/suman.hooks.js | 0 test/{_suman => .suman}/suman.hooks.ts | 0 test/{_suman => .suman}/suman.ioc.d.ts | 0 test/{_suman => .suman}/suman.ioc.js | 0 test/{_suman => .suman}/suman.ioc.static.d.ts | 0 test/{_suman => .suman}/suman.ioc.static.js | 0 test/{_suman => .suman}/suman.ioc.static.ts | 0 test/{_suman => .suman}/suman.ioc.ts | 0 test/{_suman => .suman}/suman.once.post.d.ts | 0 test/{_suman => .suman}/suman.once.post.js | 0 test/{_suman => .suman}/suman.once.post.ts | 0 test/{_suman => .suman}/suman.once.pre.d.ts | 0 test/{_suman => .suman}/suman.once.pre.js | 0 test/{_suman => .suman}/suman.once.pre.ts | 0 test/{_suman => .suman}/suman.order.d.ts | 0 test/{_suman => .suman}/suman.order.js | 0 test/{_suman => .suman}/suman.order.ts | 0 test/{_suman => .suman}/tsconfig.json | 0 .../exp/tap-output/@target/tap-producer1.js | 5 ++- .../exp/tap-output/@target/tap-producer2.js | 6 ++- tsconfig.json | 4 +- 47 files changed, 45 insertions(+), 35 deletions(-) rename .babelrc => test/.babelrc (100%) rename test/{_suman => .suman}/Dockerfile (100%) rename test/{_suman => .suman}/gantt-2.hbs (100%) rename test/{_suman => .suman}/gantt-3.html (100%) rename test/{_suman => .suman}/gantt-4.html (100%) rename test/{_suman => .suman}/gantt.html (100%) rename test/{_suman => .suman}/logs/.readme (100%) rename test/{_suman => .suman}/report/x.html (100%) rename test/{_suman => .suman}/reporters/tap.js (100%) rename test/{_suman => .suman}/scripts/a.sh (100%) rename test/{_suman => .suman}/scripts/b.sh (100%) rename test/{_suman => .suman}/scripts/c.sh (100%) rename test/{_suman => .suman}/suman.globals.d.ts (100%) rename test/{_suman => .suman}/suman.globals.js (100%) rename test/{_suman => .suman}/suman.globals.ts (100%) rename test/{_suman => .suman}/suman.groups-old.d.ts (100%) rename test/{_suman => .suman}/suman.groups-old.js (100%) rename test/{_suman => .suman}/suman.groups-old.ts (100%) rename test/{_suman => .suman}/suman.groups.d.ts (100%) rename test/{_suman => .suman}/suman.groups.js (100%) rename test/{_suman => .suman}/suman.groups.ts (100%) rename test/{_suman => .suman}/suman.hooks.d.ts (100%) rename test/{_suman => .suman}/suman.hooks.js (100%) rename test/{_suman => .suman}/suman.hooks.ts (100%) rename test/{_suman => .suman}/suman.ioc.d.ts (100%) rename test/{_suman => .suman}/suman.ioc.js (100%) rename test/{_suman => .suman}/suman.ioc.static.d.ts (100%) rename test/{_suman => .suman}/suman.ioc.static.js (100%) rename test/{_suman => .suman}/suman.ioc.static.ts (100%) rename test/{_suman => .suman}/suman.ioc.ts (100%) rename test/{_suman => .suman}/suman.once.post.d.ts (100%) rename test/{_suman => .suman}/suman.once.post.js (100%) rename test/{_suman => .suman}/suman.once.post.ts (100%) rename test/{_suman => .suman}/suman.once.pre.d.ts (100%) rename test/{_suman => .suman}/suman.once.pre.js (100%) rename test/{_suman => .suman}/suman.once.pre.ts (100%) rename test/{_suman => .suman}/suman.order.d.ts (100%) rename test/{_suman => .suman}/suman.order.js (100%) rename test/{_suman => .suman}/suman.order.ts (100%) rename test/{_suman => .suman}/tsconfig.json (100%) diff --git a/.npmignore b/.npmignore index dd826f83..8d1d57a1 100755 --- a/.npmignore +++ b/.npmignore @@ -10,15 +10,14 @@ *.DS_Store ### folders -.idea -node_modules +.idea/ +node_modules/ coverage/ -.nyc_output -yarn.lock +.nyc_output/ test/ dist/ -.github -.tscmultiwatch +.github/ +.tscmultiwatch/ ### files exp.js @@ -30,6 +29,8 @@ suman.conf.js .editorconfig .babelrc .dockerignore +package-lock.json +yarn.lock ### negation !lib/**/*.sh diff --git a/lib/cli-commands/watching/index.ts b/lib/cli-commands/watching/index.ts index 7df9b697..ef352d80 100755 --- a/lib/cli-commands/watching/index.ts +++ b/lib/cli-commands/watching/index.ts @@ -1,5 +1,8 @@ 'use strict'; +//dts +import {IGlobalSumanObj, ISumanConfig, ISumanOpts} from "suman-types/dts/global"; + //polyfills const process = require('suman-browser-polyfills/modules/process'); const global = require('suman-browser-polyfills/modules/global'); @@ -12,12 +15,10 @@ import EE = require('events'); import fs = require('fs'); import * as stream from 'stream'; - //npm import su from 'suman-utils'; import * as chalk from 'chalk'; import {run as runWatch} from 'suman-watch'; -import {IGlobalSumanObj, ISumanConfig, ISumanOpts} from "suman-types/dts/global"; //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); @@ -48,24 +49,24 @@ export const run = function (paths: Array, sumanOpts: ISumanOpts, sumanC does not exist on the {suman.conf.js}.watch.per object.`)); } - runWatch(Object.freeze({ - paths, - watchPer, - noTranspile: sumanOpts.no_transpile, - noRun: sumanOpts.no_run - }), - - function (err: Error) { - if (err) { - console.log('\n'); - console.error(err.stack || err); - process.exit(1); - } - else { - console.log('\n'); - _suman.logInfo(chalk.underline('Suman watch successfully initialized.')); - } - }) + const watchOpts = Object.freeze({ + paths, + watchPer, + noTranspile: sumanOpts.no_transpile, + noRun: sumanOpts.no_run + }); + + runWatch(watchOpts, function (err: Error) { + if (err) { + console.log('\n'); + console.error(err.stack || err); + process.exit(1); + } + else { + console.log('\n'); + _suman.logInfo(chalk.underline('Suman watch successfully initialized.')); + } + }) }; diff --git a/lib/default-conf-files/suman.default.conf.js b/lib/default-conf-files/suman.default.conf.js index 9660bad7..6a110063 100755 --- a/lib/default-conf-files/suman.default.conf.js +++ b/lib/default-conf-files/suman.default.conf.js @@ -7,13 +7,14 @@ const numOfCPUs = os.cpus().length || 1; module.exports = { - // Array + // Array matchAny: [], //recommended regex for 'matchAny' => [/\.test\.js$/], matchNone: [/fixture/, /.*target/], //recommended regex for 'matchNone' => [/fixture/], matchAll: [/\.test\.js$/], //recommended regex for 'matchAll' => [], //string testDir: 'test', + testSrcDir: 'test', sumanHelpersDir: 'suman', uniqueAppName: '', browser: 'Firefox', // browser to open test results with @@ -87,9 +88,14 @@ module.exports = { }, watch: { + options:{ + // incomplete + }, per: { 'zoom': { exec: 'suman test', + include: [], + exclude: [], includes: [__dirname], excludes: ['/test/', '/node_modules/', '/.git/'], confOverride: {} diff --git a/suman.conf.js b/suman.conf.js index bd9f8723..079bbf05 100755 --- a/suman.conf.js +++ b/suman.conf.js @@ -19,8 +19,7 @@ module.exports = Object.freeze({ //string testDir: 'test', testSrcDir: 'test/src/dev/node', - testTargetDir: 'test/target', - sumanHelpersDir: 'test/_suman', + sumanHelpersDir: 'test/.suman', uniqueAppName: '', browser: 'Firefox', // browser to open test results with logsDir: process.env['SUMAN_LOGS_DIR'], diff --git a/.babelrc b/test/.babelrc similarity index 100% rename from .babelrc rename to test/.babelrc diff --git a/test/_suman/Dockerfile b/test/.suman/Dockerfile similarity index 100% rename from test/_suman/Dockerfile rename to test/.suman/Dockerfile diff --git a/test/_suman/gantt-2.hbs b/test/.suman/gantt-2.hbs similarity index 100% rename from test/_suman/gantt-2.hbs rename to test/.suman/gantt-2.hbs diff --git a/test/_suman/gantt-3.html b/test/.suman/gantt-3.html similarity index 100% rename from test/_suman/gantt-3.html rename to test/.suman/gantt-3.html diff --git a/test/_suman/gantt-4.html b/test/.suman/gantt-4.html similarity index 100% rename from test/_suman/gantt-4.html rename to test/.suman/gantt-4.html diff --git a/test/_suman/gantt.html b/test/.suman/gantt.html similarity index 100% rename from test/_suman/gantt.html rename to test/.suman/gantt.html diff --git a/test/_suman/logs/.readme b/test/.suman/logs/.readme similarity index 100% rename from test/_suman/logs/.readme rename to test/.suman/logs/.readme diff --git a/test/_suman/report/x.html b/test/.suman/report/x.html similarity index 100% rename from test/_suman/report/x.html rename to test/.suman/report/x.html diff --git a/test/_suman/reporters/tap.js b/test/.suman/reporters/tap.js similarity index 100% rename from test/_suman/reporters/tap.js rename to test/.suman/reporters/tap.js diff --git a/test/_suman/scripts/a.sh b/test/.suman/scripts/a.sh similarity index 100% rename from test/_suman/scripts/a.sh rename to test/.suman/scripts/a.sh diff --git a/test/_suman/scripts/b.sh b/test/.suman/scripts/b.sh similarity index 100% rename from test/_suman/scripts/b.sh rename to test/.suman/scripts/b.sh diff --git a/test/_suman/scripts/c.sh b/test/.suman/scripts/c.sh similarity index 100% rename from test/_suman/scripts/c.sh rename to test/.suman/scripts/c.sh diff --git a/test/_suman/suman.globals.d.ts b/test/.suman/suman.globals.d.ts similarity index 100% rename from test/_suman/suman.globals.d.ts rename to test/.suman/suman.globals.d.ts diff --git a/test/_suman/suman.globals.js b/test/.suman/suman.globals.js similarity index 100% rename from test/_suman/suman.globals.js rename to test/.suman/suman.globals.js diff --git a/test/_suman/suman.globals.ts b/test/.suman/suman.globals.ts similarity index 100% rename from test/_suman/suman.globals.ts rename to test/.suman/suman.globals.ts diff --git a/test/_suman/suman.groups-old.d.ts b/test/.suman/suman.groups-old.d.ts similarity index 100% rename from test/_suman/suman.groups-old.d.ts rename to test/.suman/suman.groups-old.d.ts diff --git a/test/_suman/suman.groups-old.js b/test/.suman/suman.groups-old.js similarity index 100% rename from test/_suman/suman.groups-old.js rename to test/.suman/suman.groups-old.js diff --git a/test/_suman/suman.groups-old.ts b/test/.suman/suman.groups-old.ts similarity index 100% rename from test/_suman/suman.groups-old.ts rename to test/.suman/suman.groups-old.ts diff --git a/test/_suman/suman.groups.d.ts b/test/.suman/suman.groups.d.ts similarity index 100% rename from test/_suman/suman.groups.d.ts rename to test/.suman/suman.groups.d.ts diff --git a/test/_suman/suman.groups.js b/test/.suman/suman.groups.js similarity index 100% rename from test/_suman/suman.groups.js rename to test/.suman/suman.groups.js diff --git a/test/_suman/suman.groups.ts b/test/.suman/suman.groups.ts similarity index 100% rename from test/_suman/suman.groups.ts rename to test/.suman/suman.groups.ts diff --git a/test/_suman/suman.hooks.d.ts b/test/.suman/suman.hooks.d.ts similarity index 100% rename from test/_suman/suman.hooks.d.ts rename to test/.suman/suman.hooks.d.ts diff --git a/test/_suman/suman.hooks.js b/test/.suman/suman.hooks.js similarity index 100% rename from test/_suman/suman.hooks.js rename to test/.suman/suman.hooks.js diff --git a/test/_suman/suman.hooks.ts b/test/.suman/suman.hooks.ts similarity index 100% rename from test/_suman/suman.hooks.ts rename to test/.suman/suman.hooks.ts diff --git a/test/_suman/suman.ioc.d.ts b/test/.suman/suman.ioc.d.ts similarity index 100% rename from test/_suman/suman.ioc.d.ts rename to test/.suman/suman.ioc.d.ts diff --git a/test/_suman/suman.ioc.js b/test/.suman/suman.ioc.js similarity index 100% rename from test/_suman/suman.ioc.js rename to test/.suman/suman.ioc.js diff --git a/test/_suman/suman.ioc.static.d.ts b/test/.suman/suman.ioc.static.d.ts similarity index 100% rename from test/_suman/suman.ioc.static.d.ts rename to test/.suman/suman.ioc.static.d.ts diff --git a/test/_suman/suman.ioc.static.js b/test/.suman/suman.ioc.static.js similarity index 100% rename from test/_suman/suman.ioc.static.js rename to test/.suman/suman.ioc.static.js diff --git a/test/_suman/suman.ioc.static.ts b/test/.suman/suman.ioc.static.ts similarity index 100% rename from test/_suman/suman.ioc.static.ts rename to test/.suman/suman.ioc.static.ts diff --git a/test/_suman/suman.ioc.ts b/test/.suman/suman.ioc.ts similarity index 100% rename from test/_suman/suman.ioc.ts rename to test/.suman/suman.ioc.ts diff --git a/test/_suman/suman.once.post.d.ts b/test/.suman/suman.once.post.d.ts similarity index 100% rename from test/_suman/suman.once.post.d.ts rename to test/.suman/suman.once.post.d.ts diff --git a/test/_suman/suman.once.post.js b/test/.suman/suman.once.post.js similarity index 100% rename from test/_suman/suman.once.post.js rename to test/.suman/suman.once.post.js diff --git a/test/_suman/suman.once.post.ts b/test/.suman/suman.once.post.ts similarity index 100% rename from test/_suman/suman.once.post.ts rename to test/.suman/suman.once.post.ts diff --git a/test/_suman/suman.once.pre.d.ts b/test/.suman/suman.once.pre.d.ts similarity index 100% rename from test/_suman/suman.once.pre.d.ts rename to test/.suman/suman.once.pre.d.ts diff --git a/test/_suman/suman.once.pre.js b/test/.suman/suman.once.pre.js similarity index 100% rename from test/_suman/suman.once.pre.js rename to test/.suman/suman.once.pre.js diff --git a/test/_suman/suman.once.pre.ts b/test/.suman/suman.once.pre.ts similarity index 100% rename from test/_suman/suman.once.pre.ts rename to test/.suman/suman.once.pre.ts diff --git a/test/_suman/suman.order.d.ts b/test/.suman/suman.order.d.ts similarity index 100% rename from test/_suman/suman.order.d.ts rename to test/.suman/suman.order.d.ts diff --git a/test/_suman/suman.order.js b/test/.suman/suman.order.js similarity index 100% rename from test/_suman/suman.order.js rename to test/.suman/suman.order.js diff --git a/test/_suman/suman.order.ts b/test/.suman/suman.order.ts similarity index 100% rename from test/_suman/suman.order.ts rename to test/.suman/suman.order.ts diff --git a/test/_suman/tsconfig.json b/test/.suman/tsconfig.json similarity index 100% rename from test/_suman/tsconfig.json rename to test/.suman/tsconfig.json diff --git a/test/src/exp/tap-output/@target/tap-producer1.js b/test/src/exp/tap-output/@target/tap-producer1.js index c34275bd..d69bd4fb 100755 --- a/test/src/exp/tap-output/@target/tap-producer1.js +++ b/test/src/exp/tap-output/@target/tap-producer1.js @@ -1,7 +1,7 @@ "use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +exports.__esModule = true; var suman_1 = require("suman"); -var Test = suman_1.default.init(module); +var Test = suman_1["default"].init(module); console.log('zoom'); Test.create(function (it, before, describe, beforeEach, afterEach, after) { before('yup', [function (h) { @@ -10,6 +10,7 @@ Test.create(function (it, before, describe, beforeEach, afterEach, after) { describe('ruby tuesday', function () { }); it('zoom', function (t) { + // t.assert.deepEqual(false, true); throw new Error('whole me 3'); }) .it('rudolph', function (t) { diff --git a/test/src/exp/tap-output/@target/tap-producer2.js b/test/src/exp/tap-output/@target/tap-producer2.js index 53235672..ff644c00 100755 --- a/test/src/exp/tap-output/@target/tap-producer2.js +++ b/test/src/exp/tap-output/@target/tap-producer2.js @@ -1,12 +1,14 @@ "use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +exports.__esModule = true; var suman_1 = require("suman"); -var Test = suman_1.default.init(module); +var Test = suman_1["default"].init(module); Test.create(function (it) { it('passes', function (t) { + // t.skip(); throw new Error('whole me 1'); }); it('fails', function (t) { + // t.skip(); throw new Error('whole me 2'); }); }); diff --git a/tsconfig.json b/tsconfig.json index 6dd8fd4f..06426f5b 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,8 +3,8 @@ "declaration": true, "baseUrl": ".", "typeRoots": [ - "node_modules/@types", - "node_modules/suman-types/dts" + "./node_modules/@types", + "./node_modules/suman-types/dts" ], "allowJs": false, "target": "es5", From b65b8f4212c35e386d96d58262e8b17138d0521b Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sun, 1 Oct 2017 14:10:43 -0700 Subject: [PATCH 17/32] pdev:set --- cli.js | 6 +- cli.ts | 12 ++- lib/cli-commands/run-scripts/index.d.ts | 2 + lib/cli-commands/run-scripts/index.js | 49 +++++++++ lib/cli-commands/run-scripts/index.ts | 79 ++++++++++++++ lib/cli-commands/watching/index.js | 5 +- lib/default-conf-files/suman.default.conf.js | 2 +- .../suman.default.conf.x.d.ts | 100 ----------------- .../suman.default.conf.x.ts | 101 +----------------- lib/exec-suite.js | 12 +-- lib/helpers/load-reporters.js | 3 +- lib/parse-cmd-line-opts/suman-options.js | 5 + lib/parse-cmd-line-opts/suman-options.ts | 5 + lib/test-suite-methods/make-after-each.js | 3 + lib/test-suite-methods/make-after-each.ts | 3 + lib/test-suite-methods/make-before-each.js | 3 + lib/test-suite-methods/make-before-each.ts | 3 + lib/test-suite-methods/make-before.js | 3 + lib/test-suite-methods/make-before.ts | 3 + lib/test-suite-methods/make-inject.js | 3 + lib/test-suite-methods/make-inject.ts | 3 + lib/test-suite-methods/make-it.js | 3 + lib/test-suite-methods/make-it.ts | 3 + suman.conf.js | 42 ++++---- 24 files changed, 213 insertions(+), 240 deletions(-) create mode 100644 lib/cli-commands/run-scripts/index.d.ts create mode 100644 lib/cli-commands/run-scripts/index.js create mode 100644 lib/cli-commands/run-scripts/index.ts diff --git a/cli.js b/cli.js index 2362c6ab..3ae19cdf 100755 --- a/cli.js +++ b/cli.js @@ -180,6 +180,7 @@ var tscMultiWatch = sumanOpts.tsc_multi_watch; var sumanD = sumanOpts.suman_d; var watchPer = sumanOpts.watch_per; var singleProcess = sumanOpts.single_process; +var script = sumanOpts.script; if (singleProcess) { process.env.SUMAN_SINGLE_PROCESS = 'yes'; } @@ -304,7 +305,7 @@ var preOptCheck = { convert: convert, groups: groups, s: s, tailTest: tailTest, tailRunner: tailRunner, interactive: interactive, uninstallBabel: uninstallBabel, diagnostics: diagnostics, installGlobals: installGlobals, postinstall: postinstall, - repair: repair, sumanD: sumanD + repair: repair, sumanD: sumanD, script: script }; var optCheck = Object.keys(preOptCheck).filter(function (key, index) { return preOptCheck[key]; @@ -358,6 +359,9 @@ if (!process.stdout.isTTY && !useTAPOutput) { if (diagnostics) { require('./lib/cli-commands/run-diagnostics').run(sumanOpts); } +else if (script) { + require('./lib/cli-commands/run-scripts').run(sumanConfig, sumanOpts); +} else if (tscMultiWatch) { require('./lib/cli-commands/run-tscmultiwatch').run(sumanOpts); } diff --git a/cli.ts b/cli.ts index db30657e..767eaaae 100755 --- a/cli.ts +++ b/cli.ts @@ -114,19 +114,17 @@ import tty = require('tty'); //npm import semver = require('semver'); - const dashdash = require('dashdash'); import * as chalk from 'chalk'; import async = require('async'); import su = require('suman-utils'); import _ = require('lodash'); - const uniqBy = require('lodash.uniqby'); const {events} = require('suman-events'); const debug = require('suman-debug')('s:cli'); //project -const _suman : IGlobalSumanObj = global.__suman = (global.__suman || {}); +const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); require('./lib/helpers/add-suman-global-properties'); require('./lib/patches/all'); import {loadReporters} from './lib/helpers/load-reporters'; @@ -260,8 +258,9 @@ const tscMultiWatch = sumanOpts.tsc_multi_watch; const sumanD = sumanOpts.suman_d; const watchPer = sumanOpts.watch_per; const singleProcess = sumanOpts.single_process; +const script = sumanOpts.script; -if(singleProcess){ +if (singleProcess) { process.env.SUMAN_SINGLE_PROCESS = 'yes'; } @@ -444,7 +443,7 @@ const preOptCheck = { convert, groups, s, tailTest, tailRunner, interactive, uninstallBabel, diagnostics, installGlobals, postinstall, - repair, sumanD + repair, sumanD, script }; const optCheck = Object.keys(preOptCheck).filter(function (key, index) { @@ -524,6 +523,9 @@ if (!process.stdout.isTTY && !useTAPOutput) { if (diagnostics) { require('./lib/cli-commands/run-diagnostics').run(sumanOpts); } +else if (script) { + require('./lib/cli-commands/run-scripts').run(sumanConfig, sumanOpts); +} else if (tscMultiWatch) { require('./lib/cli-commands/run-tscmultiwatch').run(sumanOpts); } diff --git a/lib/cli-commands/run-scripts/index.d.ts b/lib/cli-commands/run-scripts/index.d.ts new file mode 100644 index 00000000..39b8122d --- /dev/null +++ b/lib/cli-commands/run-scripts/index.d.ts @@ -0,0 +1,2 @@ +import { ISumanConfig, ISumanOpts } from "suman-types/dts/global"; +export declare const run: (sumanConfig: ISumanConfig, opts: ISumanOpts) => void; diff --git a/lib/cli-commands/run-scripts/index.js b/lib/cli-commands/run-scripts/index.js new file mode 100644 index 00000000..aea00d1f --- /dev/null +++ b/lib/cli-commands/run-scripts/index.js @@ -0,0 +1,49 @@ +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); +var process = require('suman-browser-polyfills/modules/process'); +var global = require('suman-browser-polyfills/modules/global'); +var assert = require("assert"); +var cp = require("child_process"); +var util = require("util"); +var su = require("suman-utils"); +var chalk = require("chalk"); +var prepend_transform_1 = require("prepend-transform"); +var _suman = global.__suman = (global.__suman || {}); +exports.run = function (sumanConfig, opts) { + var k = cp.spawn('bash'); + var scriptKey = opts.script; + assert(su.isStringWithPositiveLn(scriptKey), 'script key must be a string.'); + var scriptValue; + try { + scriptValue = sumanConfig['scripts'][scriptKey]; + assert(su.isStringWithPositiveLn(scriptValue), "script value must be a string with positive length, instead we got <" + util.inspect(scriptValue) + ">."); + } + catch (err) { + if (sumanConfig['scripts']) { + _suman.log('Here are the available scripts in your suman.conf.js file:'); + _suman.log(util.inspect(sumanConfig['scripts'])); + } + throw err; + } + k.stdin.setDefaultEncoding('utf8'); + k.stdout.setEncoding('utf8'); + k.stderr.setEncoding('utf8'); + console.log('\n'); + _suman.log("Your script with key '" + scriptKey + "' is now running, and its output follows:\n"); + k.stdout.pipe(prepend_transform_1.pt(chalk.blue(' stdout: '))).pipe(process.stdout); + k.stderr.pipe(prepend_transform_1.pt(chalk.red(' stderr: '))).pipe(process.stderr); + k.stdin.write('\n'); + k.stdin.write(scriptValue); + k.stdin.end('\n'); + k.once('exit', function (code) { + console.log('\n'); + console.error('\n'); + if (code > 0) { + _suman.logError("script with key '" + scriptKey + "' exited with code " + code); + } + else { + _suman.log("script with key '" + scriptKey + "' exited with code " + code); + } + process.exit(code); + }); +}; diff --git a/lib/cli-commands/run-scripts/index.ts b/lib/cli-commands/run-scripts/index.ts new file mode 100644 index 00000000..8739153e --- /dev/null +++ b/lib/cli-commands/run-scripts/index.ts @@ -0,0 +1,79 @@ +'use strict'; + +//dts +import {ISumanConfig, ISumanOpts, IGlobalSumanObj} from "suman-types/dts/global"; + +//polyfills +const process = require('suman-browser-polyfills/modules/process'); +const global = require('suman-browser-polyfills/modules/global'); + +//core +import assert = require('assert'); +import * as cp from 'child_process'; +import util = require('util'); + + +//npm +import su = require('suman-utils'); +import chalk = require('chalk'); +import {pt} from 'prepend-transform'; + +//project +const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); + +//////////////////////////////////////////////////////////////////////////////// + +export const run = function (sumanConfig: ISumanConfig, opts: ISumanOpts) { + + const k = cp.spawn('bash'); + + const scriptKey = opts.script; + + assert(su.isStringWithPositiveLn(scriptKey), 'script key must be a string.'); + + let scriptValue; + + try { + scriptValue = sumanConfig['scripts'][scriptKey]; + assert(su.isStringWithPositiveLn(scriptValue), + `script value must be a string with positive length, instead we got <${util.inspect(scriptValue)}>.`); + } + catch (err) { + if(sumanConfig['scripts']){ + _suman.log('Here are the available scripts in your suman.conf.js file:'); + _suman.log(util.inspect(sumanConfig['scripts'])); + } + throw err; + } + + k.stdin.setDefaultEncoding('utf8'); + k.stdout.setEncoding('utf8'); + k.stderr.setEncoding('utf8'); + + console.log('\n'); + _suman.log(`Your script with key '${scriptKey}' is now running, and its output follows:\n`); + + k.stdout.pipe(pt(chalk.blue(' stdout: '))).pipe(process.stdout); + k.stderr.pipe(pt(chalk.red(' stderr: '))).pipe(process.stderr); + + k.stdin.write('\n'); + k.stdin.write(scriptValue); + k.stdin.end('\n'); + + k.once('exit', function (code) { + + console.log('\n'); + console.error('\n'); + + if (code > 0) { + _suman.logError(`script with key '${scriptKey}' exited with code ${code}`); + } + else { + _suman.log(`script with key '${scriptKey}' exited with code ${code}`); + } + + process.exit(code); + + }); + +}; diff --git a/lib/cli-commands/watching/index.js b/lib/cli-commands/watching/index.js index 453d1c6e..55ef6b0f 100755 --- a/lib/cli-commands/watching/index.js +++ b/lib/cli-commands/watching/index.js @@ -20,12 +20,13 @@ exports.run = function (paths, sumanOpts, sumanConfig) { watchPer = sumanConfig.watch.per[sumanOpts.watch_per]; assert(suman_utils_1.default.isObject(watchPer), chalk.red(" => Suman usage error => key \"" + sumanOpts.watch_per + "\", \n does not exist on the {suman.conf.js}.watch.per object.")); } - suman_watch_1.run(Object.freeze({ + var watchOpts = Object.freeze({ paths: paths, watchPer: watchPer, noTranspile: sumanOpts.no_transpile, noRun: sumanOpts.no_run - }), function (err) { + }); + suman_watch_1.run(watchOpts, function (err) { if (err) { console.log('\n'); console.error(err.stack || err); diff --git a/lib/default-conf-files/suman.default.conf.js b/lib/default-conf-files/suman.default.conf.js index 6a110063..ac5343a4 100755 --- a/lib/default-conf-files/suman.default.conf.js +++ b/lib/default-conf-files/suman.default.conf.js @@ -110,7 +110,7 @@ module.exports = { reporters: { // usage: $ suman --reporters tap - 'tap': 'suman-reporters/modules/tap' + 'tap': 'suman-reporters/modules/tap-reporter' // the value is simply passed to require() }, servers: { // list of servers to output test result data to, with the os.hostname() as the key diff --git a/lib/default-conf-files/suman.default.conf.x.d.ts b/lib/default-conf-files/suman.default.conf.x.d.ts index d23f640e..68085c81 100755 --- a/lib/default-conf-files/suman.default.conf.x.d.ts +++ b/lib/default-conf-files/suman.default.conf.x.d.ts @@ -1,103 +1,3 @@ -export interface ISumanConf { - matchAny: any[]; - matchNone: RegExp[]; - matchAll: RegExp[]; - testDir: string; - testSrcDir: string; - testTargetDir: string; - sumanHelpersDir: string; - uniqueAppName: string; - browser: string; - autoLoggingPre: boolean; - autoLoggingPost: boolean; - autoLoggingIoc: boolean; - autoLoggingHooks: boolean; - installSumanExtraDeps: boolean; - autoLoggingTestCases: boolean; - isLogChildStdout: boolean; - isLogChildStderr: boolean; - includeSumanGlobalsInPath: boolean; - useSumanUtilityPatches: boolean; - useTAPOutput: boolean; - errorsOnly: boolean; - replayErrorsAtRunnerEnd: boolean; - logStdoutToTestLogs: boolean; - allowArrowFunctionsForTestBlocks: boolean; - alwaysUseRunner: boolean; - enforceGlobalInstallationOnly: boolean; - enforceLocalInstallationOnly: boolean; - sourceTopLevelDepsInPackageDotJSON: boolean; - enforceTestCaseNames: boolean; - enforceBlockNames: boolean; - enforceHookNames: boolean; - bail: boolean; - bailRunner: boolean; - useBabelRegister: boolean; - transpile: boolean; - executeRunnerCWDAtTestFile: boolean; - sendStderrToSumanErrLogOnly: boolean; - useSuiteNameInTestCaseOutput: boolean; - ultraSafe: boolean; - verbose: boolean; - checkMemoryUsage: boolean; - fullStackTraces: boolean; - disableAutoOpen: boolean; - suppressRunnerOutput: boolean; - allowCollectUsageStats: boolean; - highestPerformance: boolean; - saveLogsForThisManyPastRuns: number; - verbosity: number; - maxParallelProcesses: number; - resultsCapCount: number; - resultsCapSize: number; - defaultHookTimeout: number; - defaultTestCaseTimeout: number; - timeoutToSearchForAvailServer: number; - defaultDelayFunctionTimeout: number; - defaultChildProcessTimeout: number; - defaultTestSuiteTimeout: number; - expireResultsAfter: number; - coverage: { - coverageDir: string; - nyc: { - use: boolean; - }; - istanbul: {}; - }; - watch: { - '//tests': { - 'default': { - script: (p: any) => string; - include: any[]; - exclude: string[]; - }; - }; - '//project': { - 'default': { - script: string; - include: any[]; - exclude: string[]; - }; - }; - }; - reporters: { - 'tap': string; - }; - servers: { - '*default': { - host: string; - port: number; - }; - '###': { - host: string; - port: number; - }; - }; - babelRegisterOpts: { - ignore: RegExp; - extensions: string[]; - }; -} declare const _default: { matchAny: any[]; matchNone: RegExp[]; diff --git a/lib/default-conf-files/suman.default.conf.x.ts b/lib/default-conf-files/suman.default.conf.x.ts index 58677c54..128ada69 100755 --- a/lib/default-conf-files/suman.default.conf.x.ts +++ b/lib/default-conf-files/suman.default.conf.x.ts @@ -8,106 +8,7 @@ const numOfCPUs = os.cpus().length || 1; //////////////////////////////////////////////// -export interface ISumanConf { - matchAny: any[]; - matchNone: RegExp[]; - matchAll: RegExp[]; - testDir: string; - testSrcDir: string; - testTargetDir: string; - sumanHelpersDir: string; - uniqueAppName: string; - browser: string; - autoLoggingPre: boolean; - autoLoggingPost: boolean; - autoLoggingIoc: boolean; - autoLoggingHooks: boolean; - installSumanExtraDeps: boolean; - autoLoggingTestCases: boolean; - isLogChildStdout: boolean; - isLogChildStderr: boolean; - includeSumanGlobalsInPath: boolean; - useSumanUtilityPatches: boolean; - useTAPOutput: boolean; - errorsOnly: boolean; - replayErrorsAtRunnerEnd: boolean; - logStdoutToTestLogs: boolean; - allowArrowFunctionsForTestBlocks: boolean; - alwaysUseRunner: boolean; - enforceGlobalInstallationOnly: boolean; - enforceLocalInstallationOnly: boolean; - sourceTopLevelDepsInPackageDotJSON: boolean; - enforceTestCaseNames: boolean; - enforceBlockNames: boolean; - enforceHookNames: boolean; - bail: boolean; - bailRunner: boolean; - useBabelRegister: boolean; - transpile: boolean; - executeRunnerCWDAtTestFile: boolean; - sendStderrToSumanErrLogOnly: boolean; - useSuiteNameInTestCaseOutput: boolean; - ultraSafe: boolean; - verbose: boolean; - checkMemoryUsage: boolean; - fullStackTraces: boolean; - disableAutoOpen: boolean; - suppressRunnerOutput: boolean; - allowCollectUsageStats: boolean; - highestPerformance: boolean; - saveLogsForThisManyPastRuns: number; - verbosity: number; - maxParallelProcesses: number; - resultsCapCount: number; - resultsCapSize: number; - defaultHookTimeout: number; - defaultTestCaseTimeout: number; - timeoutToSearchForAvailServer: number; - defaultDelayFunctionTimeout: number; - defaultChildProcessTimeout: number; - defaultTestSuiteTimeout: number; - expireResultsAfter: number; - coverage: { - coverageDir: string; - nyc: { - use: boolean; - }; - istanbul: {}; - }; - watch: { - '//tests': { - 'default': { - script: (p: any) => string; - include: any[]; - exclude: string[]; - }; - }; - '//project': { - 'default': { - script: string; - include: any[]; - exclude: string[]; - }; - }; - }; - reporters: { - 'tap': string; - }; - servers: { - '*default': { - host: string; - port: number; - }; - '###': { - host: string; - port: number; - }; - }; - babelRegisterOpts: { - ignore: RegExp; - extensions: string[]; - }; -} + export default { diff --git a/lib/exec-suite.js b/lib/exec-suite.js index 1e7eee64..6ba4ce22 100755 --- a/lib/exec-suite.js +++ b/lib/exec-suite.js @@ -202,8 +202,9 @@ exports.execSuite = function (suman) { var start = function () { _suman.suiteResultEmitter.emit('suman-test-registered', function () { var sumanOpts = _suman.sumanOpts; - _suman.currentPaddingCount = _suman.currentPaddingCount || {}; - _suman.currentPaddingCount.val = 1; + var currentPaddingCount = _suman.currentPaddingCount + = (_suman.currentPaddingCount || {}); + currentPaddingCount.val = 1; function runSuite(suite, cb) { if (_suman.sumanUncaughtExceptionTriggered) { _suman.logError("\"UncaughtException:Triggered\" => halting program.\n[" + __filename + "]"); @@ -228,12 +229,12 @@ exports.execSuite = function (suman) { if (children.length < 1) { return process.nextTick(cb); } - sumanOpts.series && (_suman.currentPaddingCount.val += 3); + sumanOpts.series && (currentPaddingCount.val += 3); async.eachLimit(children, limit, function (child, cb) { runSuite(child, cb); }, function (err) { - sumanOpts.series && (_suman.currentPaddingCount.val -= 3); - err && _suman.logError('Suman implementation error => ', err.stack || err); + sumanOpts.series && (currentPaddingCount.val -= 3); + err && _suman.logError('Suman implementation error:', err.stack || err); process.nextTick(cb); }); }); @@ -247,7 +248,6 @@ exports.execSuite = function (suman) { debugger; if (sumanOpts.parallel_max) { suman.getQueue().drain = function () { - debugger; onSumanCompleted(0, null); }; } diff --git a/lib/helpers/load-reporters.js b/lib/helpers/load-reporters.js index 6fa6c114..a81b1d23 100755 --- a/lib/helpers/load-reporters.js +++ b/lib/helpers/load-reporters.js @@ -26,7 +26,8 @@ exports.loadReporters = function (sumanOpts, projectRoot, sumanConfig) { _suman.logWarning('a reporter path was undefined.'); } return v; - }).map(function (item) { + }) + .map(function (item) { if (!path.isAbsolute(item)) { item = path.resolve(projectRoot + '/' + item); } diff --git a/lib/parse-cmd-line-opts/suman-options.js b/lib/parse-cmd-line-opts/suman-options.js index b9b28e6e..585ff7e3 100755 --- a/lib/parse-cmd-line-opts/suman-options.js +++ b/lib/parse-cmd-line-opts/suman-options.js @@ -450,6 +450,11 @@ module.exports = [ type: 'bool', help: 'Run multiple test scripts in the same node.js process.' }, + { + names: ['script'], + type: 'string', + help: 'Run scripts by key given by the "scripts" object in `suman.conf.js`.' + }, { names: ['dest'], type: 'string', diff --git a/lib/parse-cmd-line-opts/suman-options.ts b/lib/parse-cmd-line-opts/suman-options.ts index 48d54463..1c6e2b30 100755 --- a/lib/parse-cmd-line-opts/suman-options.ts +++ b/lib/parse-cmd-line-opts/suman-options.ts @@ -451,6 +451,11 @@ module.exports = [ type: 'bool', help: 'Run multiple test scripts in the same node.js process.' }, + { + names: ['script'], + type: 'string', + help: 'Run scripts by key given by the "scripts" object in `suman.conf.js`.' + }, { names: ['dest'], type: 'string', diff --git a/lib/test-suite-methods/make-after-each.js b/lib/test-suite-methods/make-after-each.js index 7b438cca..479463d4 100755 --- a/lib/test-suite-methods/make-after-each.js +++ b/lib/test-suite-methods/make-after-each.js @@ -19,6 +19,9 @@ var acceptableOptions = { cb: true, timeout: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; var handleBadOptions = function (opts) { diff --git a/lib/test-suite-methods/make-after-each.ts b/lib/test-suite-methods/make-after-each.ts index d11264f4..43a1ac1b 100755 --- a/lib/test-suite-methods/make-after-each.ts +++ b/lib/test-suite-methods/make-after-each.ts @@ -34,6 +34,9 @@ const acceptableOptions = { cb: true, timeout: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; diff --git a/lib/test-suite-methods/make-before-each.js b/lib/test-suite-methods/make-before-each.js index eb4a69f1..4f09d76c 100755 --- a/lib/test-suite-methods/make-before-each.js +++ b/lib/test-suite-methods/make-before-each.js @@ -18,6 +18,9 @@ var acceptableOptions = { plan: true, fatal: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; var handleBadOptions = function (opts) { diff --git a/lib/test-suite-methods/make-before-each.ts b/lib/test-suite-methods/make-before-each.ts index 239b607b..67538d88 100755 --- a/lib/test-suite-methods/make-before-each.ts +++ b/lib/test-suite-methods/make-before-each.ts @@ -38,6 +38,9 @@ const acceptableOptions = { plan: true, fatal: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; diff --git a/lib/test-suite-methods/make-before.js b/lib/test-suite-methods/make-before.js index 96f3055f..21035996 100755 --- a/lib/test-suite-methods/make-before.js +++ b/lib/test-suite-methods/make-before.js @@ -18,6 +18,9 @@ var acceptableOptions = { cb: true, timeout: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; var handleBadOptions = function (opts) { diff --git a/lib/test-suite-methods/make-before.ts b/lib/test-suite-methods/make-before.ts index 45cb3649..477b9181 100755 --- a/lib/test-suite-methods/make-before.ts +++ b/lib/test-suite-methods/make-before.ts @@ -42,6 +42,9 @@ const acceptableOptions = { cb: true, timeout: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; diff --git a/lib/test-suite-methods/make-inject.js b/lib/test-suite-methods/make-inject.js index c656e0ba..ac65f412 100755 --- a/lib/test-suite-methods/make-inject.js +++ b/lib/test-suite-methods/make-inject.js @@ -18,6 +18,9 @@ var acceptableOptions = { cb: true, timeout: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; var handleBadOptions = function (opts) { diff --git a/lib/test-suite-methods/make-inject.ts b/lib/test-suite-methods/make-inject.ts index e47df7d2..3958ae7a 100755 --- a/lib/test-suite-methods/make-inject.ts +++ b/lib/test-suite-methods/make-inject.ts @@ -42,6 +42,9 @@ const acceptableOptions = { cb: true, timeout: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; diff --git a/lib/test-suite-methods/make-it.js b/lib/test-suite-methods/make-it.js index 007bfafd..5b4a9790 100755 --- a/lib/test-suite-methods/make-it.js +++ b/lib/test-suite-methods/make-it.js @@ -24,6 +24,9 @@ var acceptableOptions = { timeout: true, only: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; var handleBadOptions = function (opts) { diff --git a/lib/test-suite-methods/make-it.ts b/lib/test-suite-methods/make-it.ts index d94460e7..cf01f777 100755 --- a/lib/test-suite-methods/make-it.ts +++ b/lib/test-suite-methods/make-it.ts @@ -44,6 +44,9 @@ const acceptableOptions = { timeout: true, only: true, skip: true, + events: true, + successEvents: true, + errorEvents: true, __preParsed: true }; diff --git a/suman.conf.js b/suman.conf.js index 079bbf05..623f9890 100755 --- a/suman.conf.js +++ b/suman.conf.js @@ -75,36 +75,30 @@ module.exports = Object.freeze({ expireResultsAfter: 10000000, // test results will be deleted after this amount of time watch: { - - 'all-tests': './node_modules/.bin/suman', - 'unit-tests': './node_modules/.bin/suman test/unit/**/*.js', - - '//tests': { - 'default': { // (re) execute the test file that changed - script: function (p) { - return `./node_modules/.bin/suman ${p}` - }, - include: [], - exclude: ['^test.*'] + options: {}, + per: { + 'node-dev': { + exec: 'suman test/src/dev/node', + includes: [__dirname], + excludes: ['/test/'], + confOverride: {} } }, - - '//project': { - script: './node_modules/.bin/suman', - include: [], - exclude: ['^test.*'], - - }, - - 'default': { //run all tests when a file changes in project - script: './node_modules/.bin/suman', - include: [], - exclude: ['^test.*'] + 'browser-dev': { + exec: 'suman test/src/dev/browser', + includes: [__dirname], + excludes: ['/test/'], + confOverride: {} } }, + scripts: { + // usage: $ suman --scripts example + example: 'export NODE_ENV=test; echo "I love hippos"; echo "zoom => ${NODE_ENV}"' + }, + reporters: { - 'tap': 'node_modules/suman/lib/reporters/tap-reporter' + 'tap': 'suman-reporters/modules/tap-reporter' }, // servers: { // list of servers to output test result data to, with the os.hostname() as the key From 5a991605aa8682485a86fc51a84e907b0e381b8d Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sun, 1 Oct 2017 15:04:37 -0700 Subject: [PATCH 18/32] pdev:set --- cli.js | 3 ++- cli.ts | 17 +++++------------ exp.js | 2 ++ lib/cli-commands/watching/index.js | 2 +- lib/cli-commands/watching/index.ts | 3 +-- lib/test-suite-methods/make-describe.ts | 4 ++-- suman.conf.js | 9 ++++++--- test/.suman/gantt-4.html | 2 +- 8 files changed, 20 insertions(+), 22 deletions(-) diff --git a/cli.js b/cli.js index 3ae19cdf..b6a018b6 100755 --- a/cli.js +++ b/cli.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); debugger; var process = require('suman-browser-polyfills/modules/process'); @@ -53,6 +53,7 @@ process.on('uncaughtException', function (err) { }, 500); }); process.on('unhandledRejection', function (err, p) { + debugger; if (typeof err !== 'object') { console.error(new Error("err passed to unhandledRejection was not an object => '" + err + "'").stack); err = new Error(typeof err === 'string' ? err : util.inspect(err)); diff --git a/cli.ts b/cli.ts index 767eaaae..d3e4ca42 100755 --- a/cli.ts +++ b/cli.ts @@ -1,19 +1,11 @@ #!/usr/bin/env node +'use strict'; -/////////////////////////////////////////////////////////////////// - -import {IGlobalSumanObj} from "./dts/global"; +//dts +import {IGlobalSumanObj} from "suman-types/dts/global"; debugger; //leave here forever so users can easily debug with "node --inspect" or "node debug" -/////////////////////////////////////////////////////////////////// - -/* - Note for the reader: Suman uses dashdash to parse command line arguments - We found dashdash to be a better alternative to other option parsers - => https://github.com/trentm/node-dashdash - */ - //polyfills const process = require('suman-browser-polyfills/modules/process'); const global = require('suman-browser-polyfills/modules/global'); @@ -85,6 +77,8 @@ process.on('uncaughtException', function (err: Error) { process.on('unhandledRejection', function (err: Error, p: Promise) { + debugger; + if (typeof err !== 'object') { console.error(new Error(`err passed to unhandledRejection was not an object => '${err}'`).stack); err = new Error(typeof err === 'string' ? err : util.inspect(err)) @@ -572,7 +566,6 @@ else if (uninstall) { removeBabel: removeBabel, }); } - else if (convert) { require('./lib/cli-commands/convert-mocha').run(projectRoot, src, dest, force); } diff --git a/exp.js b/exp.js index 719ab1da..e277108c 100644 --- a/exp.js +++ b/exp.js @@ -11,6 +11,8 @@ // hi +// + const path = require('path'); console.error(`${path.basename(__dirname)} reporter may be unable to properly indent output.`); diff --git a/lib/cli-commands/watching/index.js b/lib/cli-commands/watching/index.js index 55ef6b0f..c04bbca4 100755 --- a/lib/cli-commands/watching/index.js +++ b/lib/cli-commands/watching/index.js @@ -18,7 +18,7 @@ exports.run = function (paths, sumanOpts, sumanConfig) { assert(suman_utils_1.default.isObject(sumanConfig.watch), chalk.red(' => Suman usage error => suman.conf.js needs a "watch" property that is an object.')); assert(suman_utils_1.default.isObject(sumanConfig.watch.per), chalk.red(' => Suman usage error => suman.conf.js "watch" object, needs property called "per" that is an object.')); watchPer = sumanConfig.watch.per[sumanOpts.watch_per]; - assert(suman_utils_1.default.isObject(watchPer), chalk.red(" => Suman usage error => key \"" + sumanOpts.watch_per + "\", \n does not exist on the {suman.conf.js}.watch.per object.")); + assert(suman_utils_1.default.isObject(watchPer), chalk.red("Suman usage error => key \"" + sumanOpts.watch_per + "\" does not exist on the {suman.conf.js}.watch.per object.")); } var watchOpts = Object.freeze({ paths: paths, diff --git a/lib/cli-commands/watching/index.ts b/lib/cli-commands/watching/index.ts index ef352d80..b0dd70b1 100755 --- a/lib/cli-commands/watching/index.ts +++ b/lib/cli-commands/watching/index.ts @@ -45,8 +45,7 @@ export const run = function (paths: Array, sumanOpts: ISumanOpts, sumanC watchPer = sumanConfig.watch.per[sumanOpts.watch_per]; assert(su.isObject(watchPer), - chalk.red(` => Suman usage error => key "${sumanOpts.watch_per}", - does not exist on the {suman.conf.js}.watch.per object.`)); + chalk.red(`Suman usage error => key "${sumanOpts.watch_per}" does not exist on the {suman.conf.js}.watch.per object.`)); } const watchOpts = Object.freeze({ diff --git a/lib/test-suite-methods/make-describe.ts b/lib/test-suite-methods/make-describe.ts index 7af9ac47..f89e4d2d 100755 --- a/lib/test-suite-methods/make-describe.ts +++ b/lib/test-suite-methods/make-describe.ts @@ -65,13 +65,13 @@ const handleBadOptions = function (opts: IDescribeOpts) { }); }; -/////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////// export const makeDescribe = function (suman: ISuman, gracefulExit: Function, TestSuiteMaker: TTestSuiteMaker, zuite: ITestSuite, notifyParentThatChildIsComplete: Function, blockInjector: Function): IDescribeFn { - ////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////// return function ($$desc: string, $opts: IDescribeOpts) { diff --git a/suman.conf.js b/suman.conf.js index 623f9890..4c1e4a67 100755 --- a/suman.conf.js +++ b/suman.conf.js @@ -80,21 +80,24 @@ module.exports = Object.freeze({ 'node-dev': { exec: 'suman test/src/dev/node', includes: [__dirname], - excludes: ['/test/'], + excludes: ['/test/', /\.ts$/], confOverride: {} } }, 'browser-dev': { exec: 'suman test/src/dev/browser', includes: [__dirname], - excludes: ['/test/'], + excludes: ['/test/',/\.ts$/], confOverride: {} } }, + + /////////////// + scripts: { // usage: $ suman --scripts example - example: 'export NODE_ENV=test; echo "I love hippos"; echo "zoom => ${NODE_ENV}"' + example: 'export NODE_ENV=test; echo "I love 45"; echo "NODE_ENV value => ${NODE_ENV}"' }, reporters: { diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 558a9600..089ecafa 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506840133006,"endDate":1506840133540,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506840133000,"endDate":1506840133540,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506895358737,"endDate":1506895359252,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506895358733,"endDate":1506895359252,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; From 9887302e39797aad68ff36c793bd8f33e33eea20 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sun, 1 Oct 2017 22:08:39 -0700 Subject: [PATCH 19/32] pdev:set --- cli.js | 2 +- cli.ts | 2 +- config/suman-constants.d.ts | 1 + config/suman-constants.js | 1 + config/suman-constants.ts | 2 + lib/cli-commands/watching/index.d.ts | 2 +- lib/cli-commands/watching/index.js | 26 ++------- lib/cli-commands/watching/index.ts | 43 +++++++------- lib/helpers/log-stdio-of-child.ts | 10 ++-- lib/index-helpers/handle-integrants.js | 12 ++-- lib/index-helpers/handle-integrants.ts | 14 ++++- .../handle-runner-request-response.js | 2 +- .../handle-runner-request-response.ts | 2 +- lib/index-helpers/socketio-child-client.js | 13 +++-- lib/index-helpers/socketio-child-client.ts | 25 +++++++-- lib/run.js | 16 +++--- lib/run.ts | 7 +-- .../handle-multiple-processes.js | 56 ++++++++++--------- .../handle-multiple-processes.ts | 46 ++++++++------- .../multiple-process-each-on-exit.js | 14 ++--- .../multiple-process-each-on-exit.ts | 29 +++++----- lib/suman.js | 2 +- lib/suman.ts | 4 +- scripts/touch.sh | 3 + suman-todos.txt | 9 +++ suman.conf.js | 4 +- test/.suman/gantt-4.html | 2 +- 27 files changed, 188 insertions(+), 161 deletions(-) create mode 100755 scripts/touch.sh diff --git a/cli.js b/cli.js index b6a018b6..605237e8 100755 --- a/cli.js +++ b/cli.js @@ -416,7 +416,7 @@ else if (s) { require('./lib/cli-commands/start-suman-server')(sumanServerInstalled, sumanConfig, serverName); } else if (watch || watchPer) { - require('./lib/cli-commands/watching').run(paths, sumanOpts, sumanConfig); + require('./lib/cli-commands/watching').run(projectRoot, paths, sumanOpts, sumanConfig); } else if (groups) { require('./lib/cli-commands/groups').run(paths); diff --git a/cli.ts b/cli.ts index d3e4ca42..0ac2761b 100755 --- a/cli.ts +++ b/cli.ts @@ -573,7 +573,7 @@ else if (s) { require('./lib/cli-commands/start-suman-server')(sumanServerInstalled, sumanConfig, serverName); } else if (watch || watchPer) { - require('./lib/cli-commands/watching').run(paths, sumanOpts, sumanConfig); + require('./lib/cli-commands/watching').run(projectRoot, paths, sumanOpts, sumanConfig); } else if (groups) { require('./lib/cli-commands/groups').run(paths); diff --git a/config/suman-constants.d.ts b/config/suman-constants.d.ts index 303d3f86..0ef5df0f 100755 --- a/config/suman-constants.d.ts +++ b/config/suman-constants.d.ts @@ -5,6 +5,7 @@ export declare const constants: Readonly<{ DEFAULT_PARALLEL_TOTAL_LIMIT: number; DEFAULT_PARALLEL_TEST_LIMIT: number; DEFAULT_PARALLEL_BLOCK_LIMIT: number; + DEFAULT_CHILD_PROCESS_TIMEOUT: number; OLDEST_SUPPORTED_NODE_VERSION: string; DEBUGGING_ENV: { name: string; diff --git a/config/suman-constants.js b/config/suman-constants.js index 6a0c5351..67aaddd3 100755 --- a/config/suman-constants.js +++ b/config/suman-constants.js @@ -8,6 +8,7 @@ exports.constants = Object.freeze({ DEFAULT_PARALLEL_TOTAL_LIMIT: 30, DEFAULT_PARALLEL_TEST_LIMIT: 10, DEFAULT_PARALLEL_BLOCK_LIMIT: 10, + DEFAULT_CHILD_PROCESS_TIMEOUT: 6000000, OLDEST_SUPPORTED_NODE_VERSION: 'v4.0.0', DEBUGGING_ENV: { name: 'SUMAN_DEBUG', diff --git a/config/suman-constants.ts b/config/suman-constants.ts index df65a70a..0ab925eb 100755 --- a/config/suman-constants.ts +++ b/config/suman-constants.ts @@ -12,6 +12,8 @@ export const constants = Object.freeze({ DEFAULT_PARALLEL_TEST_LIMIT: 10, DEFAULT_PARALLEL_BLOCK_LIMIT: 10, + DEFAULT_CHILD_PROCESS_TIMEOUT: 6000000, + OLDEST_SUPPORTED_NODE_VERSION: 'v4.0.0', DEBUGGING_ENV: { diff --git a/lib/cli-commands/watching/index.d.ts b/lib/cli-commands/watching/index.d.ts index c0e5c7ff..ea174f8e 100755 --- a/lib/cli-commands/watching/index.d.ts +++ b/lib/cli-commands/watching/index.d.ts @@ -1,2 +1,2 @@ import { ISumanConfig, ISumanOpts } from "suman-types/dts/global"; -export declare const run: (paths: string[], sumanOpts: ISumanOpts, sumanConfig: ISumanConfig) => void; +export declare const run: (projectRoot: string, paths: string[], sumanOpts: ISumanOpts, sumanConfig: ISumanConfig) => void; diff --git a/lib/cli-commands/watching/index.js b/lib/cli-commands/watching/index.js index c04bbca4..d6af6aa6 100755 --- a/lib/cli-commands/watching/index.js +++ b/lib/cli-commands/watching/index.js @@ -2,34 +2,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); -var assert = require("assert"); -var suman_utils_1 = require("suman-utils"); var chalk = require("chalk"); var suman_watch_1 = require("suman-watch"); var _suman = global.__suman = (global.__suman || {}); -exports.run = function (paths, sumanOpts, sumanConfig) { - console.log(' => Suman message => --watch option selected => Suman will watch files in your project, and run your tests on changes.'); - if (_suman.sumanOpts.verbosity > 2) { - console.log(' => Suman message => --watch option selected => Using the "watch" property object in your suman.conf.js file,' + +exports.run = function (projectRoot, paths, sumanOpts, sumanConfig) { + _suman.log('"--watch" option selected => Suman will watch files in your project, and run your tests on changes.'); + if (sumanOpts.verbosity > 2) { + _suman.log('"--watch" option selected => Using the "watch" property object in your suman.conf.js file,' + 'you can also configure Suman to do whatever you want based off a file change.'); } - var watchPer = null; - if (sumanOpts.watch_per) { - assert(suman_utils_1.default.isObject(sumanConfig.watch), chalk.red(' => Suman usage error => suman.conf.js needs a "watch" property that is an object.')); - assert(suman_utils_1.default.isObject(sumanConfig.watch.per), chalk.red(' => Suman usage error => suman.conf.js "watch" object, needs property called "per" that is an object.')); - watchPer = sumanConfig.watch.per[sumanOpts.watch_per]; - assert(suman_utils_1.default.isObject(watchPer), chalk.red("Suman usage error => key \"" + sumanOpts.watch_per + "\" does not exist on the {suman.conf.js}.watch.per object.")); - } - var watchOpts = Object.freeze({ - paths: paths, - watchPer: watchPer, - noTranspile: sumanOpts.no_transpile, - noRun: sumanOpts.no_run - }); - suman_watch_1.run(watchOpts, function (err) { + suman_watch_1.runWatch(projectRoot, paths, sumanConfig, sumanOpts, function (err) { if (err) { console.log('\n'); console.error(err.stack || err); + console.log('\n'); process.exit(1); } else { diff --git a/lib/cli-commands/watching/index.ts b/lib/cli-commands/watching/index.ts index b0dd70b1..57dac62c 100755 --- a/lib/cli-commands/watching/index.ts +++ b/lib/cli-commands/watching/index.ts @@ -18,47 +18,42 @@ import * as stream from 'stream'; //npm import su from 'suman-utils'; import * as chalk from 'chalk'; -import {run as runWatch} from 'suman-watch'; +import {runWatch} from 'suman-watch'; //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); ///////////////////////////////////////////////////////////////////////// -export const run = function (paths: Array, sumanOpts: ISumanOpts, sumanConfig: ISumanConfig) { +export const run = function (projectRoot: string, paths: Array, sumanOpts: ISumanOpts, sumanConfig: ISumanConfig) { - console.log(' => Suman message => --watch option selected => Suman will watch files in your project, and run your tests on changes.'); - if (_suman.sumanOpts.verbosity > 2) { - console.log(' => Suman message => --watch option selected => Using the "watch" property object in your suman.conf.js file,' + + _suman.log('"--watch" option selected => Suman will watch files in your project, and run your tests on changes.'); + if (sumanOpts.verbosity > 2) { + _suman.log('"--watch" option selected => Using the "watch" property object in your suman.conf.js file,' + 'you can also configure Suman to do whatever you want based off a file change.'); } - let watchPer = null; - if (sumanOpts.watch_per) { - assert(su.isObject(sumanConfig.watch), - chalk.red(' => Suman usage error => suman.conf.js needs a "watch" property that is an object.')); + // const watchOpts = Object.freeze({ + // paths, + // watchPer, + // noTranspile: sumanOpts.no_transpile, + // noRun: sumanOpts.no_run + // }); - assert(su.isObject(sumanConfig.watch.per), - chalk.red(' => Suman usage error => suman.conf.js "watch" object, needs property called "per" that is an object.')); - watchPer = sumanConfig.watch.per[sumanOpts.watch_per]; + // const watchOpts = { + // paths, + // watchPer: sumanOpts.watch_per, + // noRun: sumanOpts.no_run, + // noTranspile: sumanOpts.no_transpile + // }; - assert(su.isObject(watchPer), - chalk.red(`Suman usage error => key "${sumanOpts.watch_per}" does not exist on the {suman.conf.js}.watch.per object.`)); - } - - const watchOpts = Object.freeze({ - paths, - watchPer, - noTranspile: sumanOpts.no_transpile, - noRun: sumanOpts.no_run - }); - - runWatch(watchOpts, function (err: Error) { + runWatch(projectRoot, paths, sumanConfig, sumanOpts, function (err: Error) { if (err) { console.log('\n'); console.error(err.stack || err); + console.log('\n'); process.exit(1); } else { diff --git a/lib/helpers/log-stdio-of-child.ts b/lib/helpers/log-stdio-of-child.ts index 5026690c..19362706 100755 --- a/lib/helpers/log-stdio-of-child.ts +++ b/lib/helpers/log-stdio-of-child.ts @@ -16,10 +16,8 @@ const replaceStrm = require('replacestream'); import * as chalk from 'chalk'; //project -const _suman : IGlobalSumanObj = global.__suman = (global.__suman || {}); +const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); import su = require('suman-utils'); - - const SUMAN_SINGLE_PROCESS = process.env.SUMAN_SINGLE_PROCESS === 'yes'; //////////////////////////////////////////////////////////////////////////////// @@ -36,7 +34,7 @@ export const run = function (filePath: string) { if (process.env.MAKE_SUMAN_LOG !== 'no') { - _suman.log('we are logging child stdout/stderr to files.','\n'); + _suman.log('we are logging child stdout/stderr to files.', '\n'); const timestamp = process.env.SUMAN_RUNNER_TIMESTAMP; const runId = process.env.SUMAN_RUN_ID; const logsDir = _suman.sumanConfig.logsDir || _suman.sumanHelperDirRoot + '/logs'; @@ -80,7 +78,7 @@ export const run = function (filePath: string) { process.stderr.write = function () { _suman.isStrmDrained = false; isDeleteFile = false; - if(writeToFileStream){ + if (writeToFileStream) { try { strm.write.apply(strm, arguments); } @@ -99,7 +97,7 @@ export const run = function (filePath: string) { process.stdout.write = function () { _suman.isStrmDrained = false; isDeleteFile = false; - if(writeToFileStream){ + if (writeToFileStream) { strm.write.apply(strm, arguments); } stdoutWrite.apply(process.stdout, arguments); diff --git a/lib/index-helpers/handle-integrants.js b/lib/index-helpers/handle-integrants.js index e7c352f9..9f999797 100755 --- a/lib/index-helpers/handle-integrants.js +++ b/lib/index-helpers/handle-integrants.js @@ -32,13 +32,17 @@ exports.handleIntegrants = function (integrants, $oncePost, integrantPreFn, $mod if (waitForResponseFromRunnerRegardingPostList) { postOnlyReady = false; } + var client, usingRunner = _suman.usingRunner; if (integrants.length < 1) { + if (usingRunner) { + client = socketio_child_client_1.getClient(); + } integrantsFn = function () { return Promise.resolve({}); }; } - else if (_suman.usingRunner) { - var client_1 = socketio_child_client_1.getClient(); + else if (usingRunner) { + client = socketio_child_client_1.getClient(); integrantsFn = function () { return new Promise(function (resolve, reject) { var oncePreVals; @@ -61,8 +65,8 @@ exports.handleIntegrants = function (integrants, $oncePost, integrantPreFn, $mod } }; var INTEGRANT_INFO = suman_constants_1.constants.runner_message_type.INTEGRANT_INFO; - client_1.on(INTEGRANT_INFO, integrantMessage); - client_1.emit(INTEGRANT_INFO, { + client.on(INTEGRANT_INFO, integrantMessage); + client.emit(INTEGRANT_INFO, { type: INTEGRANT_INFO, msg: integrants, oncePost: $oncePost, diff --git a/lib/index-helpers/handle-integrants.ts b/lib/index-helpers/handle-integrants.ts index 471bed36..6ae050e1 100755 --- a/lib/index-helpers/handle-integrants.ts +++ b/lib/index-helpers/handle-integrants.ts @@ -57,14 +57,22 @@ export const handleIntegrants = function (integrants: Array, $oncePost: postOnlyReady = false; } + let client: SocketIOClient.Socket, usingRunner = _suman.usingRunner; + if (integrants.length < 1) { + + if (usingRunner) { + // we need to establish a connection now, to get ahead of things + client = getClient(); + } + integrantsFn = function () { return Promise.resolve({}); } } - else if (_suman.usingRunner) { + else if (usingRunner) { - const client = getClient(); + client = getClient(); integrantsFn = function () { @@ -143,7 +151,7 @@ export const handleIntegrants = function (integrants: Array, $oncePost: d.run(function () { - if(!integPreConfiguration){ + if (!integPreConfiguration) { throw new Error('suman implementation error, missing definition.'); } // with suman single process, or not, we acquire integrants the same way diff --git a/lib/index-helpers/handle-runner-request-response.js b/lib/index-helpers/handle-runner-request-response.js index 5fe85a96..74f1f3d9 100755 --- a/lib/index-helpers/handle-runner-request-response.js +++ b/lib/index-helpers/handle-runner-request-response.js @@ -35,7 +35,7 @@ exports.handleRequestResponseWithRunner = function (data) { timedout = true; _suman.logError('Action to receive table data response from runner timed out.'); cb(null); - }, 100); + }, 1000); client.on(TABLE_DATA, function onTableDataReceived(data) { if (data.info = 'table-data-received' && timedout === false) { clearTimeout(to); diff --git a/lib/index-helpers/handle-runner-request-response.ts b/lib/index-helpers/handle-runner-request-response.ts index 8e3928aa..073746fb 100755 --- a/lib/index-helpers/handle-runner-request-response.ts +++ b/lib/index-helpers/handle-runner-request-response.ts @@ -61,7 +61,7 @@ export const handleRequestResponseWithRunner = function (data: Array) { timedout = true; _suman.logError('Action to receive table data response from runner timed out.'); cb(null); - }, 100); + }, 1000); client.on(TABLE_DATA, function onTableDataReceived(data: Object) { if (data.info = 'table-data-received' && timedout === false) { diff --git a/lib/index-helpers/socketio-child-client.js b/lib/index-helpers/socketio-child-client.js index 45f57f88..d67f1996 100755 --- a/lib/index-helpers/socketio-child-client.js +++ b/lib/index-helpers/socketio-child-client.js @@ -4,17 +4,22 @@ var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); var Client = require("socket.io-client"); var client = null; +var _suman = global.__suman = (global.__suman || {}); exports.getClient = function () { if (!client) { - client = Client("http://localhost:" + process.env.SUMAN_SOCKETIO_SERVER_PORT); + var port = process.env.SUMAN_SOCKETIO_SERVER_PORT; + if (!port) { + throw new Error('Suman implementation error, no port specified by "SUMAN_SOCKETIO_SERVER_PORT" env var.'); + } + client = Client("http://localhost:" + port); client.on('connect', function () { - console.log('client connected.'); + _suman.logWarning('client connected.'); }); client.on('event', function (data) { - console.log('event data => ', data); + _suman.log('event data => ', data); }); client.on('disconnect', function () { - console.log('client disconnected.'); + _suman.logError('client disconnected.'); }); } return client; diff --git a/lib/index-helpers/socketio-child-client.ts b/lib/index-helpers/socketio-child-client.ts index a56b00ac..1beeae17 100755 --- a/lib/index-helpers/socketio-child-client.ts +++ b/lib/index-helpers/socketio-child-client.ts @@ -1,15 +1,19 @@ 'use strict'; +//dts +import {IGlobalSumanObj} from 'suman-types/dts/global'; + //polyfills const process = require('suman-browser-polyfills/modules/process'); const global = require('suman-browser-polyfills/modules/global'); //npm import * as Client from 'socket.io-client'; - +import su = require('suman-utils'); //project -let client : SocketIOClient.Socket = null; +let client: SocketIOClient.Socket = null; +const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); //////////////////////////////////////////////////////////////// @@ -17,15 +21,24 @@ export const getClient = function () { if (!client) { - client = Client(`http://localhost:${process.env.SUMAN_SOCKETIO_SERVER_PORT}`); + const port = process.env.SUMAN_SOCKETIO_SERVER_PORT; + + if (!port) { + throw new Error('Suman implementation error, no port specified by "SUMAN_SOCKETIO_SERVER_PORT" env var.'); + } + + client = Client(`http://localhost:${port}`); + client.on('connect', function () { - console.log('client connected.'); + _suman.logWarning('client connected.'); }); + client.on('event', function (data: string) { - console.log('event data => ', data); + _suman.log('event data => ', data); }); + client.on('disconnect', function () { - console.log('client disconnected.'); + _suman.logError('client disconnected.'); }); } diff --git a/lib/run.js b/lib/run.js index d6cbf58b..f14852f5 100755 --- a/lib/run.js +++ b/lib/run.js @@ -9,7 +9,7 @@ var EE = require("events"); var async = require("async"); var shuffle = require('lodash.shuffle'); var chalk = require("chalk"); -var suman_utils_1 = require("suman-utils"); +var su = require("suman-utils"); var rimraf = require('rimraf'); var events = require('suman-events').events; var debug = require('suman-debug')('s:cli'); @@ -22,7 +22,7 @@ var ascii = require('./helpers/ascii'); var constants = require('../config/suman-constants').constants; var findFilesToRun = require('./runner-helpers/get-file-paths').findFilesToRun; var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); -var dbPth = path.resolve(process.env.HOME + '/.suman/database/exec_db'); +var dbPth = path.resolve(sumanHome + '/database/exec_db'); exports.run = function (sumanOpts, paths) { var logsDir = _suman.sumanConfig.logsDir || _suman.sumanHelperDirRoot + '/logs'; var sumanCPLogs = path.resolve(logsDir + '/runs'); @@ -126,7 +126,7 @@ exports.run = function (sumanOpts, paths) { findFilesToRun(paths, cb); }, findSumanMarkers: function (getFilesToRun, cb) { - suman_utils_1.default.findSumanMarkers(['@run.sh', '@transform.sh', '@config.json'], testDir, getFilesToRun.files, function (err, map) { + su.findSumanMarkers(['@run.sh', '@transform.sh', '@config.json'], testDir, getFilesToRun.files, function (err, map) { if (err) { cb(err); } @@ -145,7 +145,7 @@ exports.run = function (sumanOpts, paths) { } }, getRunId: function (cb) { - var first = suman_utils_1.default.once(this, cb); + var first = su.once(this, cb); function createDir(runId) { var p = path.resolve(sumanCPLogs + '/' + timestamp + '-' + runId); mkdirp(p, 511, first); @@ -190,7 +190,7 @@ exports.run = function (sumanOpts, paths) { _suman.logError('fatal problem => ' + (err.stack || err), '\n'); return process.exit(1); } - if (suman_utils_1.default.vgt(9)) { + if (su.vgt(9)) { _suman.log('"$ npm list -g" results: ', results.npmList); } function changeCWDToRootOrTestDir(p) { @@ -214,7 +214,7 @@ exports.run = function (sumanOpts, paths) { process.exit(constants.RUNNER_EXIT_CODES.UNEXPECTED_FATAL_ERROR); }); resultBroadcaster.emit(String(events.RUNNER_TEST_PATHS_CONFIRMATION), files); - if (suman_utils_1.default.vgt(6) || sumanOpts.dry_run) { + if (su.vgt(6) || sumanOpts.dry_run) { console.log(' ', chalk.bgCyan.magenta(' => Suman verbose message => ' + 'Suman will execute test files from the following locations:'), '\n', files, '\n'); } @@ -230,11 +230,11 @@ exports.run = function (sumanOpts, paths) { files = shuffle(files); } _suman.sumanSingleProcessStartTime = Date.now(); - require('./run-child-not-runner').run(suman_utils_1.default.removeSharedRootPath(files)); + require('./run-child-not-runner').run(su.removeSharedRootPath(files)); }); } else if (!sumanOpts.runner && !sumanOpts.containerize - && !sumanOpts.coverage && files.length === 1 && suman_utils_1.default.checkStatsIsFile(files[0]) && !nonJSFile) { + && !sumanOpts.coverage && files.length === 1 && su.checkStatsIsFile(files[0]) && !nonJSFile) { console.log(ascii.suman_slant, '\n'); d.run(function () { changeCWDToRootOrTestDir(files[0]); diff --git a/lib/run.ts b/lib/run.ts index dbd3662c..965b7384 100755 --- a/lib/run.ts +++ b/lib/run.ts @@ -1,6 +1,6 @@ 'use strict'; -//ts +//dts import {IGlobalSumanObj, ISumanOpts} from "suman-types/dts/global"; //polyfills @@ -21,7 +21,7 @@ import cp = require('child_process'); import * as async from 'async'; const shuffle = require('lodash.shuffle'); import * as chalk from 'chalk'; -import su, {IMapValue} from 'suman-utils'; +import * as su from 'suman-utils'; import {IGetFilePathObj} from "./runner-helpers/get-file-paths"; const rimraf = require('rimraf'); const {events} = require('suman-events'); @@ -36,10 +36,9 @@ const noFilesFoundError = require('./helpers/no-files-found-error'); const ascii = require('./helpers/ascii'); const {constants} = require('../config/suman-constants'); import {findSumanServer} from './helpers/find-suman-server'; - const {findFilesToRun} = require('./runner-helpers/get-file-paths'); const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); -const dbPth = path.resolve(process.env.HOME + '/.suman/database/exec_db'); +const dbPth = path.resolve(sumanHome + '/database/exec_db'); ////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/runner-helpers/handle-multiple-processes.js b/lib/runner-helpers/handle-multiple-processes.js index 444d5754..12768307 100755 --- a/lib/runner-helpers/handle-multiple-processes.js +++ b/lib/runner-helpers/handle-multiple-processes.js @@ -11,18 +11,18 @@ var semver = require("semver"); var merge = require('lodash.merge'); var shuffle = require('lodash.shuffle'); var suman_events_1 = require("suman-events"); -var suman_utils_1 = require("suman-utils"); +var su = require("suman-utils"); var async = require("async"); var noFilesFoundError = require('../helpers/no-files-found-error'); var chalk = require("chalk"); var _suman = global.__suman = (global.__suman || {}); +var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); var runnerUtils = require('./runner-utils'); var socket_cp_hash_1 = require("./socket-cp-hash"); var getTapParser = require('./handle-tap').getTapParser; var getTapJSONParser = require('./handle-tap-json').getTapJSONParser; var constants = require('../../config/suman-constants').constants; var debug = require('suman-debug')('s:runner'); -var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); var multiple_process_each_on_exit_1 = require("./multiple-process-each-on-exit"); var prepend_transform_1 = require("prepend-transform"); var runChildPath = require.resolve(__dirname + '/run-child.js'); @@ -83,7 +83,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, files = shuffle(files); } runnerObj.startTime = Date.now(); - var fileObjArray = suman_utils_1.default.removeSharedRootPath(files); + var fileObjArray = su.removeSharedRootPath(files); var sumanEnv = Object.assign({}, process.env, { SUMAN_RUN_CHILD_STATIC_PATH: runChildPath, SUMAN_CONFIG: JSON.stringify(sumanConfig), @@ -101,6 +101,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, var istanbulExecPath = _suman.istanbulExecPath || 'istanbul'; var isStdoutSilent = sumanOpts.stdout_silent || sumanOpts.silent; var isStderrSilent = sumanOpts.stderr_silent || sumanOpts.silent; + var inheritTransformStdio = sumanOpts.inherit_all_stdio || sumanOpts.inherit_transform_stdio || process.env.SUMAN_INHERIT_STDIO; fileObjArray.forEach(function (fileShortAndFull) { var uuid = String(uuidV4()); var file = fileShortAndFull[0]; @@ -134,7 +135,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, if (tr) { _suman.log(chalk.bgWhite.underline('Suman has found a @transform.sh file => '), chalk.bold(tr)); transpileQueue.push(function (cb) { - suman_utils_1.default.makePathExecutable(tr, function (err) { + su.makePathExecutable(tr, function (err) { if (err) { return cb(err); } @@ -152,18 +153,18 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, var ln = String(_suman.projectRoot).length; if (false) { var onError = function (e) { - _suman.logError('\n', suman_utils_1.default.getCleanErrorString(e), '\n'); + _suman.logError('\n', su.getCleanErrorString(e), '\n'); }; - var temp = suman_utils_1.default.removePath(file, _suman.projectRoot); + var temp = su.removePath(file, _suman.projectRoot); var onlyFile = String(temp).replace(/\//g, '.'); var logfile = path.resolve(f + '/' + onlyFile + '.log'); var fileStrm = fs.createWriteStream(logfile); k.stderr.pipe(fileStrm).once('error', onError); k.stdout.pipe(fileStrm).once('error', onError); } - if (sumanOpts.inherit_all_stdio || sumanOpts.inherit_transform_stdio || process.env.SUMAN_INHERIT_STDIO) { + if (inheritTransformStdio) { var onError = function (e) { - _suman.logError('\n', suman_utils_1.default.getCleanErrorString(e), '\n'); + _suman.logError('\n', su.getCleanErrorString(e), '\n'); }; var stderrPrepend = " [" + chalk.red('transform process stderr:') + " " + chalk.red.bold(String(file.slice(ln))) + "] "; k.stderr.pipe(prepend_transform_1.default(stderrPrepend, { omitWhitespace: true })).once('error', onError).pipe(process.stderr); @@ -201,6 +202,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, } }); var childId = 1; + var inheritRunStdio = sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes'; var outer = function (file, shortFile, stdout, gd) { var run = function () { if (runnerObj.bailed) { @@ -305,12 +307,12 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, socket_cp_hash_1.cpHash[$childId] = n; if (!_suman.weAreDebugging) { n.to = setTimeout(function () { - console.error(' => Suman killed child process because it timed out => \n', (n.fileName || n.filename)); + _suman.logError("Suman killed a child process because it timed out: '" + (n.fileName || n.filename) + "'."); n.kill('SIGINT'); setTimeout(function () { n.kill('SIGKILL'); - }, 18000); - }, 6000000); + }, 8000); + }, constants.DEFAULT_CHILD_PROCESS_TIMEOUT); } n.testPath = file; n.shortTestPath = shortFile; @@ -337,9 +339,9 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, n.stderr.setEncoding('utf8'); if (sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files) { var onError = function (e) { - _suman.logError('\n', suman_utils_1.default.getCleanErrorString(e), '\n'); + _suman.logError('\n', su.getCleanErrorString(e), '\n'); }; - var temp = suman_utils_1.default.removePath(file, _suman.projectRoot); + var temp = su.removePath(file, _suman.projectRoot); var onlyFile = String(temp).replace(/\//g, '.'); var logfile = path.resolve(f + '/' + onlyFile + '.log'); var fileStrm = fs.createWriteStream(logfile); @@ -350,9 +352,9 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, n.stdout.pipe(fileStrm).once('error', onError); } } - if (sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes') { + if (inheritRunStdio) { var onError = function (e) { - _suman.logError('\n', suman_utils_1.default.getCleanErrorString(e), '\n'); + _suman.logError('\n', su.getCleanErrorString(e), '\n'); }; n.stdout.pipe(prepend_transform_1.default(chalk.cyan(' [suman child stdout] '))) .once('error', onError).pipe(process.stdout); @@ -363,11 +365,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, n.tapOutputIsComplete = false; n.stdout.pipe(getTapParser()) .on('error', function (e) { - _suman.logError('error parsing TAP output => ', suman_utils_1.default.getCleanErrorString(e)); - }); - n.stdout.pipe(getTapJSONParser()) - .on('error', function (e) { - _suman.logError('error parsing TAP JSON output => ', suman_utils_1.default.getCleanErrorString(e)); + _suman.logError('error parsing TAP output =>', su.getCleanErrorString(e)); }) .once('finish', function () { n.tapOutputIsComplete = true; @@ -375,14 +373,20 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, n.emit('tap-output-is-complete', true); }); }); + n.stdout.pipe(getTapJSONParser()) + .on('error', function (e) { + _suman.logError('error parsing TAP JSON output =>', su.getCleanErrorString(e)); + }); } n.stdio[2].setEncoding('utf-8'); n.stdio[2].on('data', function (data) { var d = String(data).split('\n').filter(function (line) { return String(line).length; - }).map(function (line) { + }) + .map(function (line) { return '[' + n.shortTestPath + '] ' + line; - }).join('\n'); + }) + .join('\n'); _suman.sumanStderrStream.write('\n\n'); _suman.sumanStderrStream.write(d); if (_suman.weAreDebugging) { @@ -391,7 +395,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, }); } else { - if (suman_utils_1.default.vgt(2)) { + if (su.vgt(2)) { _suman.logWarning('Stdio object not available for child process.'); } } @@ -401,20 +405,20 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, run.testPath = file; run.shortTestPath = shortFile; if (handleBlocking.runNext(run)) { - if (suman_utils_1.default.vgt(3) || suman_utils_1.default.isSumanDebug()) { + if (su.vgt(3) || su.isSumanDebug()) { _suman.log('File has just started running =>', chalk.blue(file), '\n'); } } else { runnerObj.queuedCPs.push(run); _suman.log('File is blocked by Suman runner =>', file); - if (suman_utils_1.default.isSumanDebug()) { + if (su.isSumanDebug()) { _suman.log('File is blocked by Suman runner =>', file); } } if (waitForAllTranformsToFinish) { if (forkedCPs.length < 1 && runnerObj.queuedCPs.length > 0) { - throw new Error(' => Suman internal error => fatal start order algorithm error, ' + + throw new Error('Suman internal error => fatal start order algorithm error, ' + 'please file an issue on Github, thanks.'); } if (forkedCPs.length < 1) { diff --git a/lib/runner-helpers/handle-multiple-processes.ts b/lib/runner-helpers/handle-multiple-processes.ts index 6c020752..965a5d26 100755 --- a/lib/runner-helpers/handle-multiple-processes.ts +++ b/lib/runner-helpers/handle-multiple-processes.ts @@ -16,29 +16,25 @@ import EE = require('events'); //npm import semver = require('semver'); - const merge = require('lodash.merge'); const shuffle = require('lodash.shuffle'); import {events} from 'suman-events'; -import su from 'suman-utils'; +import * as su from 'suman-utils'; import * as async from 'async'; - const noFilesFoundError = require('../helpers/no-files-found-error'); import * as chalk from 'chalk'; //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); +const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); const runnerUtils = require('./runner-utils'); import {cpHash, socketHash, ganttHash, IGanttHash, IGanttData} from './socket-cp-hash'; - const {getTapParser} = require('./handle-tap'); const {getTapJSONParser} = require('./handle-tap-json'); const {constants} = require('../../config/suman-constants'); const debug = require('suman-debug')('s:runner'); -const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); import onExitFn from './multiple-process-each-on-exit'; import pt from 'prepend-transform'; - const runChildPath = require.resolve(__dirname + '/run-child.js'); import uuidV4 = require('uuid/v4'); @@ -157,6 +153,8 @@ export const makeHandleMultipleProcesses = const istanbulExecPath = _suman.istanbulExecPath || 'istanbul'; const isStdoutSilent = sumanOpts.stdout_silent || sumanOpts.silent; const isStderrSilent = sumanOpts.stderr_silent || sumanOpts.silent; + const inheritTransformStdio = + sumanOpts.inherit_all_stdio || sumanOpts.inherit_transform_stdio || process.env.SUMAN_INHERIT_STDIO fileObjArray.forEach(function (fileShortAndFull: Array>) { @@ -244,7 +242,7 @@ export const makeHandleMultipleProcesses = k.stdout.pipe(fileStrm).once('error', onError); } - if (sumanOpts.inherit_all_stdio || sumanOpts.inherit_transform_stdio || process.env.SUMAN_INHERIT_STDIO) { + if (inheritTransformStdio) { let onError = function (e: Error) { _suman.logError('\n', su.getCleanErrorString(e), '\n'); @@ -310,6 +308,8 @@ export const makeHandleMultipleProcesses = }); let childId = 1; + const inheritRunStdio = + sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes' const outer = function (file: string, shortFile: string, stdout: string, gd: IGanttData) { @@ -453,13 +453,13 @@ export const makeHandleMultipleProcesses = if (!_suman.weAreDebugging) { n.to = setTimeout(function () { - console.error(' => Suman killed child process because it timed out => \n', - (n.fileName || n.filename)); + _suman.logError(`Suman killed a child process because it timed out: '${n.fileName || n.filename}'.`); n.kill('SIGINT'); setTimeout(function () { + // note that we wait 8 seconds for the child process to clean up before sending it a SIGKILL signal n.kill('SIGKILL'); - }, 18000); - }, 6000000); + }, 8000); + }, constants.DEFAULT_CHILD_PROCESS_TIMEOUT); } n.testPath = file; @@ -512,7 +512,7 @@ export const makeHandleMultipleProcesses = } } - if (sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes') { + if (inheritRunStdio) { let onError = function (e: Error) { _suman.logError('\n', su.getCleanErrorString(e), '\n'); @@ -525,16 +525,12 @@ export const makeHandleMultipleProcesses = } if (true || sumanOpts.$useTAPOutput) { + n.tapOutputIsComplete = false; n.stdout.pipe(getTapParser()) .on('error', function (e: Error) { - _suman.logError('error parsing TAP output => ', su.getCleanErrorString(e)); - }); - - n.stdout.pipe(getTapJSONParser()) - .on('error', function (e: Error) { - _suman.logError('error parsing TAP JSON output => ', su.getCleanErrorString(e)); + _suman.logError('error parsing TAP output =>', su.getCleanErrorString(e)); }) .once('finish', function () { n.tapOutputIsComplete = true; @@ -542,6 +538,12 @@ export const makeHandleMultipleProcesses = n.emit('tap-output-is-complete', true); }); }); + + n.stdout.pipe(getTapJSONParser()) + .on('error', function (e: Error) { + _suman.logError('error parsing TAP JSON output =>', su.getCleanErrorString(e)); + }) + } n.stdio[2].setEncoding('utf-8'); @@ -549,9 +551,11 @@ export const makeHandleMultipleProcesses = const d = String(data).split('\n').filter(function (line) { return String(line).length; - }).map(function (line) { + }) + .map(function (line) { return '[' + n.shortTestPath + '] ' + line; - }).join('\n'); + }) + .join('\n'); _suman.sumanStderrStream.write('\n\n'); _suman.sumanStderrStream.write(d); @@ -594,7 +598,7 @@ export const makeHandleMultipleProcesses = if (waitForAllTranformsToFinish) { if (forkedCPs.length < 1 && runnerObj.queuedCPs.length > 0) { - throw new Error(' => Suman internal error => fatal start order algorithm error, ' + + throw new Error('Suman internal error => fatal start order algorithm error, ' + 'please file an issue on Github, thanks.'); } diff --git a/lib/runner-helpers/multiple-process-each-on-exit.js b/lib/runner-helpers/multiple-process-each-on-exit.js index 48da67be..4710adb5 100755 --- a/lib/runner-helpers/multiple-process-each-on-exit.js +++ b/lib/runner-helpers/multiple-process-each-on-exit.js @@ -69,11 +69,9 @@ function default_1(n, runnerObj, tableRows, messages, forkedCPs, beforeExitRunOn } runnerObj.endTime = Date.now(); runnerObj.listening = false; - var waitForTAP = function () { - async.parallel([ - beforeExitRunOncePost, - coverage_reporting_1.handleTestCoverageReporting - ], function (err) { + var onTAPOutputComplete = function () { + var tasks = [beforeExitRunOncePost, coverage_reporting_1.handleTestCoverageReporting]; + async.parallel(tasks, function (err) { err && _suman.logError(err.stack || err); makeExit(messages, { total: runnerObj.endTime - _suman.startTime, @@ -83,14 +81,14 @@ function default_1(n, runnerObj, tableRows, messages, forkedCPs, beforeExitRunOn }; if ('tapOutputIsComplete' in n) { if (n.tapOutputIsComplete === true) { - process.nextTick(waitForTAP); + process.nextTick(onTAPOutputComplete); } else { - n.once('tap-output-is-complete', waitForTAP); + n.once('tap-output-is-complete', onTAPOutputComplete); } } else { - process.nextTick(waitForTAP); + process.nextTick(onTAPOutputComplete); } } else { diff --git a/lib/runner-helpers/multiple-process-each-on-exit.ts b/lib/runner-helpers/multiple-process-each-on-exit.ts index f0f98dc9..e7e353a5 100755 --- a/lib/runner-helpers/multiple-process-each-on-exit.ts +++ b/lib/runner-helpers/multiple-process-each-on-exit.ts @@ -112,31 +112,30 @@ export default function (n: ISumanChildProcess, runnerObj: IRunnerObj, tableRows runnerObj.endTime = Date.now(); runnerObj.listening = false; - const waitForTAP = function () { - async.parallel([ - beforeExitRunOncePost, - handleTestCoverageReporting - ] as any, - - function (err: IPseudoError) { - err && _suman.logError(err.stack || err); - makeExit(messages, { - total: runnerObj.endTime - _suman.startTime, - runner: runnerObj.endTime - runnerObj.startTime - }); + const onTAPOutputComplete = function () { + + const tasks = [beforeExitRunOncePost, handleTestCoverageReporting] as any; + + async.parallel(tasks, function (err: IPseudoError) { + err && _suman.logError(err.stack || err); + makeExit(messages, { + total: runnerObj.endTime - _suman.startTime, + runner: runnerObj.endTime - runnerObj.startTime }); + }); + }; if ('tapOutputIsComplete' in n) { if (n.tapOutputIsComplete === true) { - process.nextTick(waitForTAP); + process.nextTick(onTAPOutputComplete); } else { - n.once('tap-output-is-complete', waitForTAP); + n.once('tap-output-is-complete', onTAPOutputComplete); } } else { - process.nextTick(waitForTAP); + process.nextTick(onTAPOutputComplete); } } diff --git a/lib/suman.js b/lib/suman.js index e9c928a2..99d07bd6 100755 --- a/lib/suman.js +++ b/lib/suman.js @@ -223,9 +223,9 @@ var Suman = (function () { test: test, type: 'LOG_RESULT', }); - var client = socketio_child_client_1.getClient(); var LOG_RESULT = suman_constants_1.constants.runner_message_type.LOG_RESULT; if (global.usingBrowserEtcEtc) { + var client = socketio_child_client_1.getClient(); client.emit(LOG_RESULT, JSON.parse(str)); } resultBroadcaster.emit(String(suman_events_1.events.TEST_CASE_END), test); diff --git a/lib/suman.ts b/lib/suman.ts index d08ad80a..6752f7ab 100755 --- a/lib/suman.ts +++ b/lib/suman.ts @@ -34,10 +34,8 @@ const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); import {findSumanServer} from './helpers/find-suman-server'; import {ITestDataObj} from "suman-types/dts/it"; import {constants} from '../config/suman-constants'; - const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); import {getClient} from './index-helpers/socketio-child-client'; - let envTotal: number, envConfig: number; if (process.env.DEFAULT_PARALLEL_TOTAL_LIMIT && (envTotal = Number(process.env.DEFAULT_PARALLEL_TOTAL_LIMIT))) { @@ -356,10 +354,10 @@ export class Suman { // str = str.replace(/(\r\n|\n|\r)/gm, ''); ///This javascript code removes all 3 types of line breaks // process.send(JSON.parse(str)); - const client = getClient(); const LOG_RESULT = constants.runner_message_type.LOG_RESULT; if (global.usingBrowserEtcEtc) { + const client = getClient(); // TODO: note for the web browser, we need to use this client.emit(LOG_RESULT, JSON.parse(str)); } diff --git a/scripts/touch.sh b/scripts/touch.sh new file mode 100755 index 00000000..e5ff9db7 --- /dev/null +++ b/scripts/touch.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +touch cli.js diff --git a/suman-todos.txt b/suman-todos.txt index ce7d2dfd..c257f3db 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -10,6 +10,11 @@ three SO profiles: /// +suman-watch should be optionalDep? +suman-interactive should be optionalDep? + +/// + cd $(dirname "$0") [ ! -d "node_modules/babel-runtime" ] && npm install babel-runtime [ ! -d "node_modules/babel-core" ] && npm install babel-core @@ -23,6 +28,10 @@ cd $(dirname "$0") [ ! -d "node_modules/babel-preset-stage-3" ] && npm install babel-preset-stage-3 +//// + + => give user choice as to use bash or zsh or whatever for suman watch + //// suman --scripts abc diff --git a/suman.conf.js b/suman.conf.js index 4c1e4a67..57c781d2 100755 --- a/suman.conf.js +++ b/suman.conf.js @@ -78,7 +78,7 @@ module.exports = Object.freeze({ options: {}, per: { 'node-dev': { - exec: 'suman test/src/dev/node', + exec: 'suman test/src/dev/node --verbosity=5 --inherit-stdio', includes: [__dirname], excludes: ['/test/', /\.ts$/], confOverride: {} @@ -93,7 +93,7 @@ module.exports = Object.freeze({ }, - /////////////// + //////////////////////////////////////////////////// scripts: { // usage: $ suman --scripts example diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 089ecafa..03ef9cc9 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506895358737,"endDate":1506895359252,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506895358733,"endDate":1506895359252,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506920723243,"endDate":1506920723927,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1506920723234,"endDate":1506920723929,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"}]'); let tasks = []; From b580e6bf69557be7fee03c4b9b83bfcad934c41b Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Sun, 1 Oct 2017 23:35:41 -0700 Subject: [PATCH 20/32] pdev:set --- exp.js | 2 +- suman.conf.js | 2 +- test/.suman/gantt-4.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exp.js b/exp.js index e277108c..46f7ad0f 100644 --- a/exp.js +++ b/exp.js @@ -11,7 +11,7 @@ // hi -// +////// const path = require('path'); diff --git a/suman.conf.js b/suman.conf.js index 57c781d2..20da3a5e 100755 --- a/suman.conf.js +++ b/suman.conf.js @@ -78,7 +78,7 @@ module.exports = Object.freeze({ options: {}, per: { 'node-dev': { - exec: 'suman test/src/dev/node --verbosity=5 --inherit-stdio', + exec: 'suman test/src/dev/node --verbosity=4', includes: [__dirname], excludes: ['/test/', /\.ts$/], confOverride: {} diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 03ef9cc9..9c35235a 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506920723243,"endDate":1506920723927,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1506920723234,"endDate":1506920723929,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506923836098,"endDate":1506923836728,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506923836094,"endDate":1506923836728,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; From 60c1539ca258c307302dd0c5d39702ba187b9dfc Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Mon, 2 Oct 2017 00:05:47 -0700 Subject: [PATCH 21/32] pdev:set --- lib/exec-suite.ts | 1 - lib/handle-exit.js | 4 ++- lib/handle-exit.ts | 5 ++- lib/helpers/handle-suman-counts.js | 1 + lib/helpers/handle-suman-counts.ts | 1 + lib/helpers/job-queue.d.ts | 1 - lib/helpers/job-queue.js | 30 ----------------- lib/helpers/job-queue.ts | 54 ------------------------------ test/.suman/gantt-4.html | 2 +- 9 files changed, 10 insertions(+), 89 deletions(-) delete mode 100755 lib/helpers/job-queue.d.ts delete mode 100755 lib/helpers/job-queue.js delete mode 100755 lib/helpers/job-queue.ts diff --git a/lib/exec-suite.ts b/lib/exec-suite.ts index 2dd7bf38..8c85ab8f 100755 --- a/lib/exec-suite.ts +++ b/lib/exec-suite.ts @@ -31,7 +31,6 @@ const pragmatik = require('pragmatik'); const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); import rules = require('./helpers/handle-varargs'); import {constants} from '../config/suman-constants'; -import {getQueue} from './helpers/job-queue'; import su from 'suman-utils'; import {makeGracefulExit} from './make-graceful-exit'; import {acquireIocDeps} from './acquire-dependencies/acquire-ioc-deps'; diff --git a/lib/handle-exit.js b/lib/handle-exit.js index 8671384e..e57e6073 100755 --- a/lib/handle-exit.js +++ b/lib/handle-exit.js @@ -13,6 +13,7 @@ if (!process.prependListener) { process.prependListener = process.on.bind(process); } process.prependListener('exit', function (code) { + _suman.logError('beginning of final exit call...'); if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e) { @@ -76,8 +77,9 @@ process.prependListener('exit', function (code) { console.log('\n'); } if (typeof _suman.absoluteLastHook === 'function') { - _suman.log('killing daemon process, using absolute last hook.'); + _suman.logError('killing daemon process, using absolute last hook.'); _suman.absoluteLastHook(code); } + _suman.logError('making final call to process.exit()'); process.exit(code); }); diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 81516c33..418d26b1 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -33,6 +33,8 @@ if (!process.prependListener) { process.prependListener('exit', function (code: number) { + _suman.logError('beginning of final exit call...'); + if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e: Error) { @@ -106,11 +108,12 @@ process.prependListener('exit', function (code: number) { } if (typeof _suman.absoluteLastHook === 'function') { - _suman.log('killing daemon process, using absolute last hook.'); + _suman.logError('killing daemon process, using absolute last hook.'); _suman.absoluteLastHook(code); } // => we probably don't need this... + _suman.logError('making final call to process.exit()'); process.exit(code); }); diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 1140a868..0b2b13cd 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -59,6 +59,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { }; }; waitForStdioToDrain(function () { + _suman.logWarning('about to call process.exit().'); process.exit(highestExitCode); }); }); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index 0e624090..532e882a 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -96,6 +96,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { }; waitForStdioToDrain(function () { + _suman.logWarning('about to call process.exit().'); process.exit(highestExitCode) }); diff --git a/lib/helpers/job-queue.d.ts b/lib/helpers/job-queue.d.ts deleted file mode 100755 index 5263b30b..00000000 --- a/lib/helpers/job-queue.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare const getQueue: () => any; diff --git a/lib/helpers/job-queue.js b/lib/helpers/job-queue.js deleted file mode 100755 index 3a1db612..00000000 --- a/lib/helpers/job-queue.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); -var process = require('suman-browser-polyfills/modules/process'); -var global = require('suman-browser-polyfills/modules/global'); -var assert = require("assert"); -var async = require("async"); -var _suman = global.__suman = (global.__suman || {}); -var constants = require('../../config/suman-constants').constants; -var queue, envTotal, envConfig; -if (process.env.DEFAULT_PARALLEL_TOTAL_LIMIT && (envTotal = Number(process.env.DEFAULT_PARALLEL_TOTAL_LIMIT))) { - assert(Number.isInteger(envTotal), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); -} -exports.getQueue = function () { - if (!queue) { - var sumanConfig = _suman.sumanConfig, sumanOpts = _suman.sumanOpts; - if (sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT && - (envConfig = Number(_suman.sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT))) { - assert(Number.isInteger(envConfig), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); - } - var c = 1; - if (!sumanOpts.series) { - c = envTotal || envConfig || constants.DEFAULT_PARALLEL_TOTAL_LIMIT; - } - assert(Number.isInteger(c) && c > 0 && c < 301, 'DEFAULT_PARALLEL_TOTAL_LIMIT must be an integer between 1 and 300 inclusive.'); - queue = async.queue(function (task, cb) { - task(cb); - }, c); - } - return queue; -}; diff --git a/lib/helpers/job-queue.ts b/lib/helpers/job-queue.ts deleted file mode 100755 index 93a189db..00000000 --- a/lib/helpers/job-queue.ts +++ /dev/null @@ -1,54 +0,0 @@ -'use strict'; - -import {IGlobalSumanObj} from "suman-types/dts/global"; - -//polyfills -const process = require('suman-browser-polyfills/modules/process'); -const global = require('suman-browser-polyfills/modules/global'); - -//core -import assert = require('assert'); - -// npm -import async = require('async'); - -//project -const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); -const {constants} = require('../../config/suman-constants'); - -let queue: any, envTotal: number, envConfig: number; - -if (process.env.DEFAULT_PARALLEL_TOTAL_LIMIT && (envTotal = Number(process.env.DEFAULT_PARALLEL_TOTAL_LIMIT))) { - assert(Number.isInteger(envTotal), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); -} - -export const getQueue = function () { - - if (!queue) { - - const {sumanConfig, sumanOpts} = _suman; - // note: we have to create the queue after loading this file, so that _suman.sumanConfig is defined. - - if (sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT && - (envConfig = Number(_suman.sumanConfig.DEFAULT_PARALLEL_TOTAL_LIMIT))) { - assert(Number.isInteger(envConfig), 'process.env.DEFAULT_PARALLEL_TOTAL_LIMIT cannot be cast to an integer.'); - } - - let c = 1; // concurrency - - if (!sumanOpts.series) { - c = envTotal || envConfig || constants.DEFAULT_PARALLEL_TOTAL_LIMIT; - } - - assert(Number.isInteger(c) && c > 0 && c < 301, - 'DEFAULT_PARALLEL_TOTAL_LIMIT must be an integer between 1 and 300 inclusive.'); - - queue = async.queue(function (task: Function, cb: Function) { - task(cb); - }, c); - - } - - return queue; - -}; diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 9c35235a..a949a10d 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506923836098,"endDate":1506923836728,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506923836094,"endDate":1506923836728,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506927889500,"endDate":1506927895108,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506927889495,"endDate":1506927890115,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; From 1fefdb612c93e1e509efe8687428fdbf4697c23c Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Mon, 2 Oct 2017 02:00:49 -0700 Subject: [PATCH 22/32] pdev:set --- lib/handle-exit.js | 2 +- lib/handle-exit.ts | 9 ++--- lib/helpers/handle-suman-counts.js | 6 ++- lib/helpers/handle-suman-counts.ts | 8 +++- lib/helpers/log-stdio-of-child.js | 20 ++-------- lib/helpers/log-stdio-of-child.ts | 40 ++++++++++--------- lib/index-helpers/setup-extra-loggers.ts | 10 +++++ .../handle-multiple-processes.js | 3 +- .../handle-multiple-processes.ts | 4 +- lib/test-suite-helpers/make-start-suite.js | 1 - lib/test-suite-helpers/make-start-suite.ts | 1 - test/.suman/gantt-4.html | 2 +- 12 files changed, 56 insertions(+), 50 deletions(-) diff --git a/lib/handle-exit.js b/lib/handle-exit.js index e57e6073..5dcbba66 100755 --- a/lib/handle-exit.js +++ b/lib/handle-exit.js @@ -12,7 +12,7 @@ _suman.isActualExitHandlerRegistered = true; if (!process.prependListener) { process.prependListener = process.on.bind(process); } -process.prependListener('exit', function (code) { +process.prependOnceListener('exit', function (code) { _suman.logError('beginning of final exit call...'); if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 418d26b1..7319d5db 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -16,9 +16,8 @@ import assert = require('assert'); import * as chalk from 'chalk'; import su from 'suman-utils'; - //project -const _suman : IGlobalSumanObj = global.__suman = (global.__suman || {}); +const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); const {constants} = require('../config/suman-constants'); const testErrors = _suman.testErrors = _suman.testErrors || []; const errors = _suman.sumanRuntimeErrors = _suman.sumanRuntimeErrors || []; @@ -31,7 +30,7 @@ if (!process.prependListener) { process.prependListener = process.on.bind(process); } -process.prependListener('exit', function (code: number) { +process.prependOnceListener('exit', function (code: number) { _suman.logError('beginning of final exit call...'); @@ -39,8 +38,8 @@ process.prependListener('exit', function (code: number) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e: Error) { let eStr = su.getCleanErrorString(e); - _suman.usingRunner && process.stderr.write(eStr); - _suman.writeTestError && _suman.writeTestError(eStr); + _suman.usingRunner && process.stderr.write(eStr); + _suman.writeTestError && _suman.writeTestError(eStr); }); } else if (testErrors.length > 0) { diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 0b2b13cd..57382080 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -40,11 +40,13 @@ suiteResultEmitter.once('suman-test-file-complete', function () { return process.nextTick(cb); } var timedout = false; - var to = setTimeout(function () { + var timeout = _suman.usingRunner ? 20 : 10; + var onTimeout = function () { timedout = true; _suman.logWarning('Drain callback timed out, exitting +.'); cb(null); - }, _suman.usingRunner ? 20 : 10); + }; + var to = setTimeout(onTimeout, timeout); _suman.drainCallback = function (logpath) { clearTimeout(to); _suman.logWarning('Drain callback was actually called.'); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index 532e882a..3a07b944 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -75,11 +75,15 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } let timedout = false; - let to = setTimeout(function () { + let timeout = _suman.usingRunner ? 20 : 10; + + let onTimeout = function () { timedout = true; _suman.logWarning('Drain callback timed out, exitting +.'); cb(null); - }, _suman.usingRunner ? 20 : 10); + }; + + let to = setTimeout(onTimeout, timeout); _suman.drainCallback = function (logpath: string) { clearTimeout(to); diff --git a/lib/helpers/log-stdio-of-child.js b/lib/helpers/log-stdio-of-child.js index f766b00d..a71f9956 100755 --- a/lib/helpers/log-stdio-of-child.js +++ b/lib/helpers/log-stdio-of-child.js @@ -27,7 +27,7 @@ exports.run = function (filePath) { _suman.logError('\n'); return; } - var isDeleteFile_1 = true, writeToFileStream_1 = true; + var isDeleteFile_1 = true, writeToFileStream = true; var temp = su.removePath(filePath, _suman.projectRoot); var onlyFile = String(temp).replace(/\//g, '.'); var logfile_1 = path.resolve(f + '/' + onlyFile + '.log'); @@ -36,10 +36,7 @@ exports.run = function (filePath) { strm_1.on('error', function (e) { _suman.logError(e.stack || e); }); - _suman.endLogStream = function () { - writeToFileStream_1 = false; - }; - strm_1.once('end', function () { + strm_1.on('drain', function () { _suman.isStrmDrained = true; _suman.drainCallback && _suman.drainCallback(logfile_1); }); @@ -48,14 +45,7 @@ exports.run = function (filePath) { process.stderr.write = function () { _suman.isStrmDrained = false; isDeleteFile_1 = false; - if (writeToFileStream_1) { - try { - strm_1.write.apply(strm_1, arguments); - } - catch (e) { - _suman.logError(e.stack || e); - } - } + strm_1.write.apply(strm_1, arguments); stderrWrite_1.apply(process.stderr, arguments); }; } @@ -65,9 +55,7 @@ exports.run = function (filePath) { process.stdout.write = function () { _suman.isStrmDrained = false; isDeleteFile_1 = false; - if (writeToFileStream_1) { - strm_1.write.apply(strm_1, arguments); - } + strm_1.write.apply(strm_1, arguments); stdoutWrite_1.apply(process.stdout, arguments); }; } diff --git a/lib/helpers/log-stdio-of-child.ts b/lib/helpers/log-stdio-of-child.ts index 19362706..85fd171e 100755 --- a/lib/helpers/log-stdio-of-child.ts +++ b/lib/helpers/log-stdio-of-child.ts @@ -61,14 +61,14 @@ export const run = function (filePath: string) { _suman.logError(e.stack || e); }); - _suman.endLogStream = function () { - // _suman.logError('endLogStream finished.'); - // rstrm.unpipe(); - writeToFileStream = false; - // strm.end(); - }; - - strm.once('end', function () { + // _suman.endLogStream = function () { + // // _suman.logError('endLogStream finished.'); + // // rstrm.unpipe(); + // writeToFileStream = false; + // // strm.end(); + // }; + + strm.on('drain', function () { _suman.isStrmDrained = true; _suman.drainCallback && _suman.drainCallback(logfile); }); @@ -78,14 +78,15 @@ export const run = function (filePath: string) { process.stderr.write = function () { _suman.isStrmDrained = false; isDeleteFile = false; - if (writeToFileStream) { - try { - strm.write.apply(strm, arguments); - } - catch (e) { - _suman.logError(e.stack || e); - } - } + // if (writeToFileStream) { + // try { + // strm.write.apply(strm, arguments); + // } + // catch (e) { + // _suman.logError(e.stack || e); + // } + // } + strm.write.apply(strm, arguments); stderrWrite.apply(process.stderr, arguments); }; } @@ -97,9 +98,10 @@ export const run = function (filePath: string) { process.stdout.write = function () { _suman.isStrmDrained = false; isDeleteFile = false; - if (writeToFileStream) { - strm.write.apply(strm, arguments); - } + // if (writeToFileStream) { + // strm.write.apply(strm, arguments); + // } + strm.write.apply(strm, arguments); stdoutWrite.apply(process.stdout, arguments); }; } diff --git a/lib/index-helpers/setup-extra-loggers.ts b/lib/index-helpers/setup-extra-loggers.ts index 7d143a5c..f2287a45 100755 --- a/lib/index-helpers/setup-extra-loggers.ts +++ b/lib/index-helpers/setup-extra-loggers.ts @@ -36,6 +36,8 @@ export default function (usingRunner: boolean, testDebugLogPath: string, testLog _suman.writeTestError = function (data: string, options: any) { + // return; + // assert(typeof data === 'string', 'Implementation error => data passed to ' + // 'writeTestError should already be in string format => \n' + util.inspect(data)); @@ -56,6 +58,8 @@ export default function (usingRunner: boolean, testDebugLogPath: string, testLog }; _suman._writeLog = function (data: string) { + + // return; // use process.send to send data to runner? or no-op if (IS_SUMAN_DEBUG) { fs.appendFileSync(testDebugLogPath, data); @@ -74,10 +78,16 @@ export default function (usingRunner: boolean, testDebugLogPath: string, testLog } _suman._writeLog = function (data: string) { + + // return; + fs.appendFileSync(testLogPath, data); }; _suman.writeTestError = function (data: string, ignore: boolean) { + + // return; + if (!ignore) { _suman.checkTestErrorLog = true; } diff --git a/lib/runner-helpers/handle-multiple-processes.js b/lib/runner-helpers/handle-multiple-processes.js index 12768307..78328603 100755 --- a/lib/runner-helpers/handle-multiple-processes.js +++ b/lib/runner-helpers/handle-multiple-processes.js @@ -337,7 +337,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, } n.stdout.setEncoding('utf8'); n.stderr.setEncoding('utf8'); - if (sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files) { + if ((sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files)) { var onError = function (e) { _suman.logError('\n', su.getCleanErrorString(e), '\n'); }; @@ -345,6 +345,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, var onlyFile = String(temp).replace(/\//g, '.'); var logfile = path.resolve(f + '/' + onlyFile + '.log'); var fileStrm = fs.createWriteStream(logfile); + console.log('logFile => ', logfile); if (sumanOpts.log_stdio_to_files || sumanOpts.log_stderr_to_files) { n.stderr.pipe(fileStrm).once('error', onError); } diff --git a/lib/runner-helpers/handle-multiple-processes.ts b/lib/runner-helpers/handle-multiple-processes.ts index 965a5d26..1f259d2b 100755 --- a/lib/runner-helpers/handle-multiple-processes.ts +++ b/lib/runner-helpers/handle-multiple-processes.ts @@ -492,7 +492,7 @@ export const makeHandleMultipleProcesses = n.stdout.setEncoding('utf8'); n.stderr.setEncoding('utf8'); - if (sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files) { + if ((sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files)) { let onError = function (e: Error) { _suman.logError('\n', su.getCleanErrorString(e), '\n'); @@ -503,6 +503,8 @@ export const makeHandleMultipleProcesses = let logfile = path.resolve(f + '/' + onlyFile + '.log'); let fileStrm = fs.createWriteStream(logfile); + console.log('logFile => ', logfile); + if (sumanOpts.log_stdio_to_files || sumanOpts.log_stderr_to_files) { n.stderr.pipe(fileStrm).once('error', onError); } diff --git a/lib/test-suite-helpers/make-start-suite.js b/lib/test-suite-helpers/make-start-suite.js index 20c5f22d..01a5019b 100755 --- a/lib/test-suite-helpers/make-start-suite.js +++ b/lib/test-suite-helpers/make-start-suite.js @@ -10,7 +10,6 @@ var _suman = global.__suman = (global.__suman || {}); var implementationError = require('../helpers/implementation-error'); var constants = require('../../config/suman-constants').constants; var makeTheTrap = require('./make-the-trap').makeTheTrap; -var getQueue = require('../helpers/job-queue').getQueue; exports.makeStartSuite = function (suman, gracefulExit, handleBeforesAndAfters, notifyParentThatChildIsComplete) { return function startSuite(finished) { var self = this; diff --git a/lib/test-suite-helpers/make-start-suite.ts b/lib/test-suite-helpers/make-start-suite.ts index 75b37083..0ff92704 100755 --- a/lib/test-suite-helpers/make-start-suite.ts +++ b/lib/test-suite-helpers/make-start-suite.ts @@ -25,7 +25,6 @@ const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); const implementationError = require('../helpers/implementation-error'); const {constants} = require('../../config/suman-constants'); const {makeTheTrap} = require('./make-the-trap'); -const {getQueue} = require('../helpers/job-queue'); //////////////////////////////////////////////////////////////////////////////////// diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index a949a10d..03919c6b 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506927889500,"endDate":1506927895108,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506927889495,"endDate":1506927890115,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1506934817787,"endDate":1506934818325,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506934817783,"endDate":1506934823316,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; From 28036aec112779bf0f8777c2396022a117d059be Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Mon, 2 Oct 2017 21:31:36 -0700 Subject: [PATCH 23/32] pdev:set --- exp.js | 10 ++ lib/handle-exit.js | 31 ++--- lib/handle-exit.ts | 39 +++--- lib/helpers/add-suman-global-properties.ts | 1 + lib/helpers/handle-suman-counts.js | 11 +- lib/helpers/handle-suman-counts.ts | 17 +-- lib/helpers/resolve-shared-dirs.js | 4 +- lib/helpers/resolve-shared-dirs.ts | 5 +- lib/index-helpers/exit-handling.ts | 5 - lib/index-helpers/handle-integrants.js | 2 +- lib/index-helpers/handle-integrants.ts | 6 +- lib/index-helpers/setup-extra-loggers.d.ts | 2 - lib/index-helpers/setup-extra-loggers.js | 67 ---------- lib/index-helpers/setup-extra-loggers.ts | 115 ------------------ lib/index.js | 20 ++- lib/index.ts | 20 ++- .../handle-multiple-processes.ts | 5 +- lib/runner-helpers/make-exit.js | 39 +++++- lib/runner-helpers/make-exit.ts | 57 +++++++-- .../multiple-process-each-on-exit.js | 5 +- .../multiple-process-each-on-exit.ts | 5 +- lib/runner-helpers/on-exit.js | 1 - lib/runner-helpers/on-exit.ts | 8 +- lib/runner.js | 6 +- lib/runner.ts | 18 ++- lib/test-suite-helpers/t-proto.js | 2 +- lib/test-suite-helpers/t-proto.ts | 2 +- package.json | 4 + suman-todos.txt | 4 +- suman.conf.js | 14 ++- test/.suman/gantt-4.html | 2 +- test/src/dev/node/1.test.js | 3 - 32 files changed, 210 insertions(+), 320 deletions(-) delete mode 100755 lib/index-helpers/setup-extra-loggers.d.ts delete mode 100755 lib/index-helpers/setup-extra-loggers.js delete mode 100755 lib/index-helpers/setup-extra-loggers.ts diff --git a/exp.js b/exp.js index 46f7ad0f..f81531e8 100644 --- a/exp.js +++ b/exp.js @@ -13,6 +13,16 @@ ////// +console.log('this is the beginning.');;;;; const path = require('path'); console.error(`${path.basename(__dirname)} reporter may be unable to properly indent output.`); + + +var player = require('play-sound')(opts = {}); + +const failTrombonePath = path.resolve(process.env.HOME + '/fail-trombone-02.mp3'); + +player.play(failTrombonePath, { timeout: 6000 }, function(err){ + if (err) throw err +}); diff --git a/lib/handle-exit.js b/lib/handle-exit.js index 5dcbba66..06066413 100755 --- a/lib/handle-exit.js +++ b/lib/handle-exit.js @@ -12,8 +12,10 @@ _suman.isActualExitHandlerRegistered = true; if (!process.prependListener) { process.prependListener = process.on.bind(process); } +if (!process.prependOnceListener) { + process.prependOnceListener = process.on.bind(process); +} process.prependOnceListener('exit', function (code) { - _suman.logError('beginning of final exit call...'); if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e) { @@ -25,28 +27,17 @@ process.prependOnceListener('exit', function (code) { else if (testErrors.length > 0) { code = code || constants.EXIT_CODES.TEST_CASE_FAIL; } - if (_suman.writeTestError) { - _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', { suppress: true }); - } - if (_suman._writeLog) { - if (process.env.SUMAN_SINGLE_PROCESS === 'yes') { - _suman._writeLog('\n\n\ [ end of Suman run in SUMAN_SINGLE_PROCESS mode ]'); - } - else { - _suman._writeLog('\n\n\ [ end of Suman individual test run for file => "' + _suman._currentModule + '" ]'); - } - } + _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', { suppress: true }); if (code > 0 && testErrors.length < 1) { if (!_suman.usingRunner) { - process.stdout.write('\n\n =>' + chalk.underline.bold.yellow(' Suman test process experienced a fatal error during the run, ' + + console.log(chalk.underline.bold.yellow(' Suman test process experienced a fatal error during the run, ' + 'most likely the majority of tests, if not all tests, were not run.') + '\n'); } } if (_suman.checkTestErrorLog) { - process.stdout.write('\n\n =>' + chalk.yellow(' You have some additional errors/warnings - ' + - 'check the test debug log for more information.' + '\n')); - process.stdout.write(' => ' + chalk.underline.bold.yellow(_suman.sumanHelperDirRoot + '/logs/test-debug.log')); - process.stdout.write('\n\n'); + console.log(chalk.yellow(' You have some additional errors/warnings - check the test debug log for more information.')); + console.log(' => ' + chalk.underline.bold.yellow(_suman.sumanHelperDirRoot + '/logs/test-debug.log')); + console.log('\n'); } if (Number.isInteger(_suman.expectedExitCode)) { if (code !== _suman.expectedExitCode) { @@ -65,9 +56,8 @@ process.prependOnceListener('exit', function (code) { } if (!_suman.usingRunner) { var extra = ''; - if (code > 0) { + if (code > 0) extra = ' => see http://sumanjs.org/exit-codes.html'; - } console.log('\n'); var start = void 0; if (start = process.env['SUMAN_START_TIME']) { @@ -80,6 +70,5 @@ process.prependOnceListener('exit', function (code) { _suman.logError('killing daemon process, using absolute last hook.'); _suman.absoluteLastHook(code); } - _suman.logError('making final call to process.exit()'); - process.exit(code); + process.exitCode = code; }); diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 7319d5db..94cfef51 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -30,9 +30,13 @@ if (!process.prependListener) { process.prependListener = process.on.bind(process); } +if (!process.prependOnceListener) { + process.prependOnceListener = process.on.bind(process); +} + process.prependOnceListener('exit', function (code: number) { - _suman.logError('beginning of final exit call...'); + // _suman.logError('beginning of final exit call...'); if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; @@ -46,31 +50,19 @@ process.prependOnceListener('exit', function (code: number) { code = code || constants.EXIT_CODES.TEST_CASE_FAIL; } - if (_suman.writeTestError) { - _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', {suppress: true}); - } - - if (_suman._writeLog) { - if (process.env.SUMAN_SINGLE_PROCESS === 'yes') { - _suman._writeLog('\n\n\ [ end of Suman run in SUMAN_SINGLE_PROCESS mode ]'); - } - else { - _suman._writeLog('\n\n\ [ end of Suman individual test run for file => "' + _suman._currentModule + '" ]'); - } - } + _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', {suppress: true}); - if (code > 0 && testErrors.length < 1) { //TODO: fix this with logic saying if code > 0 and code < 60 or something + if (code > 0 && testErrors.length < 1) { if (!_suman.usingRunner) { //TODO: need to fix this - process.stdout.write('\n\n =>' + chalk.underline.bold.yellow(' Suman test process experienced a fatal error during the run, ' + + console.log(chalk.underline.bold.yellow(' Suman test process experienced a fatal error during the run, ' + 'most likely the majority of tests, if not all tests, were not run.') + '\n'); } } if (_suman.checkTestErrorLog) { - process.stdout.write('\n\n =>' + chalk.yellow(' You have some additional errors/warnings - ' + - 'check the test debug log for more information.' + '\n')); - process.stdout.write(' => ' + chalk.underline.bold.yellow(_suman.sumanHelperDirRoot + '/logs/test-debug.log')); - process.stdout.write('\n\n'); + console.log(chalk.yellow(' You have some additional errors/warnings - check the test debug log for more information.')); + console.log(' => ' + chalk.underline.bold.yellow(_suman.sumanHelperDirRoot + '/logs/test-debug.log')); + console.log('\n'); } if (Number.isInteger(_suman.expectedExitCode)) { @@ -92,9 +84,7 @@ process.prependOnceListener('exit', function (code: number) { if (!_suman.usingRunner) { let extra = ''; - if (code > 0) { - extra = ' => see http://sumanjs.org/exit-codes.html'; - } + if (code > 0) extra = ' => see http://sumanjs.org/exit-codes.html'; console.log('\n'); @@ -112,8 +102,9 @@ process.prependOnceListener('exit', function (code: number) { } // => we probably don't need this... - _suman.logError('making final call to process.exit()'); - process.exit(code); + // _suman.logError('making final call to process.exit()'); + process.exitCode = code; + // process.exit(code); }); diff --git a/lib/helpers/add-suman-global-properties.ts b/lib/helpers/add-suman-global-properties.ts index dc7f71de..c49b3e74 100755 --- a/lib/helpers/add-suman-global-properties.ts +++ b/lib/helpers/add-suman-global-properties.ts @@ -9,6 +9,7 @@ const global = require('suman-browser-polyfills/modules/global'); //npm import * as chalk from 'chalk'; import {lp} from 'log-prepend'; +import {pt} from 'prepend-transform'; //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 57382080..b476bc46 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -2,6 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); +var util = require("util"); var EE = require("events"); var fs = require("fs"); var suman_events_1 = require("suman-events"); @@ -9,9 +10,9 @@ var _suman = global.__suman = (global.__suman || {}); var handle_runner_request_response_1 = require("../index-helpers/handle-runner-request-response"); var counts = require('./suman-counts'); var handle_suman_once_post_1 = require("./handle-suman-once-post"); -var suiteResultEmitter = _suman.suiteResultEmitter = (_suman.suiteResultEmitter || new EE()); -var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); -var results = _suman.tableResults = (_suman.tableResults || []); +var suiteResultEmitter = _suman.suiteResultEmitter = _suman.suiteResultEmitter || new EE(); +var resultBroadcaster = _suman.resultBroadcaster = _suman.resultBroadcaster || new EE(); +var results = _suman.tableResults = _suman.tableResults || []; suiteResultEmitter.once('suman-test-file-complete', function () { debugger; var fn, resultz; @@ -28,7 +29,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { fn = handle_suman_once_post_1.oncePostFn; } var codes = results.map(function (i) { return i.exitCode; }); - _suman.log(' => All "exit" codes from test suites => ', codes); + _suman.log(' => All "exit" codes from test suites => ', util.inspect(codes)); var highestExitCode = Math.max.apply(null, codes); fn(function (err) { err && _suman.logError(err.stack || err); @@ -43,7 +44,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { var timeout = _suman.usingRunner ? 20 : 10; var onTimeout = function () { timedout = true; - _suman.logWarning('Drain callback timed out, exitting +.'); cb(null); }; var to = setTimeout(onTimeout, timeout); @@ -61,7 +61,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { }; }; waitForStdioToDrain(function () { - _suman.logWarning('about to call process.exit().'); process.exit(highestExitCode); }); }); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index 3a07b944..4dc8bbca 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -2,7 +2,7 @@ //dts import {IGlobalSumanObj, IPseudoError} from "suman-types/dts/global"; -import {ITableDataCallbackObj} from "../suman"; +import {ITableDataCallbackObj} from "suman-types/dts/suman"; //polyfills const process = require('suman-browser-polyfills/modules/process'); @@ -16,18 +16,15 @@ import fs = require('fs'); //npm import {events} from 'suman-events'; import su = require('suman-utils'); -import chalk = require('chalk'); //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); import {handleRequestResponseWithRunner} from '../index-helpers/handle-runner-request-response'; - const counts = require('./suman-counts'); import {oncePostFn} from './handle-suman-once-post'; - -const suiteResultEmitter = _suman.suiteResultEmitter = (_suman.suiteResultEmitter || new EE()); -const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); -const results: Array = _suman.tableResults = (_suman.tableResults || []); +const suiteResultEmitter = _suman.suiteResultEmitter = _suman.suiteResultEmitter || new EE(); +const resultBroadcaster = _suman.resultBroadcaster = _suman.resultBroadcaster || new EE(); +const results: Array = _suman.tableResults = _suman.tableResults || []; /////////////////////////////////////////////////////////////////// @@ -55,8 +52,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } const codes = results.map(i => i.exitCode); - _suman.log(' => All "exit" codes from test suites => ', codes); - + _suman.log(' => All "exit" codes from test suites => ', util.inspect(codes)); const highestExitCode = Math.max.apply(null, codes); fn(function (err: IPseudoError) { @@ -64,7 +60,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { err && _suman.logError(err.stack || err); // this is for testing expected test result counts resultBroadcaster.emit(String(events.META_TEST_ENDED)); - _suman.endLogStream && _suman.endLogStream(); let waitForStdioToDrain = function (cb: Function) { @@ -79,7 +74,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { let onTimeout = function () { timedout = true; - _suman.logWarning('Drain callback timed out, exitting +.'); cb(null); }; @@ -100,7 +94,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { }; waitForStdioToDrain(function () { - _suman.logWarning('about to call process.exit().'); process.exit(highestExitCode) }); diff --git a/lib/helpers/resolve-shared-dirs.js b/lib/helpers/resolve-shared-dirs.js index 853e12e1..d930ff78 100755 --- a/lib/helpers/resolve-shared-dirs.js +++ b/lib/helpers/resolve-shared-dirs.js @@ -41,14 +41,12 @@ exports.resolveSharedDirs = function (sumanConfig, projectRoot, sumanOpts) { var testDir = process.env.TEST_DIR = _suman.testDir = path.resolve(projectRoot + '/' + (sumanConfig.testDir || 'test')); var testSrcDir = process.env.TEST_SRC_DIR = _suman.testSrcDir = path.resolve(projectRoot + '/' + (sumanConfig.testSrcDir || 'test')); var errStrmPath = path.resolve(sumanHelpersDir + '/logs/test-debug.log'); - var strmStdoutPath = path.resolve(sumanHelpersDir + '/logs/test-output.log'); return loaded = Object.freeze({ sumanHelpersDir: _suman.sumanHelperDirRoot = process.env.SUMAN_HELPERS_DIR_ROOT = sumanHelpersDir, sumanLogDir: _suman.sumanLogDir = logDir, integPrePath: _suman.integPrePath = integPrePath, integPostPath: _suman.integPostPath = integPostPath, sumanHelpersDirLocated: sumanHelpersDirLocated, - testDebugLogPath: errStrmPath, - testLogPath: strmStdoutPath + testDebugLogPath: errStrmPath }); }; diff --git a/lib/helpers/resolve-shared-dirs.ts b/lib/helpers/resolve-shared-dirs.ts index 7064cec0..6811f1ff 100755 --- a/lib/helpers/resolve-shared-dirs.ts +++ b/lib/helpers/resolve-shared-dirs.ts @@ -72,7 +72,7 @@ export const resolveSharedDirs = function (sumanConfig: ISumanConfig, projectRoo const testDir = process.env.TEST_DIR = _suman.testDir = path.resolve(projectRoot + '/' + (sumanConfig.testDir || 'test')); const testSrcDir = process.env.TEST_SRC_DIR = _suman.testSrcDir = path.resolve(projectRoot + '/' + (sumanConfig.testSrcDir || 'test')); const errStrmPath = path.resolve(sumanHelpersDir + '/logs/test-debug.log'); - const strmStdoutPath = path.resolve(sumanHelpersDir + '/logs/test-output.log'); + return loaded = Object.freeze({ sumanHelpersDir: _suman.sumanHelperDirRoot = process.env.SUMAN_HELPERS_DIR_ROOT = sumanHelpersDir, @@ -80,8 +80,7 @@ export const resolveSharedDirs = function (sumanConfig: ISumanConfig, projectRoo integPrePath: _suman.integPrePath = integPrePath, integPostPath: _suman.integPostPath = integPostPath, sumanHelpersDirLocated: sumanHelpersDirLocated, - testDebugLogPath: errStrmPath, - testLogPath: strmStdoutPath + testDebugLogPath: errStrmPath }); }; diff --git a/lib/index-helpers/exit-handling.ts b/lib/index-helpers/exit-handling.ts index 49ab2f46..87915616 100755 --- a/lib/index-helpers/exit-handling.ts +++ b/lib/index-helpers/exit-handling.ts @@ -150,11 +150,6 @@ process.on('uncaughtException', function (err: SumanErrorRace) { } } - /* - - @benjamingr yeah I am working on sumanjs/suman - it's a test runner - TapJS and Lab among others also see the same need for domains. Once Node.js test runners started parallelizing tests, putting the current executing test in the global scope was no longer possible, since tests/hooks would interleave. So all these test runners are using domains to solve the problem atm. AVA parallelizes tests, but they are relying on promises and async/await to trap errors. IMO for edge cases it's not quite good enough yet, so like TapJS and Lab, I decided to use domains. - */ - if (err._alreadyHandledBySuman) { console.error(' => Error already handled => \n', (err.stack || err)); return; diff --git a/lib/index-helpers/handle-integrants.js b/lib/index-helpers/handle-integrants.js index 9f999797..90b14722 100755 --- a/lib/index-helpers/handle-integrants.js +++ b/lib/index-helpers/handle-integrants.js @@ -35,7 +35,7 @@ exports.handleIntegrants = function (integrants, $oncePost, integrantPreFn, $mod var client, usingRunner = _suman.usingRunner; if (integrants.length < 1) { if (usingRunner) { - client = socketio_child_client_1.getClient(); + socketio_child_client_1.getClient(); } integrantsFn = function () { return Promise.resolve({}); diff --git a/lib/index-helpers/handle-integrants.ts b/lib/index-helpers/handle-integrants.ts index 6ae050e1..1337450c 100755 --- a/lib/index-helpers/handle-integrants.ts +++ b/lib/index-helpers/handle-integrants.ts @@ -31,10 +31,8 @@ if (!('integrantHashKeyVals' in _suman)) { const {acquirePreDeps} = require('../acquire-dependencies/acquire-pre-deps'); import {constants} from '../../config/suman-constants'; import integrantInjector from '../injection/integrant-injector'; - const IS_SUMAN_SINGLE_PROCESS = process.env.SUMAN_SINGLE_PROCESS === 'yes'; import {getClient} from './socketio-child-client'; - let integPreConfiguration: any = null; ///////////////////////////////////////////////////////////////////////////////////////////// @@ -62,8 +60,8 @@ export const handleIntegrants = function (integrants: Array, $oncePost: if (integrants.length < 1) { if (usingRunner) { - // we need to establish a connection now, to get ahead of things - client = getClient(); + // we should start establishing a connection now, to get ahead of things + getClient(); } integrantsFn = function () { diff --git a/lib/index-helpers/setup-extra-loggers.d.ts b/lib/index-helpers/setup-extra-loggers.d.ts deleted file mode 100755 index ce2787f3..00000000 --- a/lib/index-helpers/setup-extra-loggers.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { ISumanModuleExtended } from "suman-types/dts/index-init"; -export default function (usingRunner: boolean, testDebugLogPath: string, testLogPath: string, $module: ISumanModuleExtended): void; diff --git a/lib/index-helpers/setup-extra-loggers.js b/lib/index-helpers/setup-extra-loggers.js deleted file mode 100755 index e553911b..00000000 --- a/lib/index-helpers/setup-extra-loggers.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var process = require('suman-browser-polyfills/modules/process'); -var global = require('suman-browser-polyfills/modules/global'); -var assert = require("assert"); -var util = require("util"); -var fs = require("fs"); -var inBrowser = false; -var _suman = global.__suman = (global.__suman || {}); -var IS_SUMAN_DEBUG = process.env.SUMAN_DEBUG === 'yes'; -var SUMAN_SINGLE_PROCESS = process.env.SUMAN_SINGLE_PROCESS === 'yes'; -var callable = true; -function default_1(usingRunner, testDebugLogPath, testLogPath, $module) { - if (usingRunner && callable) { - callable = false; - _suman.writeTestError = function (data, options) { - if (!data) { - data = new Error('falsy data passed to writeTestError').stack; - } - if (typeof data !== 'string') { - data = util.inspect(data); - } - options = options || {}; - assert(typeof options === 'object', ' => Options should be an object.'); - if (true || IS_SUMAN_DEBUG) { - fs.appendFileSync(testDebugLogPath, data); - } - }; - _suman._writeLog = function (data) { - if (IS_SUMAN_DEBUG) { - fs.appendFileSync(testDebugLogPath, data); - } - }; - } - else { - if (SUMAN_SINGLE_PROCESS) { - fs.writeFileSync(testLogPath, '\n => [SUMAN_SINGLE_PROCESS mode] Next Suman run @' + new Date() + - '\n Test file => "' + $module.filename + '"', { flag: 'a' }); - } - else { - fs.writeFileSync(testLogPath, '\n\n => Test file => "' + $module.filename + '"\n\n', { flag: 'a' }); - } - _suman._writeLog = function (data) { - fs.appendFileSync(testLogPath, data); - }; - _suman.writeTestError = function (data, ignore) { - if (!ignore) { - _suman.checkTestErrorLog = true; - } - if (data) { - if (typeof data !== 'string') { - data = util.inspect(data); - } - fs.appendFileSync(testDebugLogPath, '\n' + data + '\n'); - } - else { - _suman.logError('Suman implementation error => no data passed to writeTestError. Please report.'); - } - }; - fs.writeFileSync(testDebugLogPath, '\n\n', { flag: 'a', encoding: 'utf8' }); - _suman.writeTestError('\n\n', true); - _suman.writeTestError(' ### Suman start run @' + new Date(), true); - _suman.writeTestError(' ### Filename => ' + $module.filename, true); - _suman.writeTestError(' ### Command => ' + JSON.stringify(process.argv), true); - } -} -exports.default = default_1; diff --git a/lib/index-helpers/setup-extra-loggers.ts b/lib/index-helpers/setup-extra-loggers.ts deleted file mode 100755 index f2287a45..00000000 --- a/lib/index-helpers/setup-extra-loggers.ts +++ /dev/null @@ -1,115 +0,0 @@ -//typescript imports -import {IGlobalSumanObj} from "suman-types/dts/global"; -import {ISumanModuleExtended} from "suman-types/dts/index-init"; - -//polyfills -const process = require('suman-browser-polyfills/modules/process'); -const global = require('suman-browser-polyfills/modules/global'); - -//core -import assert = require('assert'); -import util = require('util'); -import fs = require('fs'); - -//project -let inBrowser = false; -const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); - -//env -const IS_SUMAN_DEBUG = process.env.SUMAN_DEBUG === 'yes'; -const SUMAN_SINGLE_PROCESS = process.env.SUMAN_SINGLE_PROCESS === 'yes'; - -///////////////////////////////////////////////////////////////////////////////////// - -let callable = true; - -export default function (usingRunner: boolean, testDebugLogPath: string, testLogPath: string, - $module: ISumanModuleExtended) { - - // SUMAN_SINGLE_PROCESS can call this routine multiple times - // whereas we return early if not in SSP mode - // this is ugly, but works for now - - if (usingRunner && callable) { - - callable = false; - - _suman.writeTestError = function (data: string, options: any) { - - // return; - - // assert(typeof data === 'string', 'Implementation error => data passed to ' + - // 'writeTestError should already be in string format => \n' + util.inspect(data)); - - if(!data){ - data = new Error('falsy data passed to writeTestError').stack; - } - - if(typeof data !== 'string'){ - data = util.inspect(data); - } - - options = options || {}; - assert(typeof options === 'object', ' => Options should be an object.'); - - if (true || IS_SUMAN_DEBUG) { - fs.appendFileSync(testDebugLogPath, data); - } - }; - - _suman._writeLog = function (data: string) { - - // return; - // use process.send to send data to runner? or no-op - if (IS_SUMAN_DEBUG) { - fs.appendFileSync(testDebugLogPath, data); - } - } - } - else { - - if (SUMAN_SINGLE_PROCESS) { - fs.writeFileSync(testLogPath, - '\n => [SUMAN_SINGLE_PROCESS mode] Next Suman run @' + new Date() + - '\n Test file => "' + $module.filename + '"', {flag: 'a'}); - } - else { - fs.writeFileSync(testLogPath, '\n\n => Test file => "' + $module.filename + '"\n\n', {flag: 'a'}); - } - - _suman._writeLog = function (data: string) { - - // return; - - fs.appendFileSync(testLogPath, data); - }; - - _suman.writeTestError = function (data: string, ignore: boolean) { - - // return; - - if (!ignore) { - _suman.checkTestErrorLog = true; - } - // strm.write.apply(strm, arguments); - if (data) { - if (typeof data !== 'string') { - data = util.inspect(data); - } - fs.appendFileSync(testDebugLogPath, '\n' + data + '\n'); - } - else { - _suman.logError('Suman implementation error => no data passed to writeTestError. Please report.'); - } - - }; - - fs.writeFileSync(testDebugLogPath, '\n\n', {flag: 'a', encoding: 'utf8'}); - _suman.writeTestError('\n\n', true); - _suman.writeTestError(' ### Suman start run @' + new Date(), true); - _suman.writeTestError(' ### Filename => ' + $module.filename, true); - _suman.writeTestError(' ### Command => ' + JSON.stringify(process.argv), true); - } -} - - diff --git a/lib/index.js b/lib/index.js index a60e15f5..a742caa2 100755 --- a/lib/index.js +++ b/lib/index.js @@ -49,7 +49,6 @@ var sumanRuntimeErrors = _suman.sumanRuntimeErrors = _suman.sumanRuntimeErrors | var fatalRequestReply = require('./helpers/fatal-request-reply').fatalRequestReply; var constants = require('../config/suman-constants').constants; var handle_integrants_1 = require("./index-helpers/handle-integrants"); -var setup_extra_loggers_1 = require("./index-helpers/setup-extra-loggers"); var rules = require('./helpers/handle-varargs'); var suman_1 = require("./suman"); var execSuite = require('./exec-suite').execSuite; @@ -75,9 +74,7 @@ var sumanPaths = resolve_shared_dirs_1.resolveSharedDirs(sumanConfig, projectRoo var sumanObj = load_shared_objects_1.loadSharedObjects(sumanPaths, projectRoot, sumanOpts); var integrantPreFn = sumanObj.integrantPreFn; var testDebugLogPath = sumanPaths.testDebugLogPath; -var testLogPath = sumanPaths.testLogPath; -fs.writeFileSync(testDebugLogPath, '\n', { flag: 'w' }); -fs.writeFileSync(testLogPath, '\n => New Suman run @' + new Date(), { flag: 'w' }); +fs.writeFileSync(testDebugLogPath, '\n'); var loaded = false; var testSuiteQueueCallbacks = []; var testRuns = []; @@ -114,6 +111,20 @@ suiteResultEmitter.on('suman-completed', function () { fn && fn.call(null); }); }); +_suman.writeTestError = function (data, ignore) { + if (IS_SUMAN_DEBUG && !_suman.usingRunner) { + if (!ignore) + _suman.checkTestErrorLog = true; + if (!data) + data = new Error('falsy data passed to writeTestError').stack; + if (typeof data !== 'string') + data = util.inspect(data); + fs.appendFileSync(testDebugLogPath, data); + } +}; +fs.appendFileSync(testDebugLogPath, '\n\n', { encoding: 'utf8' }); +_suman.writeTestError('\n ### Suman start run @' + new Date() + ' ###\n', true); +_suman.writeTestError('\nCommand => ' + util.inspect(process.argv), true); exports.init = function ($module, $opts, confOverride) { debugger; if (exports.init.$ingletonian) { @@ -190,7 +201,6 @@ exports.init = function ($module, $opts, confOverride) { process.exit(constants.EXIT_CODES.IOC_PASSED_TO_SUMAN_INIT_BAD_FORM); } } - setup_extra_loggers_1.default(usingRunner, testDebugLogPath, testLogPath, $module); var integrantsFn = handle_integrants_1.handleIntegrants(integrants, $oncePost, integrantPreFn, $module); exports.init.tooLate = false; var start = function () { diff --git a/lib/index.ts b/lib/index.ts index c232fe91..482b0527 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -94,7 +94,6 @@ const sumanRuntimeErrors = _suman.sumanRuntimeErrors = _suman.sumanRuntimeErrors const {fatalRequestReply} = require('./helpers/fatal-request-reply'); const {constants} = require('../config/suman-constants'); import {handleIntegrants} from './index-helpers/handle-integrants'; -import setupExtraLoggers from './index-helpers/setup-extra-loggers'; const rules = require('./helpers/handle-varargs'); import {makeSuman} from './suman'; const {execSuite} = require('./exec-suite'); @@ -129,9 +128,7 @@ const sumanPaths = resolveSharedDirs(sumanConfig, projectRoot, sumanOpts); const sumanObj = loadSharedObjects(sumanPaths, projectRoot, sumanOpts); const {integrantPreFn} = sumanObj; const testDebugLogPath = sumanPaths.testDebugLogPath; -const testLogPath = sumanPaths.testLogPath; -fs.writeFileSync(testDebugLogPath, '\n', {flag: 'w'}); -fs.writeFileSync(testLogPath, '\n => New Suman run @' + new Date(), {flag: 'w'}); +fs.writeFileSync(testDebugLogPath, '\n'); //////////////////////////////////////////////////////////////////////////////// @@ -139,7 +136,6 @@ let loaded = false; const testSuiteQueueCallbacks: Array = []; const testRuns: Array = []; const testSuiteRegistrationQueueCallbacks: Array = []; - const c = (sumanOpts && sumanOpts.series) ? 1 : 3; const testSuiteQueue = async.queue(function (task: Function, cb: Function) { @@ -181,6 +177,19 @@ suiteResultEmitter.on('suman-completed', function () { }); }); +_suman.writeTestError = function (data: string, ignore: boolean) { + if (IS_SUMAN_DEBUG && !_suman.usingRunner) { + if (!ignore) _suman.checkTestErrorLog = true; + if (!data) data = new Error('falsy data passed to writeTestError').stack; + if (typeof data !== 'string') data = util.inspect(data); + fs.appendFileSync(testDebugLogPath, data); + } +}; + +fs.appendFileSync(testDebugLogPath, '\n\n', {encoding: 'utf8'}); +_suman.writeTestError('\n ### Suman start run @' + new Date() + ' ###\n', true); +_suman.writeTestError('\nCommand => ' + util.inspect(process.argv), true); + export const init: IInit = function ($module, $opts, confOverride): IStartCreate { ////////////////////////////////////////////////////// @@ -298,7 +307,6 @@ export const init: IInit = function ($module, $opts, confOverride): IStartCreate ////////////////////////////////////////////////////////////////// - setupExtraLoggers(usingRunner, testDebugLogPath, testLogPath, $module); const integrantsFn = handleIntegrants(integrants, $oncePost, integrantPreFn, $module); init.tooLate = false; diff --git a/lib/runner-helpers/handle-multiple-processes.ts b/lib/runner-helpers/handle-multiple-processes.ts index 1f259d2b..88dc9e5a 100755 --- a/lib/runner-helpers/handle-multiple-processes.ts +++ b/lib/runner-helpers/handle-multiple-processes.ts @@ -309,7 +309,7 @@ export const makeHandleMultipleProcesses = let childId = 1; const inheritRunStdio = - sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes' + sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes'; const outer = function (file: string, shortFile: string, stdout: string, gd: IGanttData) { @@ -576,8 +576,7 @@ export const makeHandleMultipleProcesses = } n.dateStartedMillis = gd.startDate = Date.now(); - n.once('exit', - onExitFn(n, runnerObj, tableRows, messages, forkedCPs, beforeExitRunOncePost, makeExit, gd)); + n.once('exit', onExitFn(n, runnerObj, tableRows, messages, forkedCPs, beforeExitRunOncePost, makeExit, gd)); }; diff --git a/lib/runner-helpers/make-exit.js b/lib/runner-helpers/make-exit.js index 180cee92..f74710e5 100755 --- a/lib/runner-helpers/make-exit.js +++ b/lib/runner-helpers/make-exit.js @@ -2,10 +2,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); +var path = require("path"); +var util = require("util"); var EE = require("events"); var events = require('suman-events').events; var sumanUtils = require('suman-utils'); var async = require("async"); +var player = require('play-sound')(); var sortBy = require('lodash.sortby'); var AsciiTable = require('ascii-table'); var chalk = require("chalk"); @@ -131,17 +134,45 @@ exports.makeExit = function (runnerObj, tableRows) { process.exit(1); }, timeOutMillis); async.autoInject({ - handleAsyncReporters: function (cb) { - async.each(reporterRets, function (item, cb) { - if (!item || item.count < 1) { - process.nextTick(cb); + makeErrorOrSuccessSound: function (cb) { + if (process.env.SUMAN_WATCH_TEST_RUN === 'yes') { + var soundFilePath = void 0; + if (exitCode === 0) { + soundFilePath = null; } else { + soundFilePath = path.resolve(process.env.HOME + '/fail-trombone-02.mp3'); + } + if (!soundFilePath) { + return process.nextTick(cb); + } + player.play(soundFilePath, { timeout: 5000 }, function (err) { + err && _suman.logError(err); + cb(null); + }); + } + else { + process.nextTick(cb); + } + }, + handleAsyncReporters: function (cb) { + async.eachLimit(reporterRets, 5, function (item, cb) { + if (item && item.count > 0) { + var timedout_1 = false; + var timeoutFn = function () { + timedout_1 = true; + console.error("async reporter " + util.inspect(item.reporterName || item) + ", appears to have timed out."); + cb(null); + }; + setTimeout(timeoutFn, 5000); item.cb = function (err) { err && _suman.logError(err.stack || err); process.nextTick(cb); }; } + else { + process.nextTick(cb); + } }, cb); }, makeGanttChart: function (cb) { diff --git a/lib/runner-helpers/make-exit.ts b/lib/runner-helpers/make-exit.ts index 9d9a7c8b..c2bc5996 100755 --- a/lib/runner-helpers/make-exit.ts +++ b/lib/runner-helpers/make-exit.ts @@ -17,7 +17,7 @@ import cp = require('child_process'); const {events} = require('suman-events'); const sumanUtils = require('suman-utils'); import async = require('async'); - +const player = require('play-sound')(); const sortBy = require('lodash.sortby'); const AsciiTable = require('ascii-table'); import chalk = require('chalk'); @@ -192,20 +192,59 @@ export const makeExit = function (runnerObj, tableRows) { async.autoInject({ - handleAsyncReporters: function (cb: Function) { - async.each(reporterRets, function (item: Object, cb: Function) { + makeErrorOrSuccessSound: function (cb: any) { - if (!item || item.count < 1) { - // if nothing is returned from the reporter module, we can't do anything - // and we assume it was all sync - // likewise if count is less than 1 then we are ready to go - process.nextTick(cb); + if (process.env.SUMAN_WATCH_TEST_RUN === 'yes') { + + let soundFilePath; + + if (exitCode === 0) { + soundFilePath = null; } else { + soundFilePath = path.resolve(process.env.HOME + '/fail-trombone-02.mp3'); + } + + if(!soundFilePath){ + return process.nextTick(cb); + } + + player.play(soundFilePath, {timeout: 5000}, function (err: Error) { + err && _suman.logError(err); + cb(null); + }); + + } + else { + process.nextTick(cb); + } + + }, + + handleAsyncReporters: function (cb: Function) { + async.eachLimit(reporterRets, 5, function (item: Object, cb: Function) { + + if (item && item.count > 0) { + + let timedout = false; + let timeoutFn = function () { + timedout = true; + console.error(`async reporter ${util.inspect(item.reporterName || item)}, appears to have timed out.`); + cb(null); + }; + + setTimeout(timeoutFn, 5000); + item.cb = function (err: Error) { err && _suman.logError(err.stack || err); process.nextTick(cb); - } + }; + } + else { + // if nothing is returned from the reporter module, we can't do anything + // and we assume it was all sync + // likewise if count is less than 1 then we are ready to go + process.nextTick(cb); } }, cb); }, diff --git a/lib/runner-helpers/multiple-process-each-on-exit.js b/lib/runner-helpers/multiple-process-each-on-exit.js index 4710adb5..f9946409 100755 --- a/lib/runner-helpers/multiple-process-each-on-exit.js +++ b/lib/runner-helpers/multiple-process-each-on-exit.js @@ -70,7 +70,10 @@ function default_1(n, runnerObj, tableRows, messages, forkedCPs, beforeExitRunOn runnerObj.endTime = Date.now(); runnerObj.listening = false; var onTAPOutputComplete = function () { - var tasks = [beforeExitRunOncePost, coverage_reporting_1.handleTestCoverageReporting]; + var tasks = [ + beforeExitRunOncePost, + coverage_reporting_1.handleTestCoverageReporting + ]; async.parallel(tasks, function (err) { err && _suman.logError(err.stack || err); makeExit(messages, { diff --git a/lib/runner-helpers/multiple-process-each-on-exit.ts b/lib/runner-helpers/multiple-process-each-on-exit.ts index e7e353a5..32bb6db2 100755 --- a/lib/runner-helpers/multiple-process-each-on-exit.ts +++ b/lib/runner-helpers/multiple-process-each-on-exit.ts @@ -114,7 +114,10 @@ export default function (n: ISumanChildProcess, runnerObj: IRunnerObj, tableRows const onTAPOutputComplete = function () { - const tasks = [beforeExitRunOncePost, handleTestCoverageReporting] as any; + const tasks = [ + beforeExitRunOncePost, + handleTestCoverageReporting + ] as any; async.parallel(tasks, function (err: IPseudoError) { err && _suman.logError(err.stack || err); diff --git a/lib/runner-helpers/on-exit.js b/lib/runner-helpers/on-exit.js index 58c37540..249532fa 100755 --- a/lib/runner-helpers/on-exit.js +++ b/lib/runner-helpers/on-exit.js @@ -7,7 +7,6 @@ var path = require("path"); var EE = require("events"); var chalk = require("chalk"); var events = require('suman-events').events; -var sumanUtils = require('suman-utils'); var _suman = global.__suman = (global.__suman || {}); var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); exports.onExit = function (code) { diff --git a/lib/runner-helpers/on-exit.ts b/lib/runner-helpers/on-exit.ts index e95b30c8..a99944cf 100755 --- a/lib/runner-helpers/on-exit.ts +++ b/lib/runner-helpers/on-exit.ts @@ -1,5 +1,8 @@ 'use strict'; +//dts +import {IGlobalSumanObj} from "../../../suman-types/dts/global"; + //polyfills const process = require('suman-browser-polyfills/modules/process'); const global = require('suman-browser-polyfills/modules/global'); @@ -11,12 +14,11 @@ import EE = require('events'); //npm import * as chalk from 'chalk'; - const {events} = require('suman-events'); -const sumanUtils = require('suman-utils'); +import su = require('suman-utils'); //project -const _suman = global.__suman = (global.__suman || {}); +const _suman : IGlobalSumanObj = global.__suman = (global.__suman || {}); const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); //////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/runner.js b/lib/runner.js index cdc06468..26a6c6ea 100755 --- a/lib/runner.js +++ b/lib/runner.js @@ -69,8 +69,10 @@ var runnerObj = { var handleIntegrantInfo = makeHandleIntegrantInfo(runnerObj, allOncePostKeys); var exit = make_exit_1.makeExit(runnerObj, tableRows); var beforeExitRunOncePost = make_before_exit_once_post_1.makeBeforeExit(runnerObj, oncePosts, allOncePostKeys); -global.__suman.isActualExitHandlerRegistered = true; -process.once('exit', onExit); +{ + _suman.isActualExitHandlerRegistered = true; + process.once('exit', onExit); +} process.on('error', function (e) { _suman.logError(chalk.magenta('Whoops! "error" event in runner process:') + " \n " + chalk.bold(suman_utils_1.default.getCleanErrorString(e))); }); diff --git a/lib/runner.ts b/lib/runner.ts index 082903fb..054b6841 100755 --- a/lib/runner.ts +++ b/lib/runner.ts @@ -1,4 +1,6 @@ 'use strict'; + +//dts import {IRunnerObj, ISumanChildProcess, ITableRows} from "suman-types/dts/runner"; import {IGlobalSumanObj, IPseudoError} from "suman-types/dts/global"; @@ -48,35 +50,27 @@ import cp = require('child_process'); const fnArgs = require('function-arguments'); const mapValues = require('lodash.mapvalues'); import * as chalk from 'chalk'; - const a8b = require('ansi-256-colors'), fg = a8b.fg, bg = a8b.bg; import {events} from 'suman-events'; import su from 'suman-utils'; - const debug = require('suman-debug')('s:runner'); //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); import integrantInjector from './injection/integrant-injector'; import {constants} from '../config/suman-constants'; - const ascii = require('./helpers/ascii'); import makeHandleBlocking from './runner-helpers/make-handle-blocking'; - const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); import {handleFatalMessage} from './runner-helpers/handle-fatal-message'; import {logTestResult} from './runner-helpers/log-test-result'; - const {onExit} = require('./runner-helpers/on-exit'); import {makeExit} from './runner-helpers/make-exit'; - const {makeHandleIntegrantInfo} = require('./runner-helpers/handle-integrant-info'); import {makeBeforeExit} from './runner-helpers/make-before-exit-once-post'; - const makeSingleProcess = require('./runner-helpers/handle-single-process'); const {makeContainerize} = require('./runner-helpers/handle-containerize'); import {makeHandleMultipleProcesses} from './runner-helpers/handle-multiple-processes'; - const IS_SUMAN_SINGLE_PROCESS = process.env.SUMAN_SINGLE_PROCESS === 'yes'; import {getSocketServer, initializeSocketServer} from './runner-helpers/socketio-server'; import {cpHash, socketHash} from './runner-helpers/socket-cp-hash'; @@ -121,8 +115,12 @@ const runnerObj: IRunnerObj = { const handleIntegrantInfo = makeHandleIntegrantInfo(runnerObj, allOncePostKeys); const exit = makeExit(runnerObj, tableRows); const beforeExitRunOncePost = makeBeforeExit(runnerObj, oncePosts, allOncePostKeys); -global.__suman.isActualExitHandlerRegistered = true; -process.once('exit', onExit); + +{ + //register exit here ! + _suman.isActualExitHandlerRegistered = true; + process.once('exit', onExit); +} process.on('error', function (e: IPseudoError) { _suman.logError(`${chalk.magenta('Whoops! "error" event in runner process:')} \n ${chalk.bold(su.getCleanErrorString(e))}`); diff --git a/lib/test-suite-helpers/t-proto.js b/lib/test-suite-helpers/t-proto.js index ff6d5c53..5d279c86 100755 --- a/lib/test-suite-helpers/t-proto.js +++ b/lib/test-suite-helpers/t-proto.js @@ -36,7 +36,7 @@ proto.wrapErrorFirst = proto.wrapErrFirst = function (fn) { }; }; proto.log = function () { - _suman._writeLog.apply(null, arguments); + _suman.writeLog.apply(null, arguments); }; proto.slow = function () { this.timeout(20000); diff --git a/lib/test-suite-helpers/t-proto.ts b/lib/test-suite-helpers/t-proto.ts index 072058cf..b783a727 100755 --- a/lib/test-suite-helpers/t-proto.ts +++ b/lib/test-suite-helpers/t-proto.ts @@ -53,7 +53,7 @@ proto.wrapErrorFirst = proto.wrapErrFirst = function (fn: Function) { }; proto.log = function() { - _suman._writeLog.apply(null, arguments); + _suman.writeLog.apply(null, arguments); }; proto.slow = function () { diff --git a/package.json b/package.json index 294d06c2..4132e9bb 100644 --- a/package.json +++ b/package.json @@ -106,6 +106,10 @@ "should": "^11.2.0", "webpack": "^2.4.0" }, + "optionalDependencies": { + "suman-watch": "latest", + "play-sound": "^1.1.1" + }, "repository": { "type": "git", "url": "git+https://github.com/sumanjs/suman.git" diff --git a/suman-todos.txt b/suman-todos.txt index c257f3db..16021ac1 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -10,8 +10,8 @@ three SO profiles: /// -suman-watch should be optionalDep? -suman-interactive should be optionalDep? + suman-watch should be optionalDep? + suman-interactive should be optionalDep? /// diff --git a/suman.conf.js b/suman.conf.js index 20da3a5e..4ed2ffe5 100755 --- a/suman.conf.js +++ b/suman.conf.js @@ -9,7 +9,7 @@ const numOfCPUs = os.cpus().length || 1; module.exports = Object.freeze({ - //☺,♫ + //☺,♫ // //regex matchAny: [/\.js$/, /.sh$/, /\.jar$/, /\.java$/, /\.go$/, /\.ts$/], @@ -75,7 +75,14 @@ module.exports = Object.freeze({ expireResultsAfter: 10000000, // test results will be deleted after this amount of time watch: { - options: {}, + options: { + shellExecutable: 'bash', + soundFilePaths: { + runtimeError: path.resolve(process.env.HOME + '/fail-trombone-02.mp3'), + success: path.resolve(process.env.HOME + '/ta_da_sound.mp3'), + testFailure: path.resolve(process.env.HOME + '/fail-trombone-02.mp3') + } + }, per: { 'node-dev': { exec: 'suman test/src/dev/node --verbosity=4', @@ -87,12 +94,11 @@ module.exports = Object.freeze({ 'browser-dev': { exec: 'suman test/src/dev/browser', includes: [__dirname], - excludes: ['/test/',/\.ts$/], + excludes: ['/test/', /\.ts$/], confOverride: {} } }, - //////////////////////////////////////////////////// scripts: { diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 03919c6b..8d6f8d8e 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1506934817787,"endDate":1506934818325,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1506934817783,"endDate":1506934823316,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1507005081982,"endDate":1507005082606,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507005081977,"endDate":1507005087600,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; diff --git a/test/src/dev/node/1.test.js b/test/src/dev/node/1.test.js index 20fecb76..7218c1f1 100644 --- a/test/src/dev/node/1.test.js +++ b/test/src/dev/node/1.test.js @@ -9,10 +9,8 @@ const Test = suman.init(module); let count = 0; const opts = {series: true, fixed: true}; - Test.create(opts, function (assert, describe, before, beforeEach, after, afterEach, it) { - it('sync test', t => { assert(true); }); @@ -22,7 +20,6 @@ Test.create(opts, function (assert, describe, before, beforeEach, after, afterEa h.assert.equal(count, 1); }); - describe('nested1', () => { // console.log('before => ', before); From 333aa8efdb84ea1e32d864b6aa94953562b23710 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Mon, 2 Oct 2017 22:50:24 -0700 Subject: [PATCH 24/32] pdev:set --- lib/handle-exit.ts | 2 - lib/index.js | 4 +- lib/index.ts | 4 +- lib/injection/injection-container.ts | 1 - lib/runner-helpers/create-suman-runner.js | 10 +- lib/runner-helpers/create-suman-runner.ts | 9 +- .../handle-multiple-processes.js | 3 +- .../handle-multiple-processes.ts | 5 +- lib/runner-helpers/on-exit.js | 6 +- lib/runner-helpers/on-exit.ts | 6 +- suman-todos.txt | 104 ++++++++---------- test/.suman/gantt-4.html | 2 +- test/src/dev/node/1.test.js | 2 +- 13 files changed, 72 insertions(+), 86 deletions(-) diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 94cfef51..58e17d63 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -36,8 +36,6 @@ if (!process.prependOnceListener) { process.prependOnceListener('exit', function (code: number) { - // _suman.logError('beginning of final exit call...'); - if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e: Error) { diff --git a/lib/index.js b/lib/index.js index a742caa2..8289f871 100755 --- a/lib/index.js +++ b/lib/index.js @@ -58,14 +58,14 @@ var load_shared_objects_1 = require("./helpers/load-shared-objects"); var acquire_ioc_static_deps_1 = require("./acquire-dependencies/acquire-ioc-static-deps"); var allOncePreKeys = _suman.oncePreKeys = []; var allOncePostKeys = _suman.oncePostKeys = []; -var suiteResultEmitter = _suman.suiteResultEmitter = (_suman.suiteResultEmitter || new EE()); +var suiteResultEmitter = _suman.suiteResultEmitter = _suman.suiteResultEmitter || new EE(); if (!SUMAN_SINGLE_PROCESS) { require('./helpers/handle-suman-counts'); } require('./index-helpers/verify-local-global-version'); var projectRoot = _suman.projectRoot = _suman.projectRoot || su.findProjectRoot(process.cwd()) || '/'; var main = require.main.filename; -var usingRunner = _suman.usingRunner = (_suman.usingRunner || process.env.SUMAN_RUNNER === 'yes'); +var usingRunner = _suman.usingRunner = _suman.usingRunner || process.env.SUMAN_RUNNER === 'yes'; var sumanConfig = load_suman_config_1.loadSumanConfig(null, null); if (!_suman.usingRunner && !_suman.viaSuman) { require('./helpers/print-version-info'); diff --git a/lib/index.ts b/lib/index.ts index 482b0527..55e5d7a4 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -107,7 +107,7 @@ import {acquireIocStaticDeps} from './acquire-dependencies/acquire-ioc-static-de //integrants const allOncePreKeys: Array> = _suman.oncePreKeys = []; const allOncePostKeys: Array> = _suman.oncePostKeys = []; -const suiteResultEmitter = _suman.suiteResultEmitter = (_suman.suiteResultEmitter || new EE()); +const suiteResultEmitter = _suman.suiteResultEmitter = _suman.suiteResultEmitter || new EE(); //////////////////////////////////////////////////////////////////////////////////////////// @@ -118,7 +118,7 @@ if (!SUMAN_SINGLE_PROCESS) { require('./index-helpers/verify-local-global-version'); const projectRoot = _suman.projectRoot = _suman.projectRoot || su.findProjectRoot(process.cwd()) || '/'; const main = require.main.filename; -const usingRunner = _suman.usingRunner = (_suman.usingRunner || process.env.SUMAN_RUNNER === 'yes'); +const usingRunner = _suman.usingRunner = _suman.usingRunner || process.env.SUMAN_RUNNER === 'yes'; //could potentially pass dynamic path to suman config here, but for now is static const sumanConfig = loadSumanConfig(null, null); if (!_suman.usingRunner && !_suman.viaSuman) { diff --git a/lib/injection/injection-container.ts b/lib/injection/injection-container.ts index e594536a..fb626a32 100755 --- a/lib/injection/injection-container.ts +++ b/lib/injection/injection-container.ts @@ -139,7 +139,6 @@ export const makeInjectionContainer = function (suman: ISuman) { } return meth().apply(suman.ctx, args); - }; return suman.testBlockMethodCache[cacheId] = getProxy(fn, newProps); diff --git a/lib/runner-helpers/create-suman-runner.js b/lib/runner-helpers/create-suman-runner.js index 7c30a82c..f371c6b6 100755 --- a/lib/runner-helpers/create-suman-runner.js +++ b/lib/runner-helpers/create-suman-runner.js @@ -4,20 +4,22 @@ var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); var fs = require("fs"); var path = require("path"); +var util = require("util"); var assert = require("assert"); var chalk = require("chalk"); var su = require("suman-utils"); var _suman = global.__suman = (global.__suman || {}); var cwd = process.cwd(); var socketio_server_1 = require("./socketio-server"); +var runnerDebugLogPath = _suman.sumanRunnerStderrStreamPath = + path.resolve(_suman.sumanHelperDirRoot + '/logs/runner-debug.log'); exports.createRunner = function (obj) { var runObj = obj.runObj; - var strmPath = _suman.sumanRunnerStderrStreamPath = path.resolve(_suman.sumanHelperDirRoot + '/logs/runner-debug.log'); - var strm = _suman.sumanStderrStream = fs.createWriteStream(strmPath); + var strm = _suman.sumanStderrStream = fs.createWriteStream(runnerDebugLogPath); strm.write('\n\n### Suman runner start ###\n\n'); strm.write('Beginning of run at ' + Date.now() + ' = [' + new Date() + ']' + '\n'); - strm.write('Command issued from the following directory "' + cwd + '"\n'); - strm.write('Command = ' + JSON.stringify(process.argv) + '\n'); + strm.write('Suman command issued from the following directory "' + cwd + '"\n'); + strm.write('Suman "process.argv" => \n' + util.inspect(process.argv) + '\n'); var oncePath = path.resolve(_suman.sumanHelperDirRoot + '/suman.once.pre.js'); var runOnce; try { diff --git a/lib/runner-helpers/create-suman-runner.ts b/lib/runner-helpers/create-suman-runner.ts index 47f19055..9770edb4 100755 --- a/lib/runner-helpers/create-suman-runner.ts +++ b/lib/runner-helpers/create-suman-runner.ts @@ -23,19 +23,20 @@ import su = require('suman-utils'); const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); const cwd = process.cwd(); import {initializeSocketServer} from './socketio-server'; +const runnerDebugLogPath = _suman.sumanRunnerStderrStreamPath = + path.resolve(_suman.sumanHelperDirRoot + '/logs/runner-debug.log'); //////////////////////////////////////////////////////////////////////////// export const createRunner = function (obj: Object) { const runObj = obj.runObj; - const strmPath = _suman.sumanRunnerStderrStreamPath = path.resolve(_suman.sumanHelperDirRoot + '/logs/runner-debug.log'); - const strm = _suman.sumanStderrStream = fs.createWriteStream(strmPath); + const strm = _suman.sumanStderrStream = fs.createWriteStream(runnerDebugLogPath); strm.write('\n\n### Suman runner start ###\n\n'); strm.write('Beginning of run at ' + Date.now() + ' = [' + new Date() + ']' + '\n'); - strm.write('Command issued from the following directory "' + cwd + '"\n'); - strm.write('Command = ' + JSON.stringify(process.argv) + '\n'); + strm.write('Suman command issued from the following directory "' + cwd + '"\n'); + strm.write('Suman "process.argv" => \n' + util.inspect(process.argv) + '\n'); /////////////// validate suman.once.js ////////////////////////////////////////////////////////// diff --git a/lib/runner-helpers/handle-multiple-processes.js b/lib/runner-helpers/handle-multiple-processes.js index 78328603..5fc05b81 100755 --- a/lib/runner-helpers/handle-multiple-processes.js +++ b/lib/runner-helpers/handle-multiple-processes.js @@ -388,8 +388,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, return '[' + n.shortTestPath + '] ' + line; }) .join('\n'); - _suman.sumanStderrStream.write('\n\n'); - _suman.sumanStderrStream.write(d); + _suman.sumanStderrStream.write('\n' + d); if (_suman.weAreDebugging) { console.log('pid => ', n.pid, 'stderr => ', d); } diff --git a/lib/runner-helpers/handle-multiple-processes.ts b/lib/runner-helpers/handle-multiple-processes.ts index 88dc9e5a..2558af32 100755 --- a/lib/runner-helpers/handle-multiple-processes.ts +++ b/lib/runner-helpers/handle-multiple-processes.ts @@ -1,4 +1,6 @@ 'use strict'; + +//dts import {IRunnerObj, IRunnerRunFn, IRunObj, ISumanChildProcess, ITableRows} from "suman-types/dts/runner"; import {IGlobalSumanObj, IPseudoError} from "suman-types/dts/global"; @@ -559,8 +561,7 @@ export const makeHandleMultipleProcesses = }) .join('\n'); - _suman.sumanStderrStream.write('\n\n'); - _suman.sumanStderrStream.write(d); + _suman.sumanStderrStream.write('\n' +d); if (_suman.weAreDebugging) { //TODO: add check for NODE_ENV=dev_local_debug //TODO: go through code and make sure that no console.log statements should in fact be console.error diff --git a/lib/runner-helpers/on-exit.js b/lib/runner-helpers/on-exit.js index 249532fa..946f6d4a 100755 --- a/lib/runner-helpers/on-exit.js +++ b/lib/runner-helpers/on-exit.js @@ -7,8 +7,8 @@ var path = require("path"); var EE = require("events"); var chalk = require("chalk"); var events = require('suman-events').events; -var _suman = global.__suman = (global.__suman || {}); -var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); +var _suman = global.__suman = global.__suman || {}; +var resultBroadcaster = _suman.resultBroadcaster = _suman.resultBroadcaster || new EE(); exports.onExit = function (code) { if (code > 0) { resultBroadcaster.emit(String(events.RUNNER_EXIT_CODE_GREATER_THAN_ZERO), code); @@ -23,5 +23,5 @@ exports.onExit = function (code) { console.log('\n', ' => At least one test experienced an error => View the test logs => ', '\n', chalk.yellow.bold(logsPath), '\n'); } resultBroadcaster.emit(String(events.RUNNER_EXIT_CODE), code); - fs.appendFileSync(_suman.sumanRunnerStderrStreamPath, '\n\n\n### Suman runner end ###\n\n\n\n\n'); + fs.appendFileSync(_suman.sumanRunnerStderrStreamPath, '\n\n### Suman runner end ###\n\n'); }; diff --git a/lib/runner-helpers/on-exit.ts b/lib/runner-helpers/on-exit.ts index a99944cf..d0d20e31 100755 --- a/lib/runner-helpers/on-exit.ts +++ b/lib/runner-helpers/on-exit.ts @@ -18,8 +18,8 @@ const {events} = require('suman-events'); import su = require('suman-utils'); //project -const _suman : IGlobalSumanObj = global.__suman = (global.__suman || {}); -const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); +const _suman: IGlobalSumanObj = global.__suman = global.__suman || {}; +const resultBroadcaster = _suman.resultBroadcaster = _suman.resultBroadcaster || new EE(); //////////////////////////////////////////////////////////////////////////////////////// @@ -46,6 +46,6 @@ export const onExit = function (code: number) { resultBroadcaster.emit(String(events.RUNNER_EXIT_CODE), code); //write synchronously to ensure it gets written - fs.appendFileSync(_suman.sumanRunnerStderrStreamPath, '\n\n\n### Suman runner end ###\n\n\n\n\n'); + fs.appendFileSync(_suman.sumanRunnerStderrStreamPath, '\n\n### Suman runner end ###\n\n'); }; diff --git a/suman-todos.txt b/suman-todos.txt index 16021ac1..cb35860f 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -4,6 +4,16 @@ three SO profiles: 2. via facebook login on chrome 3. the1mills@yahoo.com on firefox "Olegzandr Denman" +/// + + in --series mode -> we should put currently executing test or hook in global space + especially for the browser. + +/// + + use es6 symbols to hide properties? + https://www.keithcirkel.co.uk/metaprogramming-in-es6-symbols/ + /// the runner hangs every few runs, there must be a race condition @@ -35,7 +45,6 @@ cd $(dirname "$0") //// suman --scripts abc - => should run the script that's in suman.conf.js /// @@ -46,12 +55,10 @@ cd $(dirname "$0") /// babel: - removed these from {package.json}.devDependencies: - "babel-loader": "^6.4.1", - "babel-polyfill": "^6.23.0", - "babel-preset-latest": "^6.24.0", + "babel-polyfill": "^6.23.0", + "babel-preset-latest": "^6.24.0", /// @@ -63,28 +70,24 @@ cd $(dirname "$0") /// - before / beforeEach hooks should attach a value to suman.$inject if a value is returned + before / beforeEach hooks should attach a value to suman.$inject if a value is returned /// -// after always may not be run in the right order -async.eachSeries(allDescribeBlocks, function (block: ITestSuite, cb: Function) { + after always may not be run in the right order + async.eachSeries(allDescribeBlocks, function (block: ITestSuite, cb: Function) { /// - => afterEach should have test info, not just value/data + => afterEach should have test info, not just value/data //// - => test suman itself with suman, then we can make final adjustments before release - -/// - - => chai 4.0.2 works. + => test suman itself with suman, then we can make final adjustments before release /// - _suman.ctx => suman.ctx ? + => chai 4.0.2 works. /// @@ -92,17 +95,17 @@ async.eachSeries(allDescribeBlocks, function (block: ITestSuite, cb: Function) { /// - we should be able to create a test file with suman --create - and run the file, without running suman --init on a directory, see unnecessary error: + we should be able to create a test file with suman --create + and run the file, without running suman --init on a directory, see unnecessary error: - => Suman could *not* locate your ; perhaps you need to update your suman.conf.js file, please see: *** + => Suman could *not* locate your ; perhaps you need to update your suman.conf.js file, please see: *** => http://sumanjs.org/conf.html => We expected to find your here => - /Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman-types/suman + /Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman-types/suman - => If there is NO SUMAN HELPERS DIR, flip a boolean, and just use all the default files. + => If there is NO SUMAN HELPERS DIR, flip a boolean, and just use all the default files. - // >>>>> or just run the test with node instead of suman? + // >>>>> or just run the test with node instead of suman? /// @@ -130,7 +133,6 @@ Test.create('hotels2', {parallel: false}, function (it, before, beforeEach, desc }); - /// ⚑ Suman fatal error => making a graceful exit => @@ -149,12 +151,6 @@ Test.create('hotels2', {parallel: false}, function (it, before, beforeEach, desc => if error message is multi-line, it gets removed...for example when we call "'no success property on body => ' + util.inspect(x) " - -/// - - in --series mode -> we should put currently executing test or hook in global space - especially for the browser. - /// https://stackoverflow.com/a/1221870/5020949 @@ -178,24 +174,19 @@ node test/src/exp.js | grep -v [[suman]] /// - use es6 symbols to hide properties? - https://www.keithcirkel.co.uk/metaprogramming-in-es6-symbols/ - -/// - - before hooks can be stubbed? => before('merry'); + before hooks can be stubbed? => before('merry'); /// - improve tables -> they should work on Jenkins, etc. + improve tables -> they should work on Jenkins, etc. /// - enforceUniqueTestCaseNames:true + enforceUniqueTestCaseNames:true /// -fatal error in hook does not have cause or reason (the first line!): + fatal error in hook does not have cause or reason (the first line!): ⚑ Suman fatal error => making a graceful exit => Error: => fatal error in hook => (to continue even in the event of an error in a hook, use option {fatal:false}) => @@ -236,56 +227,51 @@ fatal error in hook does not have cause or reason (the first line!): /// -use git submodules to publish suman-types -https://git-scm.com/book/en/v2/Git-Tools-Submodules - -/// - - using suman.ctx instead of _suman.ctx would allow this - run Test.creates suman.ioc.js files in parallel? + use git submodules to publish suman-types + https://git-scm.com/book/en/v2/Git-Tools-Submodules /// - use https://github.com/tunnckoCore/parse-function, instead of function-arguments + use https://github.com/tunnckoCore/parse-function, instead of function-arguments /// - after hooks should be fatal:false by default? + after hooks should be fatal:false by default? /// - when `suman --init` is run, we should create a dir called .suman not suman - and suman-default-config.js should be updated to reflect that + when `suman --init` is run, we should create a dir called .suman not suman + and suman-default-config.js should be updated to reflect that /// - suman test/src/tap-output/tap-producer1.js --runner --use-tap => exit code is 56 - suman test/src/tap-output/tap-producer1.js --runner => exit code is 1 + suman test/src/tap-output/tap-producer1.js --runner --use-tap => exit code is 56 + suman test/src/tap-output/tap-producer1.js --runner => exit code is 1 // - in order for parallel-max to work properly, - the last test suite to be put on the queue, needs to wait. + in order for parallel-max to work properly, + the last test suite to be put on the queue, needs to wait. // - => absolute --parallel would just mean unleashing things in exec-suite.js so that a parent does *not* need to complete - before a child starts. + => absolute --parallel would just mean unleashing things in exec-suite.js so that a parent does *not* need to complete + before a child starts. // - --use-tap prevents tables from being printed by runner, weird. + --use-tap prevents tables from being printed by runner, weird. /// - "please report this on the Github issue..." => add a link to these instance in the codebase to sumanjs/suman#issues + "please report this on the Github issue..." => add a link to these instance in the codebase to sumanjs/suman#issues /// - when a command in run.sh fails, we need to send that stderr - to the runner, e.g.: + when a command in run.sh fails, we need to send that stderr + to the runner, e.g.: - => [suman child stderr] => ./suman/test/src/mocha/@run.sh: line 6: mocha: command not found + => [suman child stderr] => ./suman/test/src/mocha/@run.sh: line 6: mocha: command not found //// diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 8d6f8d8e..3086ff5a 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1507005081982,"endDate":1507005082606,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507005081977,"endDate":1507005087600,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1507009670922,"endDate":1507009671569,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"FAILED"},{"startDate":1507009670917,"endDate":1507009671569,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; diff --git a/test/src/dev/node/1.test.js b/test/src/dev/node/1.test.js index 7218c1f1..71794ca0 100644 --- a/test/src/dev/node/1.test.js +++ b/test/src/dev/node/1.test.js @@ -12,7 +12,7 @@ const opts = {series: true, fixed: true}; Test.create(opts, function (assert, describe, before, beforeEach, after, afterEach, it) { it('sync test', t => { - assert(true); + assert(false); }); before(h => { From b1d4e2be20e525db6d033507d9650964399c89e3 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Tue, 3 Oct 2017 13:24:58 -0700 Subject: [PATCH 25/32] pdev:set --- cli.ts | 4 +-- lib/exec-suite.js | 1 - lib/exec-suite.ts | 2 -- lib/handle-exit.js | 21 ++++++++++++++ lib/handle-exit.ts | 24 ++++++++++++++++ lib/helpers/add-suman-global-properties.js | 1 - lib/helpers/add-suman-global-properties.ts | 2 -- lib/helpers/handle-suman-counts.js | 10 +++++-- lib/helpers/handle-suman-counts.ts | 12 ++++++-- lib/helpers/log-stdio-of-child.js | 15 +++++++--- lib/helpers/log-stdio-of-child.ts | 28 +++++++++++-------- lib/helpers/resolve-shared-dirs.js | 4 +-- lib/helpers/resolve-shared-dirs.ts | 7 ++--- lib/index.js | 1 - lib/index.ts | 1 - lib/injection/injection-container.js | 3 -- lib/injection/injection-container.ts | 5 ---- .../handle-multiple-processes.js | 13 +++++---- .../handle-multiple-processes.ts | 19 +++++++------ lib/runner-helpers/handle-tap.js | 1 - lib/runner-helpers/handle-tap.ts | 5 +--- lib/runner-helpers/run-child.ts | 2 +- lib/test-suite-helpers/get-all-eaches.js | 8 +++--- lib/test-suite-helpers/get-all-eaches.ts | 8 +++--- .../notify-parent-that-child-is-complete.js | 1 - .../notify-parent-that-child-is-complete.ts | 1 - suman-todos.txt | 20 ++++--------- test/.suman/gantt-4.html | 2 +- test/src/dev/node/1.test.js | 2 +- 29 files changed, 131 insertions(+), 92 deletions(-) diff --git a/cli.ts b/cli.ts index 0ac2761b..98ce1b70 100755 --- a/cli.ts +++ b/cli.ts @@ -53,7 +53,7 @@ function handleExceptionsAndRejections() { process.on('uncaughtException', function (err: Error) { - debugger; + debugger; // leave it here :) if (typeof err !== 'object') { console.error(new Error(`err passed to uncaughtException was not an object => ${err}`).stack); @@ -77,7 +77,7 @@ process.on('uncaughtException', function (err: Error) { process.on('unhandledRejection', function (err: Error, p: Promise) { - debugger; + debugger; // leave it here :) if (typeof err !== 'object') { console.error(new Error(`err passed to unhandledRejection was not an object => '${err}'`).stack); diff --git a/lib/exec-suite.js b/lib/exec-suite.js index 6ba4ce22..33d352ce 100755 --- a/lib/exec-suite.js +++ b/lib/exec-suite.js @@ -245,7 +245,6 @@ exports.execSuite = function (suman) { _suman.logError("\"UncaughtException\" event => halting program.\n[" + __filename + "]"); return; } - debugger; if (sumanOpts.parallel_max) { suman.getQueue().drain = function () { onSumanCompleted(0, null); diff --git a/lib/exec-suite.ts b/lib/exec-suite.ts index 8c85ab8f..e11a66b9 100755 --- a/lib/exec-suite.ts +++ b/lib/exec-suite.ts @@ -352,8 +352,6 @@ export const execSuite = function (suman: ISuman): Function { return; } - debugger; - if (sumanOpts.parallel_max) { suman.getQueue().drain = function () { onSumanCompleted(0, null); diff --git a/lib/handle-exit.js b/lib/handle-exit.js index 06066413..99ad1c11 100755 --- a/lib/handle-exit.js +++ b/lib/handle-exit.js @@ -2,6 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); +var fs = require("fs"); var chalk = require("chalk"); var suman_utils_1 = require("suman-utils"); var _suman = global.__suman = (global.__suman || {}); @@ -16,6 +17,9 @@ if (!process.prependOnceListener) { process.prependOnceListener = process.on.bind(process); } process.prependOnceListener('exit', function (code) { + var testDebugLogPath = _suman.testDebugLogPath; + debugger; + _suman.logError('beginning of exit handler.'); if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e) { @@ -27,6 +31,21 @@ process.prependOnceListener('exit', function (code) { else if (testErrors.length > 0) { code = code || constants.EXIT_CODES.TEST_CASE_FAIL; } + if (testDebugLogPath) { + _suman.logError('BEGIN of log log log.'); + var reached_1 = false; + setTimeout(function () { + if (!reached_1) { + debugger; + } + }, 100); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + reached_1 = true; + _suman.logError('END of log log log.'); + } _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', { suppress: true }); if (code > 0 && testErrors.length < 1) { if (!_suman.usingRunner) { @@ -70,5 +89,7 @@ process.prependOnceListener('exit', function (code) { _suman.logError('killing daemon process, using absolute last hook.'); _suman.absoluteLastHook(code); } + _suman.logError('doing the very last thing whoa.'); + _suman.logError('setting final exit code now.'); process.exitCode = code; }); diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 58e17d63..522d6a8e 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -36,6 +36,12 @@ if (!process.prependOnceListener) { process.prependOnceListener('exit', function (code: number) { + const testDebugLogPath = _suman.testDebugLogPath; + + debugger; + + _suman.logError('beginning of exit handler.'); + if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e: Error) { @@ -48,6 +54,22 @@ process.prependOnceListener('exit', function (code: number) { code = code || constants.EXIT_CODES.TEST_CASE_FAIL; } + if(testDebugLogPath){ + _suman.logError('BEGIN of log log log.'); + let reached = false; + setTimeout(function(){ + if(!reached){ + debugger; + } + }, 100); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + reached = true; + _suman.logError('END of log log log.'); + } + _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', {suppress: true}); if (code > 0 && testErrors.length < 1) { @@ -99,6 +121,8 @@ process.prependOnceListener('exit', function (code: number) { _suman.absoluteLastHook(code); } + _suman.logError('doing the very last thing whoa.'); + _suman.logError('setting final exit code now.'); // => we probably don't need this... // _suman.logError('making final call to process.exit()'); process.exitCode = code; diff --git a/lib/helpers/add-suman-global-properties.js b/lib/helpers/add-suman-global-properties.js index e13aed29..1dde17ab 100755 --- a/lib/helpers/add-suman-global-properties.js +++ b/lib/helpers/add-suman-global-properties.js @@ -5,7 +5,6 @@ var global = require('suman-browser-polyfills/modules/global'); var chalk = require("chalk"); var log_prepend_1 = require("log-prepend"); var _suman = global.__suman = (global.__suman || {}); -debugger; if (!('SUMAN_INCEPTION_LEVEL' in process.env) || process.argv.indexOf('--force-inception-level-zero')) { _suman.inceptionLevel = 0; process.env.SUMAN_INCEPTION_LEVEL = 0; diff --git a/lib/helpers/add-suman-global-properties.ts b/lib/helpers/add-suman-global-properties.ts index c49b3e74..6155eb28 100755 --- a/lib/helpers/add-suman-global-properties.ts +++ b/lib/helpers/add-suman-global-properties.ts @@ -14,8 +14,6 @@ import {pt} from 'prepend-transform'; //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); -debugger; - if (!('SUMAN_INCEPTION_LEVEL' in process.env) || process.argv.indexOf('--force-inception-level-zero')) { _suman.inceptionLevel = 0; process.env.SUMAN_INCEPTION_LEVEL = 0; diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index b476bc46..9b36351a 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -14,7 +14,6 @@ var suiteResultEmitter = _suman.suiteResultEmitter = _suman.suiteResultEmitter | var resultBroadcaster = _suman.resultBroadcaster = _suman.resultBroadcaster || new EE(); var results = _suman.tableResults = _suman.tableResults || []; suiteResultEmitter.once('suman-test-file-complete', function () { - debugger; var fn, resultz; if (_suman.usingRunner) { resultz = results.map(function (i) { return i.tableData; }); @@ -41,7 +40,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { return process.nextTick(cb); } var timedout = false; - var timeout = _suman.usingRunner ? 20 : 10; + var timeout = _suman.usingRunner ? 200 : 100; var onTimeout = function () { timedout = true; cb(null); @@ -60,7 +59,14 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } }; }; + _suman.log(' => about to waitForStdioToDrain'); + _suman.log(' => about to call process.exit1'); + _suman.log(' => about to call process.exit2'); + _suman.log(' => about to call process.exit3'); waitForStdioToDrain(function () { + _suman.log(' => about to call process.exit4'); + _suman.log(' => about to call process.exit5'); + _suman.log(' => about to call process.exit6'); process.exit(highestExitCode); }); }); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index 4dc8bbca..4f778960 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -30,8 +30,6 @@ const results: Array = _suman.tableResults = _suman.table suiteResultEmitter.once('suman-test-file-complete', function () { - debugger; - let fn, resultz; if (_suman.usingRunner) { @@ -70,7 +68,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } let timedout = false; - let timeout = _suman.usingRunner ? 20 : 10; + let timeout = _suman.usingRunner ? 200 : 100; let onTimeout = function () { timedout = true; @@ -93,7 +91,15 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } }; + _suman.log(' => about to waitForStdioToDrain'); + _suman.log(' => about to call process.exit1'); + _suman.log(' => about to call process.exit2'); + _suman.log(' => about to call process.exit3'); + waitForStdioToDrain(function () { + _suman.log(' => about to call process.exit4'); + _suman.log(' => about to call process.exit5'); + _suman.log(' => about to call process.exit6'); process.exit(highestExitCode) }); diff --git a/lib/helpers/log-stdio-of-child.js b/lib/helpers/log-stdio-of-child.js index a71f9956..d6b9b609 100755 --- a/lib/helpers/log-stdio-of-child.js +++ b/lib/helpers/log-stdio-of-child.js @@ -27,7 +27,7 @@ exports.run = function (filePath) { _suman.logError('\n'); return; } - var isDeleteFile_1 = true, writeToFileStream = true; + var isDeleteFile_1 = true, writeToFileStream_1 = true; var temp = su.removePath(filePath, _suman.projectRoot); var onlyFile = String(temp).replace(/\//g, '.'); var logfile_1 = path.resolve(f + '/' + onlyFile + '.log'); @@ -36,6 +36,10 @@ exports.run = function (filePath) { strm_1.on('error', function (e) { _suman.logError(e.stack || e); }); + _suman.endLogStream = function () { + writeToFileStream_1 = false; + strm_1.end('this is the end\n'); + }; strm_1.on('drain', function () { _suman.isStrmDrained = true; _suman.drainCallback && _suman.drainCallback(logfile_1); @@ -45,7 +49,9 @@ exports.run = function (filePath) { process.stderr.write = function () { _suman.isStrmDrained = false; isDeleteFile_1 = false; - strm_1.write.apply(strm_1, arguments); + if (writeToFileStream_1) { + strm_1.write.apply(strm_1, arguments); + } stderrWrite_1.apply(process.stderr, arguments); }; } @@ -55,7 +61,9 @@ exports.run = function (filePath) { process.stdout.write = function () { _suman.isStrmDrained = false; isDeleteFile_1 = false; - strm_1.write.apply(strm_1, arguments); + if (writeToFileStream_1) { + strm_1.write.apply(strm_1, arguments); + } stdoutWrite_1.apply(process.stdout, arguments); }; } @@ -69,7 +77,6 @@ exports.run = function (filePath) { } } else { - fs.appendFileSync(logfile_1, '\n => This is the end of the test.'); } }); } diff --git a/lib/helpers/log-stdio-of-child.ts b/lib/helpers/log-stdio-of-child.ts index 85fd171e..4bdd9483 100755 --- a/lib/helpers/log-stdio-of-child.ts +++ b/lib/helpers/log-stdio-of-child.ts @@ -61,12 +61,13 @@ export const run = function (filePath: string) { _suman.logError(e.stack || e); }); - // _suman.endLogStream = function () { - // // _suman.logError('endLogStream finished.'); - // // rstrm.unpipe(); - // writeToFileStream = false; - // // strm.end(); - // }; + _suman.endLogStream = function () { + // _suman.logError('endLogStream finished.'); + // rstrm.unpipe(); + writeToFileStream = false; + strm.end('this is the end\n'); + + }; strm.on('drain', function () { _suman.isStrmDrained = true; @@ -86,7 +87,11 @@ export const run = function (filePath: string) { // _suman.logError(e.stack || e); // } // } - strm.write.apply(strm, arguments); + + if (writeToFileStream) { + strm.write.apply(strm, arguments); + } + stderrWrite.apply(process.stderr, arguments); }; } @@ -98,10 +103,9 @@ export const run = function (filePath: string) { process.stdout.write = function () { _suman.isStrmDrained = false; isDeleteFile = false; - // if (writeToFileStream) { - // strm.write.apply(strm, arguments); - // } - strm.write.apply(strm, arguments); + if (writeToFileStream) { + strm.write.apply(strm, arguments); + } stdoutWrite.apply(process.stdout, arguments); }; } @@ -118,7 +122,7 @@ export const run = function (filePath: string) { } } else { - fs.appendFileSync(logfile, '\n => This is the end of the test.'); + // fs.appendFileSync(logfile, '\n => This is the end of the test.'); } }); } diff --git a/lib/helpers/resolve-shared-dirs.js b/lib/helpers/resolve-shared-dirs.js index d930ff78..0506e181 100755 --- a/lib/helpers/resolve-shared-dirs.js +++ b/lib/helpers/resolve-shared-dirs.js @@ -40,13 +40,13 @@ exports.resolveSharedDirs = function (sumanConfig, projectRoot, sumanOpts) { var testSrcDirDefined = !!sumanConfig.testSrcDir; var testDir = process.env.TEST_DIR = _suman.testDir = path.resolve(projectRoot + '/' + (sumanConfig.testDir || 'test')); var testSrcDir = process.env.TEST_SRC_DIR = _suman.testSrcDir = path.resolve(projectRoot + '/' + (sumanConfig.testSrcDir || 'test')); - var errStrmPath = path.resolve(sumanHelpersDir + '/logs/test-debug.log'); + var debugStreamPath = path.resolve(sumanHelpersDir + '/logs/test-debug.log'); return loaded = Object.freeze({ sumanHelpersDir: _suman.sumanHelperDirRoot = process.env.SUMAN_HELPERS_DIR_ROOT = sumanHelpersDir, sumanLogDir: _suman.sumanLogDir = logDir, integPrePath: _suman.integPrePath = integPrePath, integPostPath: _suman.integPostPath = integPostPath, sumanHelpersDirLocated: sumanHelpersDirLocated, - testDebugLogPath: errStrmPath + testDebugLogPath: _suman.testDebugLogPath = debugStreamPath }); }; diff --git a/lib/helpers/resolve-shared-dirs.ts b/lib/helpers/resolve-shared-dirs.ts index 6811f1ff..808f45eb 100755 --- a/lib/helpers/resolve-shared-dirs.ts +++ b/lib/helpers/resolve-shared-dirs.ts @@ -53,7 +53,7 @@ export const resolveSharedDirs = function (sumanConfig: ISumanConfig, projectRoo } catch (err) { console.error('\n\n', chalk.magenta('=> Suman could *not* locate your ; ' + - 'perhaps you need to update your suman.conf.js file, please see: ***'), '\n', + 'perhaps you need to update your suman.conf.js file, please see: ***'), '\n', chalk.cyan(' => http://sumanjs.org/conf.html'), '\n', ' => We expected to find your here =>', '\n', chalk.bgBlack.cyan(sumanHelpersDir), '\n'); @@ -71,8 +71,7 @@ export const resolveSharedDirs = function (sumanConfig: ISumanConfig, projectRoo const testSrcDirDefined = !!sumanConfig.testSrcDir; //TODO: check for valid string const testDir = process.env.TEST_DIR = _suman.testDir = path.resolve(projectRoot + '/' + (sumanConfig.testDir || 'test')); const testSrcDir = process.env.TEST_SRC_DIR = _suman.testSrcDir = path.resolve(projectRoot + '/' + (sumanConfig.testSrcDir || 'test')); - const errStrmPath = path.resolve(sumanHelpersDir + '/logs/test-debug.log'); - + const debugStreamPath = path.resolve(sumanHelpersDir + '/logs/test-debug.log'); return loaded = Object.freeze({ sumanHelpersDir: _suman.sumanHelperDirRoot = process.env.SUMAN_HELPERS_DIR_ROOT = sumanHelpersDir, @@ -80,7 +79,7 @@ export const resolveSharedDirs = function (sumanConfig: ISumanConfig, projectRoo integPrePath: _suman.integPrePath = integPrePath, integPostPath: _suman.integPostPath = integPostPath, sumanHelpersDirLocated: sumanHelpersDirLocated, - testDebugLogPath: errStrmPath + testDebugLogPath: _suman.testDebugLogPath = debugStreamPath }); }; diff --git a/lib/index.js b/lib/index.js index 8289f871..450e69b2 100755 --- a/lib/index.js +++ b/lib/index.js @@ -81,7 +81,6 @@ var testRuns = []; var testSuiteRegistrationQueueCallbacks = []; var c = (sumanOpts && sumanOpts.series) ? 1 : 3; var testSuiteQueue = async.queue(function (task, cb) { - debugger; testSuiteQueueCallbacks.unshift(cb); process.nextTick(task); }, c); diff --git a/lib/index.ts b/lib/index.ts index 55e5d7a4..2d4c5ab7 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -139,7 +139,6 @@ const testSuiteRegistrationQueueCallbacks: Array = []; const c = (sumanOpts && sumanOpts.series) ? 1 : 3; const testSuiteQueue = async.queue(function (task: Function, cb: Function) { - debugger; testSuiteQueueCallbacks.unshift(cb); process.nextTick(task); }, c); diff --git a/lib/injection/injection-container.js b/lib/injection/injection-container.js index d2fa853f..c083a1e7 100755 --- a/lib/injection/injection-container.js +++ b/lib/injection/injection-container.js @@ -31,21 +31,18 @@ exports.makeInjectionContainer = function (suman) { var getProxy = function (val, props) { return new Proxy(val, { get: function (target, prop) { - debugger; if (typeof prop === 'symbol') { return Reflect.get.apply(Reflect, arguments); } var meth = String(prop).toLowerCase(); if (!possibleProps[meth]) { try { - debugger; return Reflect.get.apply(Reflect, arguments); } catch (err) { throw new Error("Test suite may not have a '" + prop + "' property or method.\n" + err.stack); } } - debugger; var hasSkip = false; var newProps = props.concat(String(prop)) .map(function (v) { return String(v).toLowerCase(); }) diff --git a/lib/injection/injection-container.ts b/lib/injection/injection-container.ts index fb626a32..e4b26add 100755 --- a/lib/injection/injection-container.ts +++ b/lib/injection/injection-container.ts @@ -62,8 +62,6 @@ export const makeInjectionContainer = function (suman: ISuman) { return new Proxy(val, { get: function (target, prop) { - debugger; - if (typeof prop === 'symbol') { return Reflect.get(...arguments); } @@ -72,7 +70,6 @@ export const makeInjectionContainer = function (suman: ISuman) { if (!possibleProps[meth] /*&& !(prop in target)*/) { try { - debugger; return Reflect.get(...arguments); } catch (err) { @@ -80,8 +77,6 @@ export const makeInjectionContainer = function (suman: ISuman) { } } - debugger; - let hasSkip = false; let newProps = props.concat(String(prop)) .map(v => String(v).toLowerCase()) // we map to lowercase first, so we can use indexOf afterwards diff --git a/lib/runner-helpers/handle-multiple-processes.js b/lib/runner-helpers/handle-multiple-processes.js index 5fc05b81..6afe5831 100755 --- a/lib/runner-helpers/handle-multiple-processes.js +++ b/lib/runner-helpers/handle-multiple-processes.js @@ -202,7 +202,9 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, } }); var childId = 1; - var inheritRunStdio = sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes'; + var debugChildren = sumanOpts.debug_child || sumanOpts.inspect_child; + var inheritRunStdio = debugChildren || sumanOpts.inherit_stdio || + sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes'; var outer = function (file, shortFile, stdout, gd) { var run = function () { if (runnerObj.bailed) { @@ -215,15 +217,15 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, var argz = JSON.parse(JSON.stringify(args)); var execArgz = ['--expose-gc']; if (sumanOpts.debug_child) { - execArgz.push('--debug-brk'); execArgz.push('--debug=' + (5303 + runnerObj.processId++)); + execArgz.push('--debug-brk'); } if (sumanOpts.inspect_child) { if (semver.gt(process.version, '7.8.0')) { - execArgz.push('--inspect-brk'); + execArgz.push('--inspect-brk=' + (5303 + runnerObj.processId++)); } else { - execArgz.push('--inspect'); + execArgz.push('--inspect=' + (5303 + runnerObj.processId++)); execArgz.push('--debug-brk'); } } @@ -261,7 +263,6 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, 'ignore', inherit || (isStdoutSilent ? 'ignore' : 'pipe'), inherit || (isStderrSilent ? 'ignore' : 'pipe'), - 'ipc' ], env: Object.assign({}, sumanEnv, { SUMAN_CHILD_TEST_PATH: file, @@ -337,7 +338,7 @@ exports.makeHandleMultipleProcesses = function (runnerObj, tableRows, messages, } n.stdout.setEncoding('utf8'); n.stderr.setEncoding('utf8'); - if ((sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files)) { + if (false && (sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files)) { var onError = function (e) { _suman.logError('\n', su.getCleanErrorString(e), '\n'); }; diff --git a/lib/runner-helpers/handle-multiple-processes.ts b/lib/runner-helpers/handle-multiple-processes.ts index 2558af32..b6b167ae 100755 --- a/lib/runner-helpers/handle-multiple-processes.ts +++ b/lib/runner-helpers/handle-multiple-processes.ts @@ -310,8 +310,10 @@ export const makeHandleMultipleProcesses = }); let childId = 1; - const inheritRunStdio = - sumanOpts.inherit_stdio || sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes'; + + const debugChildren = sumanOpts.debug_child || sumanOpts.inspect_child; + const inheritRunStdio = debugChildren || sumanOpts.inherit_stdio || + sumanOpts.inherit_all_stdio || process.env.SUMAN_INHERIT_STDIO === 'yes'; const outer = function (file: string, shortFile: string, stdout: string, gd: IGanttData) { @@ -331,16 +333,16 @@ export const makeHandleMultipleProcesses = const execArgz = ['--expose-gc']; if (sumanOpts.debug_child) { - execArgz.push('--debug-brk'); execArgz.push('--debug=' + (5303 + runnerObj.processId++)); + execArgz.push('--debug-brk'); } if (sumanOpts.inspect_child) { if (semver.gt(process.version, '7.8.0')) { - execArgz.push('--inspect-brk'); + execArgz.push('--inspect-brk=' + (5303 + runnerObj.processId++)); } else { - execArgz.push('--inspect'); + execArgz.push('--inspect=' + (5303 + runnerObj.processId++)); execArgz.push('--debug-brk'); } } @@ -376,7 +378,6 @@ export const makeHandleMultipleProcesses = let $childId = childId++; let childUuid = uuidV4(); - const inherit = _suman.$forceInheritStdio ? 'inherit' : ''; if (inherit) { @@ -391,7 +392,7 @@ export const makeHandleMultipleProcesses = 'ignore', inherit || (isStdoutSilent ? 'ignore' : 'pipe'), inherit || (isStderrSilent ? 'ignore' : 'pipe'), - 'ipc' //TODO: assume 'ipc' is ignored if not a .js file.. + // 'ipc' => we don't need IPC anymore, but also can we assume 'ipc' is ignored if not a .js file? ], env: Object.assign({}, sumanEnv, { SUMAN_CHILD_TEST_PATH: file, @@ -494,7 +495,7 @@ export const makeHandleMultipleProcesses = n.stdout.setEncoding('utf8'); n.stderr.setEncoding('utf8'); - if ((sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files)) { + if (false && (sumanOpts.log_stdio_to_files || sumanOpts.log_stdout_to_files || sumanOpts.log_stderr_to_files)) { let onError = function (e: Error) { _suman.logError('\n', su.getCleanErrorString(e), '\n'); @@ -561,7 +562,7 @@ export const makeHandleMultipleProcesses = }) .join('\n'); - _suman.sumanStderrStream.write('\n' +d); + _suman.sumanStderrStream.write('\n' + d); if (_suman.weAreDebugging) { //TODO: add check for NODE_ENV=dev_local_debug //TODO: go through code and make sure that no console.log statements should in fact be console.error diff --git a/lib/runner-helpers/handle-tap.js b/lib/runner-helpers/handle-tap.js index 3f8f489f..9144de52 100755 --- a/lib/runner-helpers/handle-tap.js +++ b/lib/runner-helpers/handle-tap.js @@ -18,7 +18,6 @@ exports.getTapParser = function () { resultBroadcaster.emit(String(suman_events_1.events.TAP_COMPLETE), data); }); p.on('assert', function (testpoint) { - debugger; if (first) { first = false; console.log('\n'); diff --git a/lib/runner-helpers/handle-tap.ts b/lib/runner-helpers/handle-tap.ts index fa165b43..c059da5b 100755 --- a/lib/runner-helpers/handle-tap.ts +++ b/lib/runner-helpers/handle-tap.ts @@ -25,7 +25,7 @@ let first = true; export const getTapParser = function () { - if(first){ + if (first) { _suman.log('we are handling TAP.'); } @@ -37,8 +37,6 @@ export const getTapParser = function () { p.on('assert', function (testpoint: Object) { - debugger; - if (first) { first = false; console.log('\n'); @@ -46,7 +44,6 @@ export const getTapParser = function () { console.log('\n'); } - resultBroadcaster.emit(String(events.TEST_CASE_END), testpoint); if (testpoint.skip) { diff --git a/lib/runner-helpers/run-child.ts b/lib/runner-helpers/run-child.ts index 2897ef58..44066603 100755 --- a/lib/runner-helpers/run-child.ts +++ b/lib/runner-helpers/run-child.ts @@ -47,7 +47,7 @@ process.send = process.send || function (data) { process.on('uncaughtException', function (err: Error) { - debugger; + debugger; // leave it here :) if (_suman.afterAlwaysEngaged) { // after.always hooks are running, let them complete as much as possible diff --git a/lib/test-suite-helpers/get-all-eaches.js b/lib/test-suite-helpers/get-all-eaches.js index cd7bef56..ce95a060 100755 --- a/lib/test-suite-helpers/get-all-eaches.js +++ b/lib/test-suite-helpers/get-all-eaches.js @@ -11,12 +11,12 @@ exports.getAllBeforesEaches = function (zuite) { zuite.alreadyHandledAfterAllParentHooks = true; beforeEaches.unshift(zuite.getAfterAllParentHooks()); } - function getParentBefores(parent) { + var getParentBefores = function (parent) { beforeEaches.unshift(parent.getBeforeEaches()); if (parent.parent) { getParentBefores(parent.parent); } - } + }; if (zuite.parent) { getParentBefores(zuite.parent); } @@ -25,12 +25,12 @@ exports.getAllBeforesEaches = function (zuite) { exports.getAllAfterEaches = function (zuite) { var afterEaches = []; afterEaches.push(zuite.getAfterEaches()); - function getParentAfters(parent) { + var getParentAfters = function (parent) { afterEaches.push(parent.getAfterEaches()); if (parent.parent) { getParentAfters(parent.parent); } - } + }; if (zuite.parent) { getParentAfters(zuite.parent); } diff --git a/lib/test-suite-helpers/get-all-eaches.ts b/lib/test-suite-helpers/get-all-eaches.ts index 960b65e0..da932cd2 100755 --- a/lib/test-suite-helpers/get-all-eaches.ts +++ b/lib/test-suite-helpers/get-all-eaches.ts @@ -34,12 +34,12 @@ export const getAllBeforesEaches = function (zuite: ITestSuite) { beforeEaches.unshift(zuite.getAfterAllParentHooks()); } - function getParentBefores(parent: ITestSuite) { + const getParentBefores = function (parent: ITestSuite) { beforeEaches.unshift(parent.getBeforeEaches()); if (parent.parent) { getParentBefores(parent.parent); } - } + }; if (zuite.parent) { getParentBefores(zuite.parent); @@ -53,12 +53,12 @@ export const getAllAfterEaches = function (zuite: ITestSuite) { const afterEaches: Array> = []; afterEaches.push(zuite.getAfterEaches()); - function getParentAfters(parent: ITestSuite) { + const getParentAfters = function (parent: ITestSuite) { afterEaches.push(parent.getAfterEaches()); if (parent.parent) { getParentAfters(parent.parent); } - } + }; if (zuite.parent) { getParentAfters(zuite.parent); diff --git a/lib/test-suite-helpers/notify-parent-that-child-is-complete.js b/lib/test-suite-helpers/notify-parent-that-child-is-complete.js index ec83573a..b661362b 100755 --- a/lib/test-suite-helpers/notify-parent-that-child-is-complete.js +++ b/lib/test-suite-helpers/notify-parent-that-child-is-complete.js @@ -38,7 +38,6 @@ exports.makeNotifyParent = function (suman, gracefulExit, handleBeforesAndAfters async.mapSeries(parent.getAfters(), function (aBeforeOrAfter, cb) { handleBeforesAndAfters(child, aBeforeOrAfter, cb); }, function complete(err, results) { - debugger; implementationError(err); gracefulExit(results, function () { notifyParentThatChildIsComplete(parent, cb); diff --git a/lib/test-suite-helpers/notify-parent-that-child-is-complete.ts b/lib/test-suite-helpers/notify-parent-that-child-is-complete.ts index 380bdfc0..aea3bbc9 100755 --- a/lib/test-suite-helpers/notify-parent-that-child-is-complete.ts +++ b/lib/test-suite-helpers/notify-parent-that-child-is-complete.ts @@ -70,7 +70,6 @@ export const makeNotifyParent = function (suman: ISuman, gracefulExit: Function, function complete(err: IPseudoError, results: Array) { - debugger; implementationError(err); gracefulExit(results, function () { notifyParentThatChildIsComplete(parent, cb); diff --git a/suman-todos.txt b/suman-todos.txt index cb35860f..8f520f77 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -332,29 +332,29 @@ node test/src/exp.js | grep -v [[suman]] at TestSuiteMaker.TestSuite.__invokeChildren (/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/lib/test-suite-helpers/make-test-suite.js:205:19) -//// +/// _suman.log and _suman.logError need to split everything by newline so that [suman] appears on each line -//// +/// suman child id should be a uuid not an integer -//// +/// suman needs to take a node path as argument SUMAN_NODEJS_EXEC_PATH=x -//// +/// use -- --seed instead of --user-args? -//// +/// if @run.sh exists for a file x, but the command is just "suman x", then the runner won't be used and @run.sh won't be used. If @run.sh is found, we must use the runner. -//// +/// put a "twitter like" button on the webpage Please Share on Twitter if you like #mockgoose @@ -374,14 +374,6 @@ node test/src/exp.js | grep -v [[suman]] inject only works when we do not need to use a before/beforeEach to load data beforehand -//// - -it(x, t => { - - t.$inject => could contain the before values that are created by before/beforeEach - -}); - //// create $iocShared and $ioc diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 3086ff5a..164f70c3 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1507009670922,"endDate":1507009671569,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"FAILED"},{"startDate":1507009670917,"endDate":1507009671569,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1507062278714,"endDate":1507062284507,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507062278709,"endDate":1507062279509,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); let tasks = []; diff --git a/test/src/dev/node/1.test.js b/test/src/dev/node/1.test.js index 71794ca0..7218c1f1 100644 --- a/test/src/dev/node/1.test.js +++ b/test/src/dev/node/1.test.js @@ -12,7 +12,7 @@ const opts = {series: true, fixed: true}; Test.create(opts, function (assert, describe, before, beforeEach, after, afterEach, it) { it('sync test', t => { - assert(false); + assert(true); }); before(h => { From 4329861672cfbe8dbab3ac766b6d10dd3cee0f67 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Fri, 6 Oct 2017 02:20:33 -0700 Subject: [PATCH 26/32] pdev:set --- lib/handle-exit.js | 5 - lib/handle-exit.ts | 8 +- lib/helpers/handle-suman-counts.js | 6 +- lib/helpers/handle-suman-counts.ts | 6 +- scripts/suman-clis.sh | 2 +- suman-todos.txt | 6 ++ test/.suman/gantt-4.html | 2 +- test/src/dev/node/3.test.js | 107 ++++++++++++++++++++ test/src/dev/node/4.test.js | 150 ++++++++++++++++++++++++++++ test/src/dev/node/5.test.js | 152 +++++++++++++++++++++++++++++ 10 files changed, 423 insertions(+), 21 deletions(-) create mode 100644 test/src/dev/node/3.test.js create mode 100644 test/src/dev/node/4.test.js create mode 100644 test/src/dev/node/5.test.js diff --git a/lib/handle-exit.js b/lib/handle-exit.js index 99ad1c11..51464c52 100755 --- a/lib/handle-exit.js +++ b/lib/handle-exit.js @@ -2,7 +2,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); -var fs = require("fs"); var chalk = require("chalk"); var suman_utils_1 = require("suman-utils"); var _suman = global.__suman = (global.__suman || {}); @@ -39,10 +38,6 @@ process.prependOnceListener('exit', function (code) { debugger; } }, 100); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); reached_1 = true; _suman.logError('END of log log log.'); } diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 522d6a8e..473bc0c8 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -62,10 +62,10 @@ process.prependOnceListener('exit', function (code: number) { debugger; } }, 100); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); + // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); reached = true; _suman.logError('END of log log log.'); } diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 9b36351a..519c33cc 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -61,12 +61,8 @@ suiteResultEmitter.once('suman-test-file-complete', function () { }; _suman.log(' => about to waitForStdioToDrain'); _suman.log(' => about to call process.exit1'); - _suman.log(' => about to call process.exit2'); - _suman.log(' => about to call process.exit3'); waitForStdioToDrain(function () { - _suman.log(' => about to call process.exit4'); - _suman.log(' => about to call process.exit5'); - _suman.log(' => about to call process.exit6'); + _suman.log(' => about to call process.exit2'); process.exit(highestExitCode); }); }); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index 4f778960..cb0c4527 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -93,13 +93,9 @@ suiteResultEmitter.once('suman-test-file-complete', function () { _suman.log(' => about to waitForStdioToDrain'); _suman.log(' => about to call process.exit1'); - _suman.log(' => about to call process.exit2'); - _suman.log(' => about to call process.exit3'); waitForStdioToDrain(function () { - _suman.log(' => about to call process.exit4'); - _suman.log(' => about to call process.exit5'); - _suman.log(' => about to call process.exit6'); + _suman.log(' => about to call process.exit2'); process.exit(highestExitCode) }); diff --git a/scripts/suman-clis.sh b/scripts/suman-clis.sh index e1a0a892..1b269cff 100755 --- a/scripts/suman-clis.sh +++ b/scripts/suman-clis.sh @@ -65,7 +65,7 @@ function suman-inspect { handle_global_suman node_exec_args "$@" else echo "running node against local suman" - NODE_PATH=${NEW_NODE_PATH} PATH=${NEW_PATH} node --inspect-brk "$LOCAL_SUMAN" "$@"; + NODE_PATH="${NEW_NODE_PATH}" PATH="${NEW_PATH}" node --inspect-brk "$LOCAL_SUMAN" "$@"; fi } diff --git a/suman-todos.txt b/suman-todos.txt index 8f520f77..e7f0c282 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -18,6 +18,12 @@ three SO profiles: the runner hangs every few runs, there must be a race condition +/// + +@ORESoftware It depends on the version of node the running process uses. +If it's node 8, then you should be able to `kill -USR2 ${pidOfTheNodeProcess}` to enable the --inspect behavior after the fact. + + /// suman-watch should be optionalDep? diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 164f70c3..6d7da267 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1507062278714,"endDate":1507062284507,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507062278709,"endDate":1507062279509,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1507281622239,"endDate":1507281623283,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507281622236,"endDate":1507281623347,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1507281622231,"endDate":1507281623161,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/3.test.js","status":"SUCCEEDED"},{"startDate":1507281622223,"endDate":1507281623192,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/4.test.js","status":"SUCCEEDED"},{"startDate":1507281622218,"endDate":1507281623366,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/5.test.js","status":"SUCCEEDED"}]'); let tasks = []; diff --git a/test/src/dev/node/3.test.js b/test/src/dev/node/3.test.js new file mode 100644 index 00000000..3ecfb576 --- /dev/null +++ b/test/src/dev/node/3.test.js @@ -0,0 +1,107 @@ +#!/usr/bin/env node +'use strict'; + +const suman = require('suman'); +const Test = suman.init(module); + +/////////////////////////////////////////////////////////////////////// + +Test.create(function (assert, describe, before, beforeEach, after, afterEach, it) { + + describe('here we go', function () { + + before(h => { + assert(true); + }); + + it('sync test', t => { + assert(true); + }); + + after(h => { + assert(true); + }); + + describe('here we go', function () { + + before(h => { + assert(true); + }); + + it('sync test', t => { + assert(true); + }); + + after(h => { + assert(true); + }); + + describe('here we go', function () { + + before(h => { + assert(true); + }); + + it('sync test', t => { + assert(true); + }); + + after(h => { + assert(true); + }); + + describe('here we go', function () { + + before(h => { + assert(true); + }); + + it('sync test', t => { + assert(true); + }); + + after(h => { + assert(true); + }); + + }); + + }); + + describe('here we go', function () { + + before(h => { + assert(true); + }); + + it('sync test', t => { + assert(true); + }); + + after(h => { + assert(true); + }); + + }); + + }); + + describe('here we go', function () { + + before(h => { + assert(true); + }); + + it('sync test', t => { + assert(true); + }); + + after(h => { + assert(true); + }); + + }); + + }); + +}); diff --git a/test/src/dev/node/4.test.js b/test/src/dev/node/4.test.js new file mode 100644 index 00000000..c24f4b9e --- /dev/null +++ b/test/src/dev/node/4.test.js @@ -0,0 +1,150 @@ +#!/usr/bin/env node +'use strict'; + +const suman = require('suman'); +const Test = suman.init(module); + +/////////////////////////////////////////////////////////////////////// + +let count = 0; + +Test.create(function (assert, describe, before, beforeEach, after, afterEach, it) { + + before(h => { + h.assert.equal(++count, 1); + }); + + it.cb('sync test', t => { + t.assert.equal(++count, 2); + t.done() + }); + + after.cb(h => { + h.assert.equal(++count, 26); + h.ctn(); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 3); + }); + + it.cb('sync test', t => { + t.assert.equal(++count, 4); + t.done() + }); + + after.cb(h => { + h.assert.equal(++count, 25); + h.ctn(); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 5); + }); + + it('sync test', t => { + t.assert.equal(++count, 6); + }); + + after(h => { + h.assert.equal(++count, 19); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 7); + }); + + it('sync test', t => { + t.assert.equal(++count, 8); + }); + + after.cb(h => { + h.assert.equal(++count, 13); + h.ctn(); + }); + + after(h => { + h.assert.equal(++count, 14); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 9); + }); + + it('sync test', t => { + t.assert.equal(++count, 10); + }); + + after.cb(h => { + h.assert.equal(++count, 11); + h.ctn(); + }); + + after(h => { + h.assert.equal(++count, 12); + }); + + }); + + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 15); + }); + + after.cb(h => { + h.assert.equal(++count, 17); + h.ctn(); + }); + + it('sync test', t => { + t.assert.equal(++count, 16); + }); + + after(h => { + h.assert.equal(++count, 18); + }); + + }); + + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 20); + }); + + after.cb(h => { + h.assert.equal(++count, 23); + h.ctn(); + }); + + it('sync test', t => { + t.assert.equal(++count, 21); + }); + + it.cb('sync test', t => { + t.assert.equal(++count, 22); + t.done(); + }); + + after(h => { + h.assert.equal(++count, 24); + }); + + }); + + }); + +}); diff --git a/test/src/dev/node/5.test.js b/test/src/dev/node/5.test.js new file mode 100644 index 00000000..8ff14ae6 --- /dev/null +++ b/test/src/dev/node/5.test.js @@ -0,0 +1,152 @@ +#!/usr/bin/env node +'use strict'; + +const suman = require('suman'); +const Test = suman.init(module, { + forceParallel: true // parallel, not parallel-max +}); + +/////////////////////////////////////////////////////////////////////// + +let count = 0; + +Test.create(function (assert, describe, before, beforeEach, after, afterEach, it) { + + before(h => { + h.assert.equal(++count, 1); + }); + + it.cb('sync test', t => { + t.assert.equal(++count, 2); + t.done() + }); + + after.cb(h => { + h.assert.equal(++count, 26); + h.ctn(); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 3); + }); + + it.cb('sync test', t => { + t.assert.equal(++count, 4); + t.done() + }); + + after.cb(h => { + h.assert.equal(++count, 25); + h.ctn(); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 5); + }); + + it('sync test', t => { + t.assert.equal(++count, 6); + }); + + after(h => { + h.assert.equal(++count, 19); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 7); + }); + + it('sync test', t => { + t.assert.equal(++count, 8); + }); + + after.cb(h => { + h.assert.equal(++count, 13); + h.ctn(); + }); + + after(h => { + h.assert.equal(++count, 14); + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 9); + }); + + it('sync test', t => { + t.assert.equal(++count, 10); + }); + + after.cb(h => { + h.assert.equal(++count, 11); + h.ctn(); + }); + + after(h => { + h.assert.equal(++count, 12); + }); + + }); + + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 15); + }); + + after.cb(h => { + h.assert.equal(++count, 17); + h.ctn(); + }); + + it('sync test', t => { + t.assert.equal(++count, 16); + }); + + after(h => { + h.assert.equal(++count, 18); + }); + + }); + + }); + + describe('here we go', function () { + + before(h => { + h.assert.equal(++count, 20); + }); + + after.cb(h => { + h.assert.equal(++count, 23); + h.ctn(); + }); + + it('sync test', t => { + t.assert.equal(++count, 21); + }); + + it.cb('sync test', t => { + t.assert.equal(++count, 22); + t.done(); + }); + + after(h => { + h.assert.equal(++count, 24); + }); + + }); + + }); + +}); From ff73efed2feb19ee8bde31f92d37efd5f935c947 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Fri, 6 Oct 2017 16:37:05 -0700 Subject: [PATCH 27/32] pdev:set --- lib/handle-exit.js | 7 ------- lib/handle-exit.ts | 7 ------- lib/helpers/handle-suman-counts.js | 2 +- lib/helpers/handle-suman-counts.ts | 2 +- lib/index-helpers/exit-handling.js | 6 +++--- lib/index-helpers/exit-handling.ts | 19 ++++++++++++------- lib/index-helpers/handle-integrants.ts | 10 +++++----- lib/test-suite-helpers/make-handle-each.js | 2 ++ lib/test-suite-helpers/make-handle-each.ts | 5 ++--- test/.suman/gantt-4.html | 2 +- 10 files changed, 27 insertions(+), 35 deletions(-) diff --git a/lib/handle-exit.js b/lib/handle-exit.js index 51464c52..d883d2cb 100755 --- a/lib/handle-exit.js +++ b/lib/handle-exit.js @@ -32,13 +32,6 @@ process.prependOnceListener('exit', function (code) { } if (testDebugLogPath) { _suman.logError('BEGIN of log log log.'); - var reached_1 = false; - setTimeout(function () { - if (!reached_1) { - debugger; - } - }, 100); - reached_1 = true; _suman.logError('END of log log log.'); } _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', { suppress: true }); diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 473bc0c8..07d5c573 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -56,17 +56,10 @@ process.prependOnceListener('exit', function (code: number) { if(testDebugLogPath){ _suman.logError('BEGIN of log log log.'); - let reached = false; - setTimeout(function(){ - if(!reached){ - debugger; - } - }, 100); // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - reached = true; _suman.logError('END of log log log.'); } diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 519c33cc..555320b3 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -40,7 +40,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { return process.nextTick(cb); } var timedout = false; - var timeout = _suman.usingRunner ? 200 : 100; + var timeout = _suman.usingRunner ? 20 : 10; var onTimeout = function () { timedout = true; cb(null); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index cb0c4527..aba7d977 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -68,7 +68,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } let timedout = false; - let timeout = _suman.usingRunner ? 200 : 100; + let timeout = _suman.usingRunner ? 20 : 10; let onTimeout = function () { timedout = true; diff --git a/lib/index-helpers/exit-handling.js b/lib/index-helpers/exit-handling.js index e0553fe6..628d4518 100755 --- a/lib/index-helpers/exit-handling.js +++ b/lib/index-helpers/exit-handling.js @@ -1,4 +1,4 @@ -"use strict"; +'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); @@ -29,7 +29,7 @@ var shutdownSuman = function (msg) { handle_suman_once_post_1.oncePostFn(cb); } else { - _suman.logError('Suman internal warning, oncePostFn not yet defined.'); + _suman.logError('Suman internal warning, "oncePostFn" not yet defined.'); process.nextTick(cb); } }, @@ -87,7 +87,7 @@ process.on('SIGTERM', function () { process.exit(1); } else if (sigtermCount === 1) { - shutdownSuman('SIGINT received'); + shutdownSuman('SIGTERM received'); } }); process.on('warning', function (w) { diff --git a/lib/index-helpers/exit-handling.ts b/lib/index-helpers/exit-handling.ts index 87915616..07caf263 100755 --- a/lib/index-helpers/exit-handling.ts +++ b/lib/index-helpers/exit-handling.ts @@ -1,4 +1,6 @@ -//typescript imports +'use strict'; + +//dts import {IGlobalSumanObj, IPromiseWithDomain, ISumanDomain, SumanErrorRace} from "suman-types/dts/global"; //polyfills @@ -18,18 +20,21 @@ const {fatalRequestReply} = require('../helpers/fatal-request-reply'); import {constants} from '../../config/suman-constants'; import {oncePostFn} from '../helpers/handle-suman-once-post'; import {runAfterAlways} from '../helpers/run-after-always'; - const sumanRuntimeErrors = _suman.sumanRuntimeErrors = _suman.sumanRuntimeErrors || []; const weAreDebugging = require('../helpers/we-are-debugging'); /////////////////////////////////////////////////////////////////////////////////////// +type AsyncFuncType = AsyncResultArrayCallback, Error>; + +////////////////////////////////////////////////////////////////////////////////////// + const shutdownSuman = function (msg: string) { async.parallel([ - function (cb: AsyncResultArrayCallback, Error>) { + function (cb: AsyncFuncType) { async.series([ - function (cb: AsyncResultArrayCallback, Error>) { + function (cb: AsyncFuncType) { if (runAfterAlways && _suman.whichSuman) { runAfterAlways(_suman.whichSuman, cb); } @@ -38,12 +43,12 @@ const shutdownSuman = function (msg: string) { } }, - function (cb: AsyncResultArrayCallback, Error>) { + function (cb: AsyncFuncType) { if (oncePostFn) { oncePostFn(cb); } else { - _suman.logError('Suman internal warning, oncePostFn not yet defined.'); + _suman.logError('Suman internal warning, "oncePostFn" not yet defined.'); process.nextTick(cb); } }, @@ -119,7 +124,7 @@ process.on('SIGTERM', function () { process.exit(1); } else if (sigtermCount === 1) { - shutdownSuman('SIGINT received'); + shutdownSuman('SIGTERM received'); } }); diff --git a/lib/index-helpers/handle-integrants.ts b/lib/index-helpers/handle-integrants.ts index 1337450c..1a87ab55 100755 --- a/lib/index-helpers/handle-integrants.ts +++ b/lib/index-helpers/handle-integrants.ts @@ -1,24 +1,24 @@ 'use strict'; -//typescript imports +// dts import {IGlobalSumanObj} from "suman-types/dts/global"; import {IIntegrantsMessage, ISumanModuleExtended} from "suman-types/dts/index-init"; -//polyfills +// polyfills const process = require('suman-browser-polyfills/modules/process'); const global = require('suman-browser-polyfills/modules/global'); -//core +// core import domain = require('domain'); import util = require('util'); import EE = require('events'); -//npm +// npm import * as chalk from 'chalk'; import * as fnArgs from 'function-arguments'; import su from 'suman-utils'; -//project +// project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); if (!('integrantHashKeyVals' in _suman)) { diff --git a/lib/test-suite-helpers/make-handle-each.js b/lib/test-suite-helpers/make-handle-each.js index 88f9c1d5..283d1c3f 100755 --- a/lib/test-suite-helpers/make-handle-each.js +++ b/lib/test-suite-helpers/make-handle-each.js @@ -104,6 +104,8 @@ exports.makeHandleBeforeOrAfterEach = function (suman, gracefulExit) { t.desc = test.desc; t.value = test.value; t.testId = test.testId; + t.result = test.error ? 'failed' : 'passed'; + t.error = test.error; t.state = 'pending'; t.shared = self.shared; t.$inject = suman.$inject; diff --git a/lib/test-suite-helpers/make-handle-each.ts b/lib/test-suite-helpers/make-handle-each.ts index ad1cd5d6..6b118a61 100755 --- a/lib/test-suite-helpers/make-handle-each.ts +++ b/lib/test-suite-helpers/make-handle-each.ts @@ -17,18 +17,15 @@ import util = require('util'); //npm import chalk = require('chalk'); - const fnArgs = require('function-arguments'); //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); import su = require('suman-utils'); - const {constants} = require('../../config/suman-constants'); import {cloneError} from '../misc/clone-error'; import {makeHookObj} from './t-proto-hook'; import {makeCallback} from './handle-callback-helper'; - const helpers = require('./handle-promise-generator'); import {freezeExistingProps} from 'freeze-existing-props' @@ -153,6 +150,8 @@ export const makeHandleBeforeOrAfterEach = function (suman: ISuman, gracefulExit t.desc = test.desc; t.value = test.value; t.testId = test.testId; + t.result = test.error ? 'failed' : 'passed'; + t.error = test.error; t.state = 'pending'; t.shared = self.shared; t.$inject = suman.$inject; diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 6d7da267..55051133 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1507281622239,"endDate":1507281623283,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507281622236,"endDate":1507281623347,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1507281622231,"endDate":1507281623161,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/3.test.js","status":"SUCCEEDED"},{"startDate":1507281622223,"endDate":1507281623192,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/4.test.js","status":"SUCCEEDED"},{"startDate":1507281622218,"endDate":1507281623366,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/5.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1507332623847,"endDate":1507332624573,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507332623842,"endDate":1507332624573,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/3.test.js","status":"SUCCEEDED"},{"startDate":1507332623835,"endDate":1507332624557,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/4.test.js","status":"SUCCEEDED"},{"startDate":1507332623827,"endDate":1507332624548,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1507332623822,"endDate":1507332624548,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/5.test.js","status":"SUCCEEDED"}]'); let tasks = []; From 158fd9e6f66af91a8667cd50ee8e3040ea695c76 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Fri, 6 Oct 2017 17:12:42 -0700 Subject: [PATCH 28/32] pdev:set --- config/suman-constants.d.ts | 2 + config/suman-constants.js | 2 + config/suman-constants.ts | 6 ++ lib/index.js | 3 +- lib/index.ts | 3 +- .../make-handle-befores-afters.ts | 1 - lib/test-suite-helpers/make-handle-each.js | 27 +++-- lib/test-suite-helpers/make-handle-each.ts | 28 +++-- suman-todos.txt | 4 + test/.suman/gantt-4.html | 2 +- test/src/dev/node/5.test.js | 101 +++++++++++------- 11 files changed, 107 insertions(+), 72 deletions(-) diff --git a/config/suman-constants.d.ts b/config/suman-constants.d.ts index 0ef5df0f..9f40749f 100755 --- a/config/suman-constants.d.ts +++ b/config/suman-constants.d.ts @@ -13,6 +13,8 @@ export declare const constants: Readonly<{ }; SUMAN_SERVER_MESSAGE: string; GIT_IGNORE: string[]; + SUMAN_HOOK_FATAL_WARNING_MESSAGE: string; + SUMAN_HOOK_FATAL_MESSAGE: string; SUMAN_HARD_LIST: string[]; CORE_MODULE_LIST: any; CLI_EXIT_CODES: { diff --git a/config/suman-constants.js b/config/suman-constants.js index 67aaddd3..2f0b6b26 100755 --- a/config/suman-constants.js +++ b/config/suman-constants.js @@ -18,6 +18,8 @@ exports.constants = Object.freeze({ GIT_IGNORE: [ '**suman/logs/**' ], + SUMAN_HOOK_FATAL_WARNING_MESSAGE: 'Suman non-fatal error => Error in hook and "fatal" option for the hook is set to false =>\n', + SUMAN_HOOK_FATAL_MESSAGE: ' => fatal error in hook => (to continue even in the event of an error in a hook, use option {fatal:false}) =>', SUMAN_HARD_LIST: Object.keys({ describe: true, before: true, diff --git a/config/suman-constants.ts b/config/suman-constants.ts index 0ab925eb..b1486f90 100755 --- a/config/suman-constants.ts +++ b/config/suman-constants.ts @@ -27,6 +27,12 @@ export const constants = Object.freeze({ '**suman/logs/**' ], + SUMAN_HOOK_FATAL_WARNING_MESSAGE: + 'Suman non-fatal error => Error in hook and "fatal" option for the hook is set to false =>\n', + + SUMAN_HOOK_FATAL_MESSAGE: + ' => fatal error in hook => (to continue even in the event of an error in a hook, use option {fatal:false}) =>', + SUMAN_HARD_LIST: Object.keys({ //bdd diff --git a/lib/index.js b/lib/index.js index 450e69b2..da5031ac 100755 --- a/lib/index.js +++ b/lib/index.js @@ -89,7 +89,8 @@ var testSuiteRegistrationQueue = async.queue(function (task, cb) { process.nextTick(task); }, c); testSuiteRegistrationQueue.drain = function () { - _suman.log("Pushing " + testRuns.length + " test suites onto queue with concurrency " + c + ".\n"); + var suites = testRuns.length === 1 ? 'suite' : 'suites'; + _suman.log("Pushing " + testRuns.length + " test " + suites + " onto queue with concurrency " + c + ".\n"); while (testRuns.length > 0) { testSuiteQueue.push(testRuns.shift()); } diff --git a/lib/index.ts b/lib/index.ts index 2d4c5ab7..26c304b8 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -150,7 +150,8 @@ const testSuiteRegistrationQueue = async.queue(function (task: Function, cb: Fun }, c); testSuiteRegistrationQueue.drain = function () { - _suman.log(`Pushing ${testRuns.length} test suites onto queue with concurrency ${c}.\n`); + const suites = testRuns.length === 1 ? 'suite' : 'suites'; + _suman.log(`Pushing ${testRuns.length} test ${suites} onto queue with concurrency ${c}.\n`); while (testRuns.length > 0) { //explicit for your pleasure testSuiteQueue.push(testRuns.shift()); } diff --git a/lib/test-suite-helpers/make-handle-befores-afters.ts b/lib/test-suite-helpers/make-handle-befores-afters.ts index 36edb5f3..94ab60bd 100755 --- a/lib/test-suite-helpers/make-handle-befores-afters.ts +++ b/lib/test-suite-helpers/make-handle-befores-afters.ts @@ -19,7 +19,6 @@ const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); import su from 'suman-utils'; import chalk = require('chalk'); import {makeCallback} from './handle-callback-helper'; - const helpers = require('./handle-promise-generator'); const {constants} = require('../../config/suman-constants'); import {cloneError} from '../misc/clone-error'; diff --git a/lib/test-suite-helpers/make-handle-each.js b/lib/test-suite-helpers/make-handle-each.js index 283d1c3f..3ab04a78 100755 --- a/lib/test-suite-helpers/make-handle-each.js +++ b/lib/test-suite-helpers/make-handle-each.js @@ -51,22 +51,19 @@ exports.makeHandleBeforeOrAfterEach = function (suman, gracefulExit) { var stk = err.stack || err; var stck = typeof stk === 'string' ? stk : util.inspect(stk); var formatedStk = String(stck).split('\n').map(function (item) { return '\t' + item; }).join('\n'); - console.error(formatedStk); if (!dError) { dError = true; if (aBeforeOrAfterEach.fatal === false) { - var msg = ' => Suman non-fatal error => Error in hook and "fatal" option for the hook ' + - 'is set to false => \n' + formatedStk; - console.log('\n\n', msg, '\n\n'); - _suman.writeTestError(msg); + _suman.writeTestError(constants.SUMAN_HOOK_FATAL_WARNING_MESSAGE + formatedStk); fini(null); } else { - err = new Error(' => fatal error in hook => (to continue even in the event of an error ' + - 'in a hook, use option {fatal:false}) =>' + '\n\n' + formatedStk); - err.sumanFatal = true; - err.sumanExitCode = constants.EXIT_CODES.FATAL_HOOK_ERROR; - gracefulExit(err); + gracefulExit({ + sumanFatal: true, + sumanExitCode: constants.EXIT_CODES.FATAL_HOOK_ERROR, + stack: ' => fatal error in hook => (to continue even in the event of an error ' + + 'in a hook, use option {fatal:false}) =>' + '\n' + formatedStk + }); } } else { @@ -100,12 +97,14 @@ exports.makeHandleBeforeOrAfterEach = function (suman, gracefulExit) { var t = t_proto_hook_1.makeHookObj(aBeforeOrAfterEach, assertCount, handleError); fini.th = t; t.timeout = timeout; + t.test = {}; + t.test.desc = test.desc; + t.test.testId = test.testId; + t.test.result = test.error ? 'failed' : 'passed'; + t.test.error = test.error; t.data = test.data; - t.desc = test.desc; + t.desc = aBeforeOrAfterEach.desc; t.value = test.value; - t.testId = test.testId; - t.result = test.error ? 'failed' : 'passed'; - t.error = test.error; t.state = 'pending'; t.shared = self.shared; t.$inject = suman.$inject; diff --git a/lib/test-suite-helpers/make-handle-each.ts b/lib/test-suite-helpers/make-handle-each.ts index 6b118a61..c23d1a34 100755 --- a/lib/test-suite-helpers/make-handle-each.ts +++ b/lib/test-suite-helpers/make-handle-each.ts @@ -81,24 +81,20 @@ export const makeHandleBeforeOrAfterEach = function (suman: ISuman, gracefulExit const stck = typeof stk === 'string' ? stk : util.inspect(stk); const formatedStk = String(stck).split('\n').map(item => '\t' + item).join('\n'); - console.error(formatedStk); - if (!dError) { dError = true; if (aBeforeOrAfterEach.fatal === false) { - const msg = ' => Suman non-fatal error => Error in hook and "fatal" option for the hook ' + - 'is set to false => \n' + formatedStk; - console.log('\n\n', msg, '\n\n'); - _suman.writeTestError(msg); + _suman.writeTestError(constants.SUMAN_HOOK_FATAL_WARNING_MESSAGE + formatedStk); fini(null); } else { //note we want to exit right away, that's why this is commented out :) - err = new Error(' => fatal error in hook => (to continue even in the event of an error ' + - 'in a hook, use option {fatal:false}) =>' + '\n\n' + formatedStk); - err.sumanFatal = true; - err.sumanExitCode = constants.EXIT_CODES.FATAL_HOOK_ERROR; - gracefulExit(err); //always fatal error in beforeEach/afterEach + gracefulExit({ + sumanFatal: true, + sumanExitCode: constants.EXIT_CODES.FATAL_HOOK_ERROR, + stack: ' => fatal error in hook => (to continue even in the event of an error ' + + 'in a hook, use option {fatal:false}) =>' + '\n' + formatedStk + }); } } else { @@ -146,12 +142,14 @@ export const makeHandleBeforeOrAfterEach = function (suman: ISuman, gracefulExit const t = makeHookObj(aBeforeOrAfterEach, assertCount, handleError); fini.th = t; t.timeout = timeout; + t.test = {}; + t.test.desc = test.desc; + t.test.testId = test.testId; + t.test.result = test.error ? 'failed' : 'passed'; + t.test.error = test.error; t.data = test.data; - t.desc = test.desc; + t.desc = aBeforeOrAfterEach.desc; t.value = test.value; - t.testId = test.testId; - t.result = test.error ? 'failed' : 'passed'; - t.error = test.error; t.state = 'pending'; t.shared = self.shared; t.$inject = suman.$inject; diff --git a/suman-todos.txt b/suman-todos.txt index e7f0c282..36617d14 100755 --- a/suman-todos.txt +++ b/suman-todos.txt @@ -44,6 +44,10 @@ cd $(dirname "$0") [ ! -d "node_modules/babel-preset-stage-3" ] && npm install babel-preset-stage-3 +//// + + it.skipped() should be an alias of it.skip() + //// => give user choice as to use bash or zsh or whatever for suman watch diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 55051133..4436ef3c 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1507332623847,"endDate":1507332624573,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507332623842,"endDate":1507332624573,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/3.test.js","status":"SUCCEEDED"},{"startDate":1507332623835,"endDate":1507332624557,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/4.test.js","status":"SUCCEEDED"},{"startDate":1507332623827,"endDate":1507332624548,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1507332623822,"endDate":1507332624548,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/5.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1507333032752,"endDate":1507333033488,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1507333032747,"endDate":1507333033472,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507333032742,"endDate":1507333033469,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/3.test.js","status":"SUCCEEDED"},{"startDate":1507333032731,"endDate":1507333033468,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/4.test.js","status":"SUCCEEDED"},{"startDate":1507333032727,"endDate":1507333033468,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/5.test.js","status":"SUCCEEDED"}]'); let tasks = []; diff --git a/test/src/dev/node/5.test.js b/test/src/dev/node/5.test.js index 8ff14ae6..ea0ac4b4 100644 --- a/test/src/dev/node/5.test.js +++ b/test/src/dev/node/5.test.js @@ -10,88 +10,112 @@ const Test = suman.init(module, { let count = 0; -Test.create(function (assert, describe, before, beforeEach, after, afterEach, it) { +Test.create(function (assert, describe, before, beforeEach, after, afterEach, it, util) { before(h => { - h.assert.equal(++count, 1); + + }); + + it.cb('passing', t => { + t.done(); }); - it.cb('sync test', t => { - t.assert.equal(++count, 2); - t.done() + it.cb('failing', t => { + t.done('this test failed'); }); - after.cb(h => { - h.assert.equal(++count, 26); + afterEach.cb(h => { + + if (h.test.desc === 'passing') { + h.assert.equal(h.test.result, 'passed'); + } + else { + h.assert.equal(h.test.result, 'failed'); + } + h.ctn(); }); describe('here we go', function () { before(h => { - h.assert.equal(++count, 3); + + }); + + it.cb('failing', t => { + t.done('buggers') }); - it.cb('sync test', t => { - t.assert.equal(++count, 4); - t.done() + afterEach.cb(h => { + + h.ctn(); }); - after.cb(h => { - h.assert.equal(++count, 25); + afterEach.cb(h => { + if (h.test.desc === 'passing') { + h.assert.equal(h.test.result, 'passed'); + } + else { + h.assert.equal(h.test.result, 'failed'); + } h.ctn(); }); describe('here we go', function () { before(h => { - h.assert.equal(++count, 5); + }); - it('sync test', t => { - t.assert.equal(++count, 6); + it('passing', t => { + }); after(h => { - h.assert.equal(++count, 19); + }); describe('here we go', function () { before(h => { - h.assert.equal(++count, 7); + }); - it('sync test', t => { - t.assert.equal(++count, 8); + it('failing', t => { + return Promise.reject('zoomba'); }); after.cb(h => { - h.assert.equal(++count, 13); h.ctn(); }); after(h => { - h.assert.equal(++count, 14); + }); describe('here we go', function () { before(h => { - h.assert.equal(++count, 9); + }); - it('sync test', t => { - t.assert.equal(++count, 10); + it('passing', t => { + + }); + + it('xxx', t => { + }); + it('xxx'); + after.cb(h => { - h.assert.equal(++count, 11); + h.ctn(); }); after(h => { - h.assert.equal(++count, 12); + }); }); @@ -101,20 +125,19 @@ Test.create(function (assert, describe, before, beforeEach, after, afterEach, it describe('here we go', function () { before(h => { - h.assert.equal(++count, 15); + }); after.cb(h => { - h.assert.equal(++count, 17); h.ctn(); }); - it('sync test', t => { - t.assert.equal(++count, 16); + it('passing', t => { + }); after(h => { - h.assert.equal(++count, 18); + }); }); @@ -124,25 +147,25 @@ Test.create(function (assert, describe, before, beforeEach, after, afterEach, it describe('here we go', function () { before(h => { - h.assert.equal(++count, 20); + }); after.cb(h => { - h.assert.equal(++count, 23); + h.ctn(); }); - it('sync test', t => { - t.assert.equal(++count, 21); + it('passing', t => { + }); - it.cb('sync test', t => { - t.assert.equal(++count, 22); + it.cb('passing', t => { + t.done(); }); after(h => { - h.assert.equal(++count, 24); + }); }); From 01b686568c97b4eb56d5c2f3db8b3815c39ea08a Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Fri, 6 Oct 2017 17:58:22 -0700 Subject: [PATCH 29/32] pdev:set --- config/suman-constants.js | 2 +- config/suman-constants.ts | 2 +- lib/index-helpers/exit-handling.js | 23 ++++++++++++---- lib/index-helpers/exit-handling.ts | 27 +++++++++++++++---- .../make-handle-befores-afters.js | 1 + .../make-handle-befores-afters.ts | 1 + lib/test-suite-helpers/make-handle-each.js | 10 ++++--- lib/test-suite-helpers/make-handle-each.ts | 13 ++++++--- lib/test-suite-helpers/make-handle-test.js | 1 + lib/test-suite-helpers/make-handle-test.ts | 2 +- lib/test-suite-helpers/make-the-trap.js | 4 +-- lib/test-suite-helpers/make-the-trap.ts | 8 +++--- test/src/dev/node/5.test.js | 7 +++-- 13 files changed, 70 insertions(+), 31 deletions(-) diff --git a/config/suman-constants.js b/config/suman-constants.js index 2f0b6b26..996c1318 100755 --- a/config/suman-constants.js +++ b/config/suman-constants.js @@ -19,7 +19,7 @@ exports.constants = Object.freeze({ '**suman/logs/**' ], SUMAN_HOOK_FATAL_WARNING_MESSAGE: 'Suman non-fatal error => Error in hook and "fatal" option for the hook is set to false =>\n', - SUMAN_HOOK_FATAL_MESSAGE: ' => fatal error in hook => (to continue even in the event of an error in a hook, use option {fatal:false}) =>', + SUMAN_HOOK_FATAL_MESSAGE: ' => fatal error in hook => (to continue even in the event of an error in a hook, use option {fatal:false}) =>\n', SUMAN_HARD_LIST: Object.keys({ describe: true, before: true, diff --git a/config/suman-constants.ts b/config/suman-constants.ts index b1486f90..524c30b1 100755 --- a/config/suman-constants.ts +++ b/config/suman-constants.ts @@ -31,7 +31,7 @@ export const constants = Object.freeze({ 'Suman non-fatal error => Error in hook and "fatal" option for the hook is set to false =>\n', SUMAN_HOOK_FATAL_MESSAGE: - ' => fatal error in hook => (to continue even in the event of an error in a hook, use option {fatal:false}) =>', + ' => fatal error in hook => (to continue even in the event of an error in a hook, use option {fatal:false}) =>\n', SUMAN_HARD_LIST: Object.keys({ diff --git a/lib/index-helpers/exit-handling.js b/lib/index-helpers/exit-handling.js index 628d4518..2edb3f69 100755 --- a/lib/index-helpers/exit-handling.js +++ b/lib/index-helpers/exit-handling.js @@ -98,6 +98,7 @@ process.on('warning', function (w) { console.error(w.stack || w); } }); +process.removeAllListeners('uncaughtException'); process.on('uncaughtException', function (err) { if (!err) { err = new Error('falsy value passed to uncaught exception handler.'); @@ -118,6 +119,12 @@ process.on('uncaughtException', function (err) { if (_suman.afterAlwaysEngaged) { return; } + if (_suman.sumanOpts && _suman.sumanOpts.series) { + if (_suman.activeDomain) { + _suman.activeDomain.emit('error', err); + return; + } + } if (!_suman.sumanOpts || _suman.sumanOpts.ignoreUncaughtExceptions !== false) { _suman.sumanUncaughtExceptionTriggered = err; setTimeout(function () { @@ -138,21 +145,27 @@ process.on('uncaughtException', function (err) { }); process.removeAllListeners('unhandledRejection'); process.on('unhandledRejection', function ($reason, p) { + var reason = $reason ? ($reason.stack || $reason) : new Error('no reason passed to unhandledRejection handler.'); if (p && p.domain) { if (p.domain.sumanTestCase || p.domain.sumanEachHook || p.domain.sumanAllHook) { - $reason && typeof $reason === 'object' && ($reason._alreadyHandledBySuman = true); - p.domain.emit('error', $reason); + typeof reason === 'object' && (reason._alreadyHandledBySuman = true); + p.domain.emit('error', reason); return; } } if (process.domain) { if (process.domain.sumanTestCase || process.domain.sumanEachHook || process.domain.sumanAllHook) { - $reason && typeof $reason === 'object' && ($reason._alreadyHandledBySuman = true); - process.domain.emit('error', $reason); + typeof reason === 'object' && ($reason._alreadyHandledBySuman = true); + process.domain.emit('error', reason); + return; + } + } + if (_suman.sumanOpts && _suman.sumanOpts.series) { + if (_suman.activeDomain) { + _suman.activeDomain.emit('error', reason); return; } } - var reason = ($reason.stack || $reason); console.error('\n'); _suman.logError(chalk.magenta.bold('Unhandled Rejection at Promise:'), chalk.magenta(util.inspect(p))); console.error('\n'); diff --git a/lib/index-helpers/exit-handling.ts b/lib/index-helpers/exit-handling.ts index 07caf263..60263dc0 100755 --- a/lib/index-helpers/exit-handling.ts +++ b/lib/index-helpers/exit-handling.ts @@ -141,6 +141,8 @@ process.on('warning', function (w: Error) { } }); +// remove all pre-existing listeners +process.removeAllListeners('uncaughtException'); process.on('uncaughtException', function (err: SumanErrorRace) { if (!err) { @@ -168,6 +170,13 @@ process.on('uncaughtException', function (err: SumanErrorRace) { return; } + if (_suman.sumanOpts && _suman.sumanOpts.series) { + if (_suman.activeDomain) { + _suman.activeDomain.emit('error', err); + return; + } + } + if (!_suman.sumanOpts || _suman.sumanOpts.ignoreUncaughtExceptions !== false) { _suman.sumanUncaughtExceptionTriggered = err; @@ -201,23 +210,31 @@ process.removeAllListeners('unhandledRejection'); process.on('unhandledRejection', ($reason: any, p: IPromiseWithDomain) => { + const reason = $reason ? ($reason.stack || $reason) : new Error('no reason passed to unhandledRejection handler.'); + if (p && p.domain) { if (p.domain.sumanTestCase || p.domain.sumanEachHook || p.domain.sumanAllHook) { - $reason && typeof $reason === 'object' && ($reason._alreadyHandledBySuman = true); - p.domain.emit('error', $reason); + typeof reason === 'object' && (reason._alreadyHandledBySuman = true); + p.domain.emit('error', reason); return; } } if (process.domain) { if (process.domain.sumanTestCase || process.domain.sumanEachHook || process.domain.sumanAllHook) { - $reason && typeof $reason === 'object' && ($reason._alreadyHandledBySuman = true); - process.domain.emit('error', $reason); + typeof reason === 'object' && ($reason._alreadyHandledBySuman = true); + process.domain.emit('error', reason); + return; + } + } + + if (_suman.sumanOpts && _suman.sumanOpts.series) { + if (_suman.activeDomain) { + _suman.activeDomain.emit('error', reason); return; } } - const reason = ($reason.stack || $reason); console.error('\n'); _suman.logError(chalk.magenta.bold('Unhandled Rejection at Promise:'), chalk.magenta(util.inspect(p))); console.error('\n'); diff --git a/lib/test-suite-helpers/make-handle-befores-afters.js b/lib/test-suite-helpers/make-handle-befores-afters.js index ec75c444..57298eef 100755 --- a/lib/test-suite-helpers/make-handle-befores-afters.js +++ b/lib/test-suite-helpers/make-handle-befores-afters.js @@ -28,6 +28,7 @@ exports.makeHandleBeforesAndAfters = function (suman, gracefulExit) { num: 0 }; var d = domain.create(); + _suman.activeDomain = d; d.sumanAllHook = true; d.sumanAllHookName = aBeforeOrAfter.desc || '(unknown all-hook name)'; var fini = handle_callback_helper_1.makeCallback(d, assertCount, null, aBeforeOrAfter, timerObj, gracefulExit, cb); diff --git a/lib/test-suite-helpers/make-handle-befores-afters.ts b/lib/test-suite-helpers/make-handle-befores-afters.ts index 94ab60bd..ccb752b6 100755 --- a/lib/test-suite-helpers/make-handle-befores-afters.ts +++ b/lib/test-suite-helpers/make-handle-befores-afters.ts @@ -50,6 +50,7 @@ export const makeHandleBeforesAndAfters = function (suman: ISuman, gracefulExit: }; const d = domain.create() as ISumanAllHookDomain; + _suman.activeDomain = d; d.sumanAllHook = true; d.sumanAllHookName = aBeforeOrAfter.desc || '(unknown all-hook name)'; diff --git a/lib/test-suite-helpers/make-handle-each.js b/lib/test-suite-helpers/make-handle-each.js index 3ab04a78..08bc5c71 100755 --- a/lib/test-suite-helpers/make-handle-each.js +++ b/lib/test-suite-helpers/make-handle-each.js @@ -37,6 +37,7 @@ exports.makeHandleBeforeOrAfterEach = function (suman, gracefulExit) { num: 0 }; var d = domain.create(); + _suman.activeDomain = d; d.sumanEachHook = true; d.sumanEachHookName = aBeforeOrAfterEach.desc || '(unknown hook name)'; d.testDescription = test.desc || '(unknown test case name)'; @@ -61,8 +62,7 @@ exports.makeHandleBeforeOrAfterEach = function (suman, gracefulExit) { gracefulExit({ sumanFatal: true, sumanExitCode: constants.EXIT_CODES.FATAL_HOOK_ERROR, - stack: ' => fatal error in hook => (to continue even in the event of an error ' + - 'in a hook, use option {fatal:false}) =>' + '\n' + formatedStk + stack: constants.SUMAN_HOOK_FATAL_MESSAGE + formatedStk }); } } @@ -100,8 +100,10 @@ exports.makeHandleBeforeOrAfterEach = function (suman, gracefulExit) { t.test = {}; t.test.desc = test.desc; t.test.testId = test.testId; - t.test.result = test.error ? 'failed' : 'passed'; - t.test.error = test.error; + if (aBeforeOrAfterEach.type === 'afterEach/teardownTest') { + t.test.result = test.error ? 'failed' : 'passed'; + t.test.error = test.error; + } t.data = test.data; t.desc = aBeforeOrAfterEach.desc; t.value = test.value; diff --git a/lib/test-suite-helpers/make-handle-each.ts b/lib/test-suite-helpers/make-handle-each.ts index c23d1a34..5fdf5d06 100755 --- a/lib/test-suite-helpers/make-handle-each.ts +++ b/lib/test-suite-helpers/make-handle-each.ts @@ -61,6 +61,7 @@ export const makeHandleBeforeOrAfterEach = function (suman: ISuman, gracefulExit }; const d = domain.create() as ISumanEachHookDomain; + _suman.activeDomain = d; d.sumanEachHook = true; d.sumanEachHookName = aBeforeOrAfterEach.desc || '(unknown hook name)'; d.testDescription = test.desc || '(unknown test case name)'; @@ -92,8 +93,7 @@ export const makeHandleBeforeOrAfterEach = function (suman: ISuman, gracefulExit gracefulExit({ sumanFatal: true, sumanExitCode: constants.EXIT_CODES.FATAL_HOOK_ERROR, - stack: ' => fatal error in hook => (to continue even in the event of an error ' + - 'in a hook, use option {fatal:false}) =>' + '\n' + formatedStk + stack: constants.SUMAN_HOOK_FATAL_MESSAGE + formatedStk }); } } @@ -145,8 +145,13 @@ export const makeHandleBeforeOrAfterEach = function (suman: ISuman, gracefulExit t.test = {}; t.test.desc = test.desc; t.test.testId = test.testId; - t.test.result = test.error ? 'failed' : 'passed'; - t.test.error = test.error; + + if(aBeforeOrAfterEach.type === 'afterEach/teardownTest'){ + // these properties are sent to afterEach hooks, but not beforeEach hooks + t.test.result = test.error ? 'failed' : 'passed'; + t.test.error = test.error; + } + t.data = test.data; t.desc = aBeforeOrAfterEach.desc; t.value = test.value; diff --git a/lib/test-suite-helpers/make-handle-test.js b/lib/test-suite-helpers/make-handle-test.js index 485e9222..dfb055c3 100755 --- a/lib/test-suite-helpers/make-handle-test.js +++ b/lib/test-suite-helpers/make-handle-test.js @@ -45,6 +45,7 @@ exports.makeHandleTest = function (suman, gracefulExit) { timer: setTimeout(onTimeout, _suman.weAreDebugging ? 5000000 : test.timeout) }; var d = domain.create(); + _suman.activeDomain = d; d.sumanTestCase = true; d.sumanTestName = test.desc; var assertCount = { diff --git a/lib/test-suite-helpers/make-handle-test.ts b/lib/test-suite-helpers/make-handle-test.ts index b4996ff3..4bab8a79 100755 --- a/lib/test-suite-helpers/make-handle-test.ts +++ b/lib/test-suite-helpers/make-handle-test.ts @@ -30,7 +30,6 @@ const helpers = require('./handle-promise-generator'); import {cloneError} from '../misc/clone-error'; import {makeTestCase} from './t-proto-test'; import {freezeExistingProps} from 'freeze-existing-props' - const resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); ///////////////////////////////////////////////////////////////////////////////////// @@ -71,6 +70,7 @@ export const makeHandleTest = function (suman: ISuman, gracefulExit: Function) { }; const d = domain.create() as ISumanTestCaseDomain; + _suman.activeDomain = d; d.sumanTestCase = true; d.sumanTestName = test.desc; diff --git a/lib/test-suite-helpers/make-the-trap.js b/lib/test-suite-helpers/make-the-trap.js index 85a3f073..f8706653 100755 --- a/lib/test-suite-helpers/make-the-trap.js +++ b/lib/test-suite-helpers/make-the-trap.js @@ -47,7 +47,7 @@ exports.makeTheTrap = function (suman, gracefulExit) { } async.series([ function (cb) { - function handleTestContainer() { + var handleTestContainer = function () { handleTest(self, test, function (err, result) { implementationError(err); var $result = handleTestResult(result, test); @@ -60,7 +60,7 @@ exports.makeTheTrap = function (suman, gracefulExit) { process.nextTick(cb, null, result); } }); - } + }; if (delaySum) { setTimeout(handleTestContainer, delaySum); } diff --git a/lib/test-suite-helpers/make-the-trap.ts b/lib/test-suite-helpers/make-the-trap.ts index e44cfd5d..541f81f5 100755 --- a/lib/test-suite-helpers/make-the-trap.ts +++ b/lib/test-suite-helpers/make-the-trap.ts @@ -3,7 +3,7 @@ //dts import {ITestSuite} from "suman-types/dts/test-suite"; import {ISuman, Suman} from "../suman"; -import {IPseudoError} from "suman-types/dts/global"; +import {IPseudoError, IGlobalSumanObj} from "suman-types/dts/global"; import {IItOpts, ITestDataObj} from "suman-types/dts/it"; import {IBeforeEachObj} from "suman-types/dts/before-each"; import {IAFterEachObj} from "suman-types/dts/after-each"; @@ -20,7 +20,7 @@ import * as async from 'async'; import {events} from 'suman-events'; //project -const _suman = global.__suman = (global.__suman || {}); +const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); const {makeHandleTestResults} = require('./handle-test-result'); const {makeHandleTest} = require('./make-handle-test'); const {getAllAfterEaches, getAllBeforesEaches} = require('./get-all-eaches'); @@ -77,7 +77,7 @@ export const makeTheTrap = function (suman: ISuman, gracefulExit: Function) { async.series([ function (cb: Function) { - function handleTestContainer() { + const handleTestContainer = function () { handleTest(self, test, function (err: IPseudoError, result: any) { implementationError(err); let $result = handleTestResult(result, test); @@ -90,7 +90,7 @@ export const makeTheTrap = function (suman: ISuman, gracefulExit: Function) { process.nextTick(cb, null, result); } }); - } + }; if (delaySum) { // if non-zero / non-falsy value setTimeout(handleTestContainer, delaySum); diff --git a/test/src/dev/node/5.test.js b/test/src/dev/node/5.test.js index ea0ac4b4..c4cda64e 100644 --- a/test/src/dev/node/5.test.js +++ b/test/src/dev/node/5.test.js @@ -103,14 +103,13 @@ Test.create(function (assert, describe, before, beforeEach, after, afterEach, it }); - it('xxx', t => { - + it.skip('xxx', t => { + // skipped tests should not reach beforeEach/afterEach hooks }); - it('xxx'); + it('xxx'); // stubbed tests should not reach beforeEach/afterEach hooks after.cb(h => { - h.ctn(); }); From ed1aaea0c5e79e1730266ea545f9c02394dc6751 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Fri, 6 Oct 2017 19:59:45 -0700 Subject: [PATCH 30/32] pdev:set --- exp.js | 2 +- lib/exec-suite.js | 6 ++++-- lib/exec-suite.ts | 5 +++-- lib/handle-exit.js | 5 ----- lib/handle-exit.ts | 12 ++---------- lib/helpers/handle-suman-counts.js | 8 ++++---- lib/helpers/handle-suman-counts.ts | 10 ++++------ lib/helpers/log-stdio-of-child.js | 5 +++-- lib/helpers/log-stdio-of-child.ts | 6 ++++-- lib/index.js | 9 ++++++--- lib/index.ts | 11 ++++++++--- lib/run-child-not-runner.js | 16 +++++++++++----- lib/run-child-not-runner.ts | 20 ++++++++++++++------ lib/runner-helpers/handle-fatal-message.js | 15 +++++++++------ lib/runner-helpers/handle-fatal-message.ts | 15 +++++++++------ lib/suman.d.ts | 4 ++-- lib/suman.js | 4 +++- lib/suman.ts | 8 +++++--- test/.suman/gantt-4.html | 2 +- test/src/dev/node/3.test.js | 2 +- test/src/dev/node/5.test.js | 2 +- 21 files changed, 95 insertions(+), 72 deletions(-) diff --git a/exp.js b/exp.js index f81531e8..3388b668 100644 --- a/exp.js +++ b/exp.js @@ -13,7 +13,7 @@ ////// -console.log('this is the beginning.');;;;; +console.log('this is the beginning.'); const path = require('path'); console.error(`${path.basename(__dirname)} reporter may be unable to properly indent output.`); diff --git a/lib/exec-suite.js b/lib/exec-suite.js index 33d352ce..5e23178a 100755 --- a/lib/exec-suite.js +++ b/lib/exec-suite.js @@ -58,8 +58,10 @@ exports.execSuite = function (suman) { msg: msg_1 } }, function () { - console.log(msg_1 + '\n\n'); - console.error(new Error(' => Suman usage error => invalid arrow/generator function usage.').stack); + console.error(msg_1 + '\n\n'); + var err = new Error('Suman usage error => invalid arrow/generator function usage.').stack; + _suman.logError(err); + _suman.writeTestError(err); process.exit(suman_constants_1.constants.EXIT_CODES.INVALID_ARROW_FUNCTION_USAGE); }); } diff --git a/lib/exec-suite.ts b/lib/exec-suite.ts index e11a66b9..05f2e80e 100755 --- a/lib/exec-suite.ts +++ b/lib/exec-suite.ts @@ -92,8 +92,9 @@ export const execSuite = function (suman: ISuman): Function { msg: msg } }, function () { - console.log(msg + '\n\n'); - console.error(new Error(' => Suman usage error => invalid arrow/generator function usage.').stack); + console.error(msg + '\n\n'); + let err = new Error('Suman usage error => invalid arrow/generator function usage.').stack; + _suman.logError(err); _suman.writeTestError(err); process.exit(constants.EXIT_CODES.INVALID_ARROW_FUNCTION_USAGE); }); diff --git a/lib/handle-exit.js b/lib/handle-exit.js index d883d2cb..8a7b7801 100755 --- a/lib/handle-exit.js +++ b/lib/handle-exit.js @@ -18,7 +18,6 @@ if (!process.prependOnceListener) { process.prependOnceListener('exit', function (code) { var testDebugLogPath = _suman.testDebugLogPath; debugger; - _suman.logError('beginning of exit handler.'); if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e) { @@ -31,8 +30,6 @@ process.prependOnceListener('exit', function (code) { code = code || constants.EXIT_CODES.TEST_CASE_FAIL; } if (testDebugLogPath) { - _suman.logError('BEGIN of log log log.'); - _suman.logError('END of log log log.'); } _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', { suppress: true }); if (code > 0 && testErrors.length < 1) { @@ -77,7 +74,5 @@ process.prependOnceListener('exit', function (code) { _suman.logError('killing daemon process, using absolute last hook.'); _suman.absoluteLastHook(code); } - _suman.logError('doing the very last thing whoa.'); - _suman.logError('setting final exit code now.'); process.exitCode = code; }); diff --git a/lib/handle-exit.ts b/lib/handle-exit.ts index 07d5c573..1061a3f5 100755 --- a/lib/handle-exit.ts +++ b/lib/handle-exit.ts @@ -37,11 +37,8 @@ if (!process.prependOnceListener) { process.prependOnceListener('exit', function (code: number) { const testDebugLogPath = _suman.testDebugLogPath; - debugger; - _suman.logError('beginning of exit handler.'); - if (errors.length > 0) { code = code || constants.EXIT_CODES.UNEXPECTED_NON_FATAL_ERROR; errors.forEach(function (e: Error) { @@ -54,13 +51,11 @@ process.prependOnceListener('exit', function (code: number) { code = code || constants.EXIT_CODES.TEST_CASE_FAIL; } - if(testDebugLogPath){ - _suman.logError('BEGIN of log log log.'); + if (testDebugLogPath) { // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); // fs.appendFileSync(testDebugLogPath, 'nonsesnse nonsesnse nosneses\n'); - _suman.logError('END of log log log.'); } _suman.writeTestError('\n\n ### Suman end run ### \n\n\n\n', {suppress: true}); @@ -114,10 +109,7 @@ process.prependOnceListener('exit', function (code: number) { _suman.absoluteLastHook(code); } - _suman.logError('doing the very last thing whoa.'); - _suman.logError('setting final exit code now.'); - // => we probably don't need this... - // _suman.logError('making final call to process.exit()'); + // this is important, because we *can* change the exit code by using this call process.exitCode = code; // process.exit(code); diff --git a/lib/helpers/handle-suman-counts.js b/lib/helpers/handle-suman-counts.js index 555320b3..c7566091 100755 --- a/lib/helpers/handle-suman-counts.js +++ b/lib/helpers/handle-suman-counts.js @@ -6,6 +6,7 @@ var util = require("util"); var EE = require("events"); var fs = require("fs"); var suman_events_1 = require("suman-events"); +var su = require("suman-utils"); var _suman = global.__suman = (global.__suman || {}); var handle_runner_request_response_1 = require("../index-helpers/handle-runner-request-response"); var counts = require('./suman-counts'); @@ -28,7 +29,9 @@ suiteResultEmitter.once('suman-test-file-complete', function () { fn = handle_suman_once_post_1.oncePostFn; } var codes = results.map(function (i) { return i.exitCode; }); - _suman.log(' => All "exit" codes from test suites => ', util.inspect(codes)); + if (su.vgt(6)) { + _suman.log(' => All "exit" codes from test suites => ', util.inspect(codes)); + } var highestExitCode = Math.max.apply(null, codes); fn(function (err) { err && _suman.logError(err.stack || err); @@ -59,10 +62,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } }; }; - _suman.log(' => about to waitForStdioToDrain'); - _suman.log(' => about to call process.exit1'); waitForStdioToDrain(function () { - _suman.log(' => about to call process.exit2'); process.exit(highestExitCode); }); }); diff --git a/lib/helpers/handle-suman-counts.ts b/lib/helpers/handle-suman-counts.ts index aba7d977..1b25cef3 100755 --- a/lib/helpers/handle-suman-counts.ts +++ b/lib/helpers/handle-suman-counts.ts @@ -41,7 +41,6 @@ suiteResultEmitter.once('suman-test-file-complete', function () { // i may not be defined if testsuite (rootsuite) was skipped resultz = results.map(i => i ? i : null).filter(i => i); - resultz.forEach(function (r) { resultBroadcaster.emit(String(events.STANDARD_TABLE), r.tableData, r.exitCode); }); @@ -50,7 +49,10 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } const codes = results.map(i => i.exitCode); - _suman.log(' => All "exit" codes from test suites => ', util.inspect(codes)); + if (su.vgt(6)) { + _suman.log(' => All "exit" codes from test suites => ', util.inspect(codes)); + } + const highestExitCode = Math.max.apply(null, codes); fn(function (err: IPseudoError) { @@ -91,11 +93,7 @@ suiteResultEmitter.once('suman-test-file-complete', function () { } }; - _suman.log(' => about to waitForStdioToDrain'); - _suman.log(' => about to call process.exit1'); - waitForStdioToDrain(function () { - _suman.log(' => about to call process.exit2'); process.exit(highestExitCode) }); diff --git a/lib/helpers/log-stdio-of-child.js b/lib/helpers/log-stdio-of-child.js index d6b9b609..e1a360df 100755 --- a/lib/helpers/log-stdio-of-child.js +++ b/lib/helpers/log-stdio-of-child.js @@ -15,7 +15,9 @@ exports.run = function (filePath) { } callable = false; if (process.env.MAKE_SUMAN_LOG !== 'no') { - _suman.log('we are logging child stdout/stderr to files.', '\n'); + if (su.vgt(6)) { + _suman.log('we are logging child stdout/stderr to files.', '\n'); + } var timestamp = process.env.SUMAN_RUNNER_TIMESTAMP; var runId = process.env.SUMAN_RUN_ID; var logsDir = _suman.sumanConfig.logsDir || _suman.sumanHelperDirRoot + '/logs'; @@ -80,5 +82,4 @@ exports.run = function (filePath) { } }); } - console.log('\n'); }; diff --git a/lib/helpers/log-stdio-of-child.ts b/lib/helpers/log-stdio-of-child.ts index 4bdd9483..0cfce70b 100755 --- a/lib/helpers/log-stdio-of-child.ts +++ b/lib/helpers/log-stdio-of-child.ts @@ -34,7 +34,10 @@ export const run = function (filePath: string) { if (process.env.MAKE_SUMAN_LOG !== 'no') { - _suman.log('we are logging child stdout/stderr to files.', '\n'); + if (su.vgt(6)) { + _suman.log('we are logging child stdout/stderr to files.', '\n'); + } + const timestamp = process.env.SUMAN_RUNNER_TIMESTAMP; const runId = process.env.SUMAN_RUN_ID; const logsDir = _suman.sumanConfig.logsDir || _suman.sumanHelperDirRoot + '/logs'; @@ -127,5 +130,4 @@ export const run = function (filePath: string) { }); } - console.log('\n'); }; diff --git a/lib/index.js b/lib/index.js index da5031ac..02e0d661 100755 --- a/lib/index.js +++ b/lib/index.js @@ -89,8 +89,10 @@ var testSuiteRegistrationQueue = async.queue(function (task, cb) { process.nextTick(task); }, c); testSuiteRegistrationQueue.drain = function () { - var suites = testRuns.length === 1 ? 'suite' : 'suites'; - _suman.log("Pushing " + testRuns.length + " test " + suites + " onto queue with concurrency " + c + ".\n"); + if (su.vgt(5)) { + var suites = testRuns.length === 1 ? 'suite' : 'suites'; + _suman.log("Pushing " + testRuns.length + " test " + suites + " onto queue with concurrency " + c + ".\n\n"); + } while (testRuns.length > 0) { testSuiteQueue.push(testRuns.shift()); } @@ -222,7 +224,7 @@ exports.init = function ($module, $opts, confOverride) { clearTimeout(to); _suman['$pre'] = JSON.parse(su.customStringify(vals)); _suman.userData = JSON.parse(su.customStringify(iocData)); - var suman = suman_1.makeSuman($module, _interface, true, sumanConfig); + var suman = suman_1.makeSuman($module, _interface, opts); suman.iocData = JSON.parse(su.customStringify(iocData)); var run = execSuite(suman); try { @@ -283,6 +285,7 @@ exports.init = function ($module, $opts, confOverride) { var create = exports.init.$ingletonian.create = start; _interface === 'TDD' ? exports.init.$ingletonian.suite = create : exports.init.$ingletonian.describe = create; loaded = true; + exports.init.$ingletonian.Test = exports.init.$ingletonian; return exports.init.$ingletonian; }; exports.autoPass = function (t) { diff --git a/lib/index.ts b/lib/index.ts index 26c304b8..a70053ed 100755 --- a/lib/index.ts +++ b/lib/index.ts @@ -150,8 +150,11 @@ const testSuiteRegistrationQueue = async.queue(function (task: Function, cb: Fun }, c); testSuiteRegistrationQueue.drain = function () { - const suites = testRuns.length === 1 ? 'suite' : 'suites'; - _suman.log(`Pushing ${testRuns.length} test ${suites} onto queue with concurrency ${c}.\n`); + if (su.vgt(5)) { + const suites = testRuns.length === 1 ? 'suite' : 'suites'; + _suman.log(`Pushing ${testRuns.length} test ${suites} onto queue with concurrency ${c}.\n\n`); + } + while (testRuns.length > 0) { //explicit for your pleasure testSuiteQueue.push(testRuns.shift()); } @@ -337,7 +340,7 @@ export const init: IInit = function ($module, $opts, confOverride): IStartCreate _suman.userData = JSON.parse(su.customStringify(iocData)); // suman instance is the main object that flows through entire program - let suman = makeSuman($module, _interface, true, sumanConfig); + let suman = makeSuman($module, _interface, opts); suman.iocData = JSON.parse(su.customStringify(iocData)); const run = execSuite(suman); @@ -410,6 +413,8 @@ export const init: IInit = function ($module, $opts, confOverride): IStartCreate _interface === 'TDD' ? init.$ingletonian.suite = create : init.$ingletonian.describe = create; loaded = true; + + init.$ingletonian.Test = init.$ingletonian; return init.$ingletonian; }; diff --git a/lib/run-child-not-runner.js b/lib/run-child-not-runner.js index ce64ff33..115d12f1 100755 --- a/lib/run-child-not-runner.js +++ b/lib/run-child-not-runner.js @@ -4,9 +4,8 @@ var process = require('suman-browser-polyfills/modules/process'); var global = require('suman-browser-polyfills/modules/global'); var path = require('path'); var util = require("util"); +var su = require("suman-utils"); var chalk = require("chalk"); -var sumanUtils = require('suman-utils'); -var debug = require('suman-debug')('s'); var _suman = global.__suman = (global.__suman || {}); var constants = require('../config/suman-constants').constants; var SUMAN_SINGLE_PROCESS = process.env.SUMAN_SINGLE_PROCESS === 'yes'; @@ -51,18 +50,25 @@ exports.run = function (files) { if (!process.prependListener) { process.prependListener = process.on.bind(process); } - process.prependListener('exit', function (code) { + if (!process.prependOnceListener) { + process.prependOnceListener = process.on.bind(process); + } + process.prependOnceListener('exit', function (code) { if (!_suman.isActualExitHandlerRegistered) { _suman.logError(chalk.magenta('Warning, you may have failed to point Suman to an actual Suman test file.')); _suman.logError(chalk.magenta('Or there was an immediate error, which prevented any other exit handlers from being registered.')); } }); if (SUMAN_SINGLE_PROCESS) { - _suman.log('we are in SUMAN_SINGLE_PROCESS mode.'); + if (su.vgt(5)) { + _suman.log('We are in "SUMAN_SINGLE_PROCESS" mode: all JavaScript-based tests will be run in a single process.'); + } require('./handle-single-proc').run(files); } else { - _suman.log("running this single test file => \"" + files[0] + "\""); + if (su.vgt(5)) { + _suman.log("running this single test file => \"" + chalk.bold(files[0]) + "\""); + } require('./helpers/log-stdio-of-child').run(files[0]); require(files[0]); } diff --git a/lib/run-child-not-runner.ts b/lib/run-child-not-runner.ts index dd2e4711..68123417 100755 --- a/lib/run-child-not-runner.ts +++ b/lib/run-child-not-runner.ts @@ -10,11 +10,9 @@ const path = require('path'); import util = require('util'); //npm +import su = require('suman-utils'); import chalk = require('chalk'); -const sumanUtils = require('suman-utils'); -const debug = require('suman-debug')('s'); - //project const _suman: IGlobalSumanObj = global.__suman = (global.__suman || {}); const {constants} = require('../config/suman-constants'); @@ -81,7 +79,11 @@ export const run = function (files: Array) { process.prependListener = process.on.bind(process); } - process.prependListener('exit', function (code: number) { + if (!process.prependOnceListener) { + process.prependOnceListener = process.on.bind(process); + } + + process.prependOnceListener('exit', function (code: number) { if (!_suman.isActualExitHandlerRegistered) { _suman.logError(chalk.magenta('Warning, you may have failed to point Suman to an actual Suman test file.'); _suman.logError(chalk.magenta('Or there was an immediate error, which prevented any other exit handlers from being registered.')); @@ -89,11 +91,17 @@ export const run = function (files: Array) { }); if (SUMAN_SINGLE_PROCESS) { - _suman.log('we are in SUMAN_SINGLE_PROCESS mode.'); + if (su.vgt(5)) { + _suman.log('We are in "SUMAN_SINGLE_PROCESS" mode: all JavaScript-based tests will be run in a single process.'); + } + require('./handle-single-proc').run(files); } else { - _suman.log(`running this single test file => "${files[0]}"`); + if (su.vgt(5)) { + _suman.log(`running this single test file => "${chalk.bold(files[0])}"`); + } + require('./helpers/log-stdio-of-child').run(files[0]); require(files[0]); } diff --git a/lib/runner-helpers/handle-fatal-message.js b/lib/runner-helpers/handle-fatal-message.js index 97c1dc90..5cac2e36 100755 --- a/lib/runner-helpers/handle-fatal-message.js +++ b/lib/runner-helpers/handle-fatal-message.js @@ -11,17 +11,21 @@ var _suman = global.__suman = (global.__suman || {}); var resultBroadcaster = _suman.resultBroadcaster = (_suman.resultBroadcaster || new EE()); exports.handleFatalMessage = function ($msg, n, socket) { var msg = String(typeof $msg.error === 'string' ? $msg.error : util.inspect($msg)).replace(/\n/g, '\n').replace('\t', ''); - msg = msg.split('\n').map(function (item, index) { + msg = msg.split('\n') + .concat(su.repeatCharXTimes('_', 115)) + .map(function (item, index) { if (index === 0) { return item; } else { - return su.padWithXSpaces(8) + item; + return su.padWithXSpaces(3) + item; } - }).join('\n'); + }) + .join('\n'); + var padding = su.padWithXSpaces(2); var message = [ '\n', - chalk.bgWhite.magenta.bold(' => Suman runner => there was a fatal test suite error - an error was encountered in ' + + chalk.bgWhite.magenta.bold(' There was a fatal test suite error - an error was encountered in ' + 'your test code that prevents Suman '), chalk.bgWhite.magenta.bold(' from continuing with a particular test suite within the following path: '), ' ', @@ -34,9 +38,8 @@ exports.handleFatalMessage = function ($msg, n, socket) { } return null; })(), - ' ', chalk.magenta.bold(msg), '\n\n' - ].filter(function (item) { return item; }).join('\n\t'); + ].filter(function (item) { return item; }).join('\n' + padding); resultBroadcaster.emit(String(events.FATAL_TEST_ERROR), message); }; diff --git a/lib/runner-helpers/handle-fatal-message.ts b/lib/runner-helpers/handle-fatal-message.ts index daf72123..5d2eeafb 100755 --- a/lib/runner-helpers/handle-fatal-message.ts +++ b/lib/runner-helpers/handle-fatal-message.ts @@ -29,19 +29,23 @@ export const handleFatalMessage = function ($msg: Object, n: ISumanChildProcess let msg = String(typeof $msg.error === 'string' ? $msg.error : util.inspect($msg)).replace(/\n/g, '\n').replace('\t', ''); - msg = msg.split('\n').map(function (item, index) { + msg = msg.split('\n') + .concat(su.repeatCharXTimes('_',115)) + .map(function (item, index) { if (index === 0) { return item; } else { - return su.padWithXSpaces(8) + item; + return su.padWithXSpaces(3) + item; } + }) + .join('\n'); - }).join('\n'); + const padding = su.padWithXSpaces(2); const message = [ '\n', - chalk.bgWhite.magenta.bold(' => Suman runner => there was a fatal test suite error - an error was encountered in ' + + chalk.bgWhite.magenta.bold(' There was a fatal test suite error - an error was encountered in ' + 'your test code that prevents Suman '), chalk.bgWhite.magenta.bold(' from continuing with a particular test suite within the following path: '), ' ', @@ -54,11 +58,10 @@ export const handleFatalMessage = function ($msg: Object, n: ISumanChildProcess } return null; })(), - ' ', //chalk.bgBlack.white(' '), chalk.magenta.bold(msg), // chalk.magenta.bold(String(msg.error ? msg.error : JSON.stringify(msg)).replace(/\n/g, '\n\t')), '\n\n' - ].filter(item => item).join('\n\t'); //filter out null/undefined + ].filter(item => item).join('\n' + padding); //filter out null/undefined resultBroadcaster.emit(String(events.FATAL_TEST_ERROR), message); diff --git a/lib/suman.d.ts b/lib/suman.d.ts index 4886fe7b..49e7f341 100755 --- a/lib/suman.d.ts +++ b/lib/suman.d.ts @@ -1,5 +1,4 @@ import { ITestSuite } from "suman-types/dts/test-suite"; -import { ISumanConfig } from "suman-types/dts/global"; import { ISumanInputs } from "suman-types/dts/suman"; import { ITestDataObj } from "suman-types/dts/it"; export interface ITestBlockMethodCache { @@ -12,6 +11,7 @@ export declare class Suman { private __inject; testBlockMethodCache: ITestBlockMethodCache; iocData: Object; + force: boolean; fileName: string; slicedFileName: string; timestamp: number; @@ -38,4 +38,4 @@ export declare class Suman { logResult(test: ITestDataObj): void; } export declare type ISuman = Suman; -export declare const makeSuman: ($module: NodeModule, _interface: string, shouldCreateResultsDir: boolean, config: ISumanConfig) => Suman; +export declare const makeSuman: ($module: NodeModule, _interface: string, opts: any) => any; diff --git a/lib/suman.js b/lib/suman.js index 99d07bd6..45c52f3b 100755 --- a/lib/suman.js +++ b/lib/suman.js @@ -40,6 +40,7 @@ var Suman = (function () { this.numHooksSkipped = 0; this.numHooksStubbed = 0; this.numBlocksSkipped = 0; + this.force = obj.force || false; var queue; this.getQueue = function () { if (!queue) { @@ -245,7 +246,7 @@ var Suman = (function () { return Suman; }()); exports.Suman = Suman; -exports.makeSuman = function ($module, _interface, shouldCreateResultsDir, config) { +exports.makeSuman = function ($module, _interface, opts) { var liveSumanServer = false; if (process.argv.indexOf('--live_suman_server') > -1) { liveSumanServer = true; @@ -276,6 +277,7 @@ exports.makeSuman = function ($module, _interface, shouldCreateResultsDir, confi fileName: path.resolve($module.filename), usingLiveSumanServer: liveSumanServer, server: server, + force: opts.force, timestamp: timestamp, interface: _interface }); diff --git a/lib/suman.ts b/lib/suman.ts index 6752f7ab..a5d35fc9 100755 --- a/lib/suman.ts +++ b/lib/suman.ts @@ -5,7 +5,7 @@ import {ITestSuite} from "suman-types/dts/test-suite"; import {IGlobalSumanObj, IPseudoError, ISumanConfig} from "suman-types/dts/global"; import {ITableData} from "suman-types/dts/table-data"; import {ISumanInputs} from "suman-types/dts/suman"; -import {ISuman, ITableDataCallbackObj, ISumanServerInfo} from "suman-types/dts/suman"; +import {ITableDataCallbackObj, ISumanServerInfo} from "suman-types/dts/suman"; //polyfills const process = require('suman-browser-polyfills/modules/process'); @@ -60,6 +60,7 @@ export class Suman { private __inject: Object; testBlockMethodCache: ITestBlockMethodCache; iocData: Object; + force: boolean; fileName: string; slicedFileName: string; timestamp: number; @@ -104,6 +105,7 @@ export class Suman { this.numHooksSkipped = 0; this.numHooksStubbed = 0; this.numBlocksSkipped = 0; + this.force = obj.force || false; let queue: any; @@ -386,8 +388,7 @@ export type ISuman = Suman; /////////////////////////////////////////////////////////////////////////////////////////////// -export const makeSuman = function ($module: NodeModule, _interface: string, - shouldCreateResultsDir: boolean, config: ISumanConfig) { +export const makeSuman = function ($module: NodeModule, _interface: string, opts: Objects) { let liveSumanServer = false; @@ -430,6 +431,7 @@ export const makeSuman = function ($module: NodeModule, _interface: string, fileName: path.resolve($module.filename), usingLiveSumanServer: liveSumanServer, server, + force: opts.force, timestamp, interface: _interface }); diff --git a/test/.suman/gantt-4.html b/test/.suman/gantt-4.html index 4436ef3c..78a964c4 100644 --- a/test/.suman/gantt-4.html +++ b/test/.suman/gantt-4.html @@ -220,7 +220,7 @@ "status": "KILLED" }]; - let tasksRaw = JSON.parse('[{"startDate":1507333032752,"endDate":1507333033488,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1507333032747,"endDate":1507333033472,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507333032742,"endDate":1507333033469,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/3.test.js","status":"SUCCEEDED"},{"startDate":1507333032731,"endDate":1507333033468,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/4.test.js","status":"SUCCEEDED"},{"startDate":1507333032727,"endDate":1507333033468,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/5.test.js","status":"SUCCEEDED"}]'); + let tasksRaw = JSON.parse('[{"startDate":1507345161982,"endDate":1507345162813,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/2.test.js","status":"SUCCEEDED"},{"startDate":1507345161979,"endDate":1507345162739,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/3.test.js","status":"SUCCEEDED"},{"startDate":1507345161974,"endDate":1507345162813,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/1.test.js","status":"SUCCEEDED"},{"startDate":1507345161966,"endDate":1507345162738,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/4.test.js","status":"SUCCEEDED"},{"startDate":1507345161962,"endDate":1507345162612,"transformStartDate":null,"transformEndDate":null,"taskName":"/Users/alexamil/WebstormProjects/oresoftware/sumanjs/suman/test/src/dev/node/5.test.js","status":"FAILED"}]'); let tasks = []; diff --git a/test/src/dev/node/3.test.js b/test/src/dev/node/3.test.js index 3ecfb576..f0ece8cd 100644 --- a/test/src/dev/node/3.test.js +++ b/test/src/dev/node/3.test.js @@ -2,7 +2,7 @@ 'use strict'; const suman = require('suman'); -const Test = suman.init(module); +const {Test} = suman.init(module); /////////////////////////////////////////////////////////////////////// diff --git a/test/src/dev/node/5.test.js b/test/src/dev/node/5.test.js index c4cda64e..b6267966 100644 --- a/test/src/dev/node/5.test.js +++ b/test/src/dev/node/5.test.js @@ -2,7 +2,7 @@ 'use strict'; const suman = require('suman'); -const Test = suman.init(module, { +const {Test} = suman.init(module, { forceParallel: true // parallel, not parallel-max }); From 7194beccf54b98713c86171febbceab738acb1df Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Fri, 6 Oct 2017 20:00:55 -0700 Subject: [PATCH 31/32] pdev:set From b38b8ea474f14c135c2daed8fefd20a8be2e3927 Mon Sep 17 00:00:00 2001 From: Olegzandr VD Date: Fri, 6 Oct 2017 20:01:20 -0700 Subject: [PATCH 32/32] feature:merge:1507345280881