diff --git a/.gitignore b/.gitignore index 7cd5fab..47aeae1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ processed.txt *.log lite.js test/sealer.test.js1 +package-lock.json diff --git a/.travis.yml b/.travis.yml index 65aec9d..33331be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,5 +10,5 @@ addons: packages: - g++-4.8 install: - - "travis_retry npm i -g forever tap" + - "travis_retry npm i -g tap" - "travis_retry npm i" diff --git a/index.js b/index.js index 80b6751..2c6f1f5 100644 --- a/index.js +++ b/index.js @@ -1,34 +1,19 @@ -const tradle = module.exports = exports -// tradle.keeper = require('./lib/keeper') -tradle.protocol = require('@tradle/protocol') -tradle.sender = require('./lib/sender') -tradle.sealer = require('./lib/sealer') -tradle.sealwatch = require('./lib/sealwatch') -tradle.dbs = { - objects: require('./lib/dbs/objects'), - // tx: require('./lib/dbs/txs'), - seals: require('./lib/dbs/seals'), - watches: require('./lib/dbs/watches'), - addressBook: require('./lib/dbs/addressBook'), - simpleCustom: require('./lib/dbs/simpleCustom'), - msgMeta: require('./lib/dbs/msgMeta'), +module.exports = { + constants: require('./lib/constants.js'), + dbs: require('./lib/dbs/index.js'), + errors: require('./lib/errors.js'), + node: require('./lib/node.js'), + partial: require('./lib/partial.js'), + protocol: require('@tradle/protocol'), + protobuf: require('./lib/proto.js'), + retrystream: require('./lib/retrystream.js'), + sender: require('./lib/sender.js'), + sealer: require('./lib/sealer.js'), + sealwatch: require('./lib/sealwatch.js'), + topics: require('./lib/topics.js'), + typeforce: require('@tradle/typeforce'), + types: require('./lib/types.js'), + utils: require('./lib/utils.js'), + validator: require('./lib/validator.js') } - -tradle.retrystream = require('./lib/retrystream') -tradle.validator = require('./lib/validator') -tradle.types = require('./lib/types') -tradle.utils = require('./lib/utils') -tradle.constants = require('./lib/constants') -// tradle.constants = { -// status: require('./lib/status'), -// topics: require('./lib/topics') -// } - -tradle.topics = require('./lib/topics') -tradle.protobuf = require('./lib/proto') -tradle.node = require('./lib/node') -tradle.partial = require('./lib/partial') - -tradle.typeforce = require('./lib/typeforce') -tradle.errors = require('./lib/errors') diff --git a/lib/actions.js b/lib/actions.js index 394f3d3..bf902c3 100644 --- a/lib/actions.js +++ b/lib/actions.js @@ -2,12 +2,11 @@ const EventEmitter = require('events').EventEmitter const debug = require('debug')('tradle:actions') -const protocol = require('@tradle/protocol') -const typeforce = require('./typeforce') +const typeforce = require('@tradle/typeforce') const statuses = require('./status') const SealStatus = statuses.seal const { TYPES, TYPE, SEQ } = require('./constants') -const { PARTIAL, MESSAGE } = TYPES +const { MESSAGE } = TYPES const types = require('./types') const topics = require('./topics') const utils = require('./utils') @@ -24,23 +23,81 @@ const WROTE_SEAL_COPY_PROPS = [ 'status' ] -// const WRITE_SEAL_ACTION_PROPS = [ -// 'basePubKey', -// 'link', -// 'prevLink', -// 'headerHash', -// 'prevHeaderHash', -// 'sealAddress', -// 'sealPrevAddress', -// 'blockchain', -// 'networkName', -// 'amount' -// ] - /** * @typedef {Object} Actions */ +const actionOpts = typeforce.compile({ + changes: types.changes, + node: typeforce.maybe(typeforce.Object) + // other env vars like networkName +}) + +const wroteSealData = typeforce.compile({ + link: typeforce.String, + sealAddress: typeforce.String, + blockchain: typeforce.String, + networkName: typeforce.String +}) + +const createWatchWatch = typeforce.compile({ + blockchain: typeforce.String, + networkName: typeforce.String, + address: typeforce.String, + link: typeforce.String, + headerHash: typeforce.String, + basePubKey: types.chainPubKey, + watchType: typeforce.String, + txId: typeforce.maybe(typeforce.String) +}) + +const wroteSealTx = typeforce.compile({ + txId: typeforce.String +}) + +const createObjectWrapper = typeforce.compile({ + object: types.signedObject, + link: typeforce.String, + author: typeforce.String, + permalink: typeforce.maybe(typeforce.String), + prevLink: typeforce.maybe(typeforce.String), + objectinfo: typeforce.maybe(typeforce.Object), + partialinfo: typeforce.maybe(typeforce.Object) +}) + +const writeSealData = typeforce.compile({ + link: typeforce.String, + headerHash: typeforce.String, + blockchain: typeforce.String, + networkName: typeforce.String, + basePubKey: types.chainPubKey, + sealPubKey: types.chainPubKey, + prevLink: typeforce.maybe(typeforce.String), + prevHeaderHash: typeforce.maybe(typeforce.String), + sealPrevPubKey: typeforce.maybe(types.chainPubKey), + sealAddress: typeforce.maybe(typeforce.String), + sealPrevAddress: typeforce.maybe(typeforce.String), + amount: typeforce.maybe(typeforce.Number) +}) + +const readSealData = typeforce.compile({ + blockchain: typeforce.String, + networkName: typeforce.String, + link: typeforce.maybe(typeforce.String), + prevLink: typeforce.maybe(typeforce.String), + headerHash: typeforce.maybe(typeforce.String), + prevHeaderHash: typeforce.maybe(typeforce.String), + basePubKey: types.chainPubKey, + txId: typeforce.String, + confirmations: typeforce.Number, + addresses: typeforce.arrayOf(typeforce.String), + // if we know sealAddress, we already know what version we're monitoring + sealAddress: typeforce.maybe(typeforce.String), + // if we only know sealPrevAddress, we've detected a seal for a version + // we do not yet possess + sealPrevAddress: typeforce.maybe(typeforce.String), +}) + /** * actions * @alias module:actions @@ -49,29 +106,17 @@ const WROTE_SEAL_COPY_PROPS = [ * @param {node} [opts.node] */ module.exports = function (opts) { - typeforce({ - changes: types.changes, - node: typeforce.maybe(typeforce.Object) - // other env vars like networkName - }, opts) + actionOpts.assert(opts) const node = opts.node const changes = opts.changes function wroteSeal (data, tx, cb) { - typeforce({ - link: typeforce.String, - sealAddress: typeforce.String, - blockchain: typeforce.String, - networkName: typeforce.String - }, data) - - typeforce({ - txId: typeforce.String - }, tx) + wroteSealData.assert(data) + wroteSealTx.assert(tx) if ((data.prevLink || data.sealPrevAddress) && !(data.prevLink && data.sealPrevAddress)) { - throw new Error('expected either both prevLink and sealPrevAddress or neither') + return cb(new Error('expected either both prevLink and sealPrevAddress or neither')) } const action = utils.pick(data, WROTE_SEAL_COPY_PROPS) @@ -82,8 +127,8 @@ module.exports = function (opts) { } function addContact (identity, link, cb) { - typeforce(types.identity, identity) - typeforce(typeforce.String, link) + types.identity.assert(identity) + typeforce.String.assert(link) const entry = utils.getLinks({ link, @@ -95,15 +140,7 @@ module.exports = function (opts) { } function createObject (wrapper, cb) { - typeforce({ - object: types.signedObject, - link: typeforce.String, - author: typeforce.String, - permalink: typeforce.maybe(typeforce.String), - prevLink: typeforce.maybe(typeforce.String), - objectinfo: typeforce.maybe(typeforce.Object), - partialinfo: typeforce.maybe(typeforce.Object) - }, wrapper) + createObjectWrapper.assert(wrapper) const entry = utils.pick(wrapper, 'link', 'permalink', 'prevLink', 'author', 'recipient', 'objectinfo', 'partialinfo') utils.addLinks(entry) @@ -112,7 +149,7 @@ module.exports = function (opts) { if (entry.type === MESSAGE) { entry.seq = wrapper.object[SEQ] entry.timestamp = wrapper.object._time - typeforce(typeforce.String, entry.recipient) + typeforce.String.assert(entry.recipient) if (!wrapper.received) { entry.sendstatus = statuses.send.pending } @@ -132,20 +169,8 @@ module.exports = function (opts) { } function writeSeal (data, cb) { - typeforce({ - link: typeforce.String, - headerHash: typeforce.String, - blockchain: typeforce.String, - networkName: typeforce.String, - basePubKey: types.chainPubKey, - sealPubKey: types.chainPubKey, - prevLink: typeforce.maybe(typeforce.String), - prevHeaderHash: typeforce.maybe(typeforce.String), - sealPrevPubKey: typeforce.maybe(types.chainPubKey), - sealAddress: typeforce.maybe(typeforce.String), - sealPrevAddress: typeforce.maybe(typeforce.String), - amount: typeforce.maybe(typeforce.Number) - }, data, true) + writeSealData.assert(data, true) + data.topic = topics.queueseal if (!data.sealAddress) { @@ -161,48 +186,19 @@ module.exports = function (opts) { } data.status = SealStatus.pending - // data.uid = getSealUID(data) data.write = true append(data, cb) } function createWatch (watch, cb) { - typeforce({ - blockchain: typeforce.String, - networkName: typeforce.String, - address: typeforce.String, - link: typeforce.String, - headerHash: typeforce.String, - basePubKey: types.chainPubKey, - watchType: typeforce.String, - txId: typeforce.maybe(typeforce.String) - }, watch, true) + createWatchWatch.assert(watch, true) watch.topic = topics.newwatch append(watch, cb) } - // function saveTx (txInfo, cb) { - // typeforce({ - // txId: typeforce.String, - // txHex: typeforce.String, - // tx: typeforce.Object, - // from: typeforce.Object, - // to: typeforce.Object, - // confirmations: typeforce.Number, - // }, txInfo) - - // append({ - // topic: topics.tx, - // txHex: txInfo.txHex, - // from: txInfo.from, - // to: txInfo.to, - // confirmations: txInfo.confirmations, - // }, cb) - // } - function sentMessage (link, cb) { - typeforce(typeforce.String, link) + typeforce.String.assert(link) append({ topic: topics.sent, @@ -212,7 +208,7 @@ module.exports = function (opts) { } function abortMessage (link, cb) { - typeforce(typeforce.String, link) + typeforce.String.assert(link) append({ topic: topics.sendaborted, @@ -222,23 +218,7 @@ module.exports = function (opts) { } function readSeal (data, cb) { - typeforce({ - blockchain: typeforce.String, - networkName: typeforce.String, - link: typeforce.maybe(typeforce.String), - prevLink: typeforce.maybe(typeforce.String), - headerHash: typeforce.maybe(typeforce.String), - prevHeaderHash: typeforce.maybe(typeforce.String), - basePubKey: types.chainPubKey, - txId: typeforce.String, - confirmations: typeforce.Number, - addresses: typeforce.arrayOf(typeforce.String), - // if we know sealAddress, we already know what version we're monitoring - sealAddress: typeforce.maybe(typeforce.String), - // if we only know sealPrevAddress, we've detected a seal for a version - // we do not yet possess - sealPrevAddress: typeforce.maybe(typeforce.String), - }, data, true) + readSealData.assert(data, true) if (!(data.sealAddress || data.sealPrevAddress)) { throw new Error('expected "sealAddress" or "sealPrevAddress"') @@ -248,7 +228,6 @@ module.exports = function (opts) { throw new Error('expected "headerHash" or "prevHeaderHash"') } - // data.confirmed = data.confirmations >= node.confirmedAfter data.topic = topics.readseal append(data, cb) } @@ -270,7 +249,7 @@ module.exports = function (opts) { function append (entry, cb) { cb = cb || noop - typeforce(typeforce.String, entry.topic) + typeforce.String.assert(entry.topic) entry.timestamp = entry.timestamp || utils.now() changes.append(entry, function (err) { @@ -295,7 +274,6 @@ module.exports = function (opts) { createObject, writeSeal, createWatch, - // saveTx, readSeal, forgetObject, rememberObject diff --git a/lib/channel.js b/lib/channel.js index 90a9112..91840c0 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -11,7 +11,6 @@ const through = require('through2') const createRetryStream = require('./retrystream') const utils = require('./utils') const constants = require('./constants') -const errors = require('./errors') module.exports.DEFAULT_BACKOFF_OPTS = constants.DEFAULT_BACKOFF_OPTS @@ -28,8 +27,6 @@ module.exports = Channel * @param {Object} [opts.backoffOptions] */ function Channel (opts) { - // const addressBook = opts.addressBook - // this._debugId = op EventEmitter.call(this) this.opts = opts this.createBackoff = function () { @@ -88,7 +85,6 @@ Channel.prototype.start = function () { this.started = true const opts = this.opts - const addressBook = opts.addressBook const objects = opts.objects const send = opts.send const actions = opts.actions @@ -102,11 +98,6 @@ Channel.prototype.start = function () { this.emit('error', err) } }) - // // switch to old mode to keep stream flowing - // // otherwise it stops when it hits highWaterMark - // .on('data', data => { - // self._debug('sent ' + describe(data.input)) - // }) this.stream = pump( objects.unsentTo(this.recipient.permalink, { live: true, keys: false, body: false }), @@ -129,8 +120,6 @@ Channel.prototype.start = function () { }) ) - // this.stream.resume() - // TODO: setRecipient again if their identity changes function worker (data, cb) { if (self._destroyed) return cb(new Error('not running')) diff --git a/lib/constants.js b/lib/constants.js index cc7c094..2675414 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -1,46 +1,23 @@ +const constants = require('@tradle/constants') /** * @module constants - * @augments tradle/protocol/lib/constants + * @augments tradle/constants */ - -const extend = require('lodash/extend') -const constants = require('@tradle/constants') -const { TYPES } = constants - -const merged = extend({ +module.exports = Object.freeze({ + ...constants, /** - * @constant - * @type {string} - * @default + * @deprecated Use TYPES.MESSAGE */ - MESSAGE_TYPE: 'tradle.Message', - /** - * @constant - * @type {string} - * @default - */ - PREV_TO_SENDER: '_q', - /** - * @constant - * @type {string} - * @default - */ - SEQ: '_n', + MESSAGE_TYPE: constants.TYPES.MESSAGE, /** * @constant * @type {Object} * @default */ - IDENTITY_VERSIONING_KEY: { + IDENTITY_VERSIONING_KEY: Object.freeze({ purpose: 'update' - }, - /** - * @constant - * @type {Object} - * @default - */ - TYPES, + }), /** * @constant * @type {string} @@ -52,27 +29,17 @@ const merged = extend({ * @type {Object} * @default */ - watchType: { + watchType: Object.freeze({ thisVersion: 't', nextVersion: 'n' - }, + }), /** * @constant * @type {Object} * @default */ - DEFAULT_BACKOFF_OPTS: { + DEFAULT_BACKOFF_OPTS: Object.freeze({ initialDelay: 1000, maxDelay: 60000 - }, - - ENTRY_PROP: '_' -}, constants) - -merged.TYPES = extend({ - MESSAGE: 'tradle.Message', - IDENTITY: 'tradle.Identity', - PARTIAL: 'tradle.Partial' -}, merged.TYPES) - -module.exports = merged + }) +}) diff --git a/lib/controls.js b/lib/controls.js index fa130a2..c569e73 100644 --- a/lib/controls.js +++ b/lib/controls.js @@ -3,84 +3,97 @@ */ const EventEmitter = require('events').EventEmitter -const typeforce = require('./typeforce') +const typeforce = require('@tradle/typeforce') const { - assert, - extend + assert } = require('./utils') -// const noop = () => {} + +const controlOpts = typeforce.object({ + start: typeforce.Function, + pause: typeforce.maybe(typeforce.Function) +}) /** - * start/stop/pause/resume controls - * @alias: module controls - * @typedef {controls} - * @param {function} start - * @param {function} [pause] + * Start/stop/pause/resume controls with events. + * + * @param {Object} opts - specify how the controls work + * @param {Function} opts.start - template that starts the process, needs to return the stop function template + * @param {Function} [opts.pause] - template to pause the process, needs to return the resume function + * @returns {EventEmitter} An extended event emitter having a stop/start/pause/resume property */ module.exports = function controls (opts) { - typeforce({ - start: typeforce.Function, - pause: typeforce.maybe(typeforce.Function) - }, opts) + controlOpts.assert(opts) - let _start = opts.start - let _pause = opts.pause - let _stop - let _resume const ee = new EventEmitter() - - function start () { - if (_stop) return - - _stop = _start.apply(this, arguments) - typeforce(typeforce.Function, _stop) - ee.emit('start') - } - - function stop () { - if (!_stop) return // already stopped - - // prevent race condition - const tmp = _stop - _stop = null - _resume = function () { - assert(false, 'can\'t resume when stopped, only when paused') - } - - tmp.apply(this, arguments) - ee.emit('stop') + const stopped = { + start (scope, args) { + state = makeStarted(opts.start.apply(scope, args)) + scope.emit('start') + }, + stop () {}, + pause () { + throw new Error('can\'t pause while stopped, only when started') + }, + resume () { + throw new Error('can\'t resume while stopped, only when paused') + }, + isRunning: false } - function pause () { - if (_resume) return // already resumed + let state = stopped - assert(isRunning(), 'can\'t pause before start') - assert(_pause, 'no "pause" function provided') - - _resume = _pause.apply(this, arguments) - typeforce(typeforce.Function, _resume) - ee.emit('pause') - } + return Object.assign(ee, { + start () { + return state.start(this, arguments) + }, + stop () { + return state.stop(this, arguments) + }, + pause () { + return state.pause(this, arguments) + }, + resume () { + // Resume needs to work without arguments! + return state.resume(this) + }, + isRunning: () => state.isRunning + }) - function resume () { - if (!_resume) return + function makeStarted (stop) { // eslint-disable-line func-style + typeforce.Function.assert(stop) + return { + start () {}, + stop (scope, args) { + state = stopped + stop.apply(scope, args) // eslint-disable-line no-invalid-this + scope.emit('stop') + }, + pause (scope, args) { + assert(opts.pause, 'no "pause" function provided') - // prevent race condition - const tmp = _resume - _resume = null - tmp.apply(this, arguments) - ee.emit('resume') + state = makePaused(state, opts.pause.apply(scope, args)) // eslint-disable-line no-invalid-this + scope.emit('pause') + }, + resume () {}, + isRunning: true + } } - function isRunning () { - return !!(_stop && !_resume) + function makePaused (started, resume) { // eslint-disable-line func-style + typeforce.Function.assert(resume) + return { + start () {}, + stop (scope, args) { + state.resume(scope) + state.stop(scope, args) + }, + pause () {}, + resume (scope) { + resume.call(scope) // eslint-disable-line no-invalid-this + state = started + scope.emit('resume') + }, + isRunning: false + } } - - return extend(ee, { - start, - stop, - pause, - resume, - isRunning - }) } diff --git a/lib/dbs/addressBook.js b/lib/dbs/addressBook.js index 932d29d..88ab505 100644 --- a/lib/dbs/addressBook.js +++ b/lib/dbs/addressBook.js @@ -2,25 +2,22 @@ const EventEmitter = require('events').EventEmitter const async = require('async') -const pump = require('pump') -const typeforce = require('../typeforce') -const through = require('through2') -const subdown = require('subleveldown') +const typeforce = require('@tradle/typeforce') const debug = require('debug')('tradle:addressBook') const indexer = require('feed-indexer') -const protocol = require('@tradle/protocol') -// const LiveStream = require('level-live-stream') -const constants = require('../constants') -const PERMALINK = constants.PERMALINK -const LINK = constants.LINK -const PREVLINK = constants.PREVLINK const utils = require('../utils') const topics = require('../topics') const types = require('../types') const Errors = require('../errors') const TEST = process.env.NODE_ENV === 'test' -const IDENTITY_TYPE = constants.TYPES.IDENTITY -const LINK_PREFIX = 'c!' + +const addressBookOpts = typeforce.object({ + changes: types.changes, + db: types.db, + keeper: types.keeper, + // identityInfo: types.identityInfo, + name: typeforce.maybe(typeforce.String) +}) /** * @typedef {Object} AddressBook @@ -43,13 +40,7 @@ const LINK_PREFIX = 'c!' * @return {AddressBook} */ module.exports = function createAddressBook (opts) { - typeforce({ - changes: types.changes, - db: types.db, - keeper: types.keeper, - // identityInfo: types.identityInfo, - name: typeforce.maybe(typeforce.String) - }, opts) + addressBookOpts.assert(opts) let cache let closed @@ -190,10 +181,6 @@ module.exports = function createAddressBook (opts) { }) } - function close () { - closed = true - } - function uncacheIdentity (identityInfo) { updateCache(identityInfo, true) } @@ -207,10 +194,7 @@ module.exports = function createAddressBook (opts) { updateCacheBy('permalink', identityInfo.permalink, identityInfo, remove) updateCacheBy('link', identityInfo.link, identityInfo, remove) - // const prevlink = identityInfo.object[PREVLINK] - // if (prevlink) { - // updateCacheBy('prevlink', identityInfo.link, identityInfo, remove) - // } + let newPubkeys = identityInfo.object.pubkeys.filter(key => !key.importedFrom) newPubkeys.forEach(pubKey => { updateCacheBy('pub', pubKey.pub, identityInfo, remove) @@ -242,17 +226,7 @@ module.exports = function createAddressBook (opts) { byPubKey: function (val, cb) { findOneByProp('pub', utils.pubKeyString(val), cb) }, - // byPubKey: function (pubKey) { - // findOneByProp('pub', pubKey, function () { - // console.log(arguments) - // }) - // }, byLink: findOneByProp.bind(null, 'link'), - // byLink: function (link) { - // findOneByProp('link', link, function () { - // console.log(arguments) - // }) - // }, byPermalink: findOneByProp.bind(null, 'permalink'), createReadStream: function (opts) { opts = opts || {} diff --git a/lib/dbs/index.js b/lib/dbs/index.js new file mode 100644 index 0000000..d670ff2 --- /dev/null +++ b/lib/dbs/index.js @@ -0,0 +1,8 @@ +module.exports = { + objects: require('./objects.js'), + seals: require('./seals.js'), + watches: require('./watches.js'), + addressBook: require('./addressBook.js'), + simpleCustom: require('./simpleCustom.js'), + msgMeta: require('./msgMeta.js'), +} diff --git a/lib/dbs/msgMeta.js b/lib/dbs/msgMeta.js index 1d6c645..e17bedb 100644 --- a/lib/dbs/msgMeta.js +++ b/lib/dbs/msgMeta.js @@ -1,17 +1,17 @@ /** @module msgMetaDB */ -const EventEmitter = require('events').EventEmitter -const pump = require('pump') -const through = require('through2') -const indexer = require('feed-indexer') -const typeforce = require('../typeforce') +const typeforce = require('@tradle/typeforce') const topics = require('../topics') -const types = require('../types') const utils = require('../utils') const constants = require('../constants') -const TYPE = constants.TYPE const MESSAGE_TYPE = constants.MESSAGE_TYPE -const ENTRY_PROP = constants.ENTRY_PROP + +const createMsgMetaDbOpts = typeforce.object({ + node: typeforce.Object, + db: typeforce.String, + props: typeforce.Array, + getProps: typeforce.maybe(typeforce.Function) +}) /** * @typedef {Object} msgMetaDB @@ -27,12 +27,7 @@ const ENTRY_PROP = constants.ENTRY_PROP * @param {Object} opts.db database to use to track message context */ module.exports = function createMsgMetaDB (opts) { - typeforce({ - node: typeforce.Object, - db: typeforce.String, - props: typeforce.Array, - getProps: typeforce.maybe(typeforce.Function) - }, opts) + createMsgMetaDbOpts.assert(opts) const { node, props, getProps=pickProps } = opts const customIndexOpts = utils.extend({ preprocess, getProps }, opts) diff --git a/lib/dbs/objects.js b/lib/dbs/objects.js index 7cc9b29..f734a2a 100644 --- a/lib/dbs/objects.js +++ b/lib/dbs/objects.js @@ -2,11 +2,9 @@ const EventEmitter = require('events').EventEmitter const collect = require('stream-collector') -const async = require('async') const pump = require('pump') const through = require('through2') -const typeforce = require('../typeforce') -const subdown = require('subleveldown') +const typeforce = require('@tradle/typeforce') const debug = require('debug')('tradle:db:objects') const indexer = require('feed-indexer') const Readable = require('readable-stream').Readable @@ -18,16 +16,47 @@ const SealStatus = Status.seal const SendStatus = Status.send const topics = require('../topics') const types = require('../types') -const IDENTITY = constants.TYPES.IDENTITY const MESSAGE_TYPE = constants.TYPES.MESSAGE -const LINK = constants.LINK const SEQ = constants.SEQ const PREV_TO_SENDER = constants.PREV_TO_SENDER -const PERMALINK = constants.PERMALINK -const PREVLINK = constants.PREVLINK -const SEPARATOR = constants.INDEX_SEPARATOR const ENTRY_PROP = constants.ENTRY_PROP +const conversationOpts = typeforce.object({ + with: typeforce.maybe(typeforce.String), + body: typeforce.maybe(typeforce.Boolean), + a: typeforce.maybe(typeforce.String), + b: typeforce.maybe(typeforce.String) +}) + +const createObjectDbOpts = typeforce.object({ + db: types.db, + keeper: types.keeper, + changes: types.changes, + identityInfo: types.identityInfo +}) + +const getBySeqOpts = typeforce.object({ + from: typeforce.String, + to: typeforce.String, + seq: typeforce.Number +}) + +const seqOpts = typeforce.object({ + from: typeforce.String, + tip: typeforce.maybe(typeforce.Number), + gt: typeforce.maybe(typeforce.Number), + gte: typeforce.maybe(typeforce.Number) +}) + +const nextMessageMetadataOpts = typeforce.object({ + with: typeforce.String +}) + +const messagesWithObjectOpts = typeforce.object({ + permalink: typeforce.String, + link: typeforce.maybe(typeforce.String) +}) + // messages shouldn't be stored differently form // other objects. This will create annoying asymmetry for message/object seals @@ -47,12 +76,7 @@ module.exports = exports = createObjectDB * @return {Object} */ function createObjectDB (opts) { - typeforce({ - db: types.db, - keeper: types.keeper, - changes: types.changes, - identityInfo: types.identityInfo - }, opts) + createObjectDbOpts.assert(opts) let closed const { db } = opts @@ -68,7 +92,6 @@ function createObjectDB (opts) { topics.unarchiveobj, topics.sent, topics.sendaborted, - // topics.received, topics.queueseal, topics.readseal, topics.wroteseal @@ -109,9 +132,9 @@ function createObjectDB (opts) { } case topics.archiveobj: case topics.unarchiveobj: { -         newState = state ? utils.clone(state) : utils.pick(changeVal, 'link') -         const archiving = newState.archived = topic === topics.archiveobj -         myDebug(`${archiving ? '': 'un'}archiving object: ${newState.link}`) + newState = state ? utils.clone(state) : utils.pick(changeVal, 'link') + const archiving = newState.archived = topic === topics.archiveobj + myDebug(`${archiving ? '': 'un'}archiving object: ${newState.link}`) break } default: { @@ -133,8 +156,6 @@ function createObjectDB (opts) { 'sendstatus', 'watchstatus', 'confirmations', - // 'archived', - /*'type',*/ 'link', 'prevLink', 'permalink', @@ -191,22 +212,6 @@ function createObjectDB (opts) { } }) - // indexes.gap = indexedDB.by('gap', function (state, change, oldState) { - // if (state.type === MESSAGE_TYPE) { - // // only one value per recipient - // if (change.value.topic === topics.newobj) { - // const oldSeq = oldState ? parseSeq(oldState.seq) : -1 - // const newSeq = state.seq - // console.log(oldSeq, newSeq) - // if (newSeq === oldSeq + 1) { - // return state.author + sep + state.recipient + sep + hexint(state.seq) - // } - // - // console.log("GAP starts at", oldSeq) - // } - // } - // }) - indexes.messagesWithObject = indexedDB.by('messagesWithObject', function (state) { if (state.type === MESSAGE_TYPE) { return state.objectinfo.permalink + sep + state.objectinfo.link + sep + state.permalink @@ -270,8 +275,6 @@ function createObjectDB (opts) { case topics.readseal: // only emit for new seals if (!oldState || oldState.confirmations == null) return 'readseal' - // case topics.received: - // return 'message' } } @@ -299,10 +302,6 @@ function createObjectDB (opts) { createReadStream.call(index, opts) ] - // if (opts.excludeArchived !== false) { - // pipeline.push(filterArchived(opts)) - // } - if (!opts.archived) { pipeline.push(utils.filterStream(notArchived)) } @@ -315,14 +314,6 @@ function createObjectDB (opts) { } }) - // indexedProps.concat('latest', 'type').forEach(prop => { - // indexAPIs[prop] = { - // find: indexes[prop].find, - // findOne: indexes[prop].findOne, - // createReadStream: - // } - // }) - emitter.findOne = function (prop, val, cb) { findOneByProp(prop, val, cb) } @@ -367,12 +358,6 @@ function createObjectDB (opts) { ) } - function wrapStream (stream, opts) { - if (opts.archived) return stream - - return stream.pipe(utils.filterStream(notArchived)) - } - function notArchived (data) { return !data.archived } @@ -388,15 +373,6 @@ function createObjectDB (opts) { } } - function maybeAddBody (stream, opts) { - const pipeline = [ stream ] - if (opts.body !== false) { - pipeline.push(addBodyTransform(opts)) - } - - return executePipeline(pipeline) - } - function lastMessage (opts, cb) { if (!utils.xor(opts.from, opts.to)) { throw new Error('expected "from" or "to" but not both') @@ -429,7 +405,7 @@ function createObjectDB (opts) { function parseSeq (seqIndexVal) { const hex = seqIndexVal.slice(seqIndexVal.lastIndexOf(sep) + sep.length) - return lexint.unpack([].slice.call(new Buffer(hex, 'hex'))) + return lexint.unpack([].slice.call(Buffer.from(hex, 'hex'))) } const streamBySendStatus = opts => pump( @@ -459,15 +435,9 @@ function createObjectDB (opts) { addBody(info, cb) }, opts)) }, - // get: function (link, cb) { - // indexedDB.get(link, checkNotArchived(cb)) - // }, byPermalink: function byPermalink (permalink, cb) { findOneByProp('latest', permalink, cb) }, - // byPermalink: function (permalink, cb) { - // indexes.latest.findOne(permalink, checkNotArchived(cb)) - // }, unsent: function (opts) { opts = opts || {} opts.eq = SendStatus.pending @@ -493,7 +463,6 @@ function createObjectDB (opts) { messages: function (opts) { return byType(MESSAGE_TYPE, opts) }, - // messages: list.bind(null, MESSAGE_TYPE), from: from, to: to, lastMessage: lastMessage, @@ -502,12 +471,7 @@ function createObjectDB (opts) { indexedDB.get(link, wrapCallback(err => cb(!err))) }, conversation: function conversation (opts) { - typeforce({ - with: typeforce.maybe(typeforce.String), - body: typeforce.maybe(typeforce.Boolean), - a: typeforce.maybe(typeforce.String), - b: typeforce.maybe(typeforce.String) - }, opts) + conversationOpts.assert(opts) if (!(opts.b || opts.with)) { throw new Error('expected "with" or "b"') @@ -529,11 +493,7 @@ function createObjectDB (opts) { return executePipeline(pipeline) }, getBySeq: function (opts, cb) { - typeforce({ - from: typeforce.String, - to: typeforce.String, - seq: typeforce.Number - }, opts) + getBySeqOpts.assert(opts) const { from, to, seq, body } = opts const base = from + sep + to + sep @@ -556,18 +516,10 @@ function createObjectDB (opts) { if (!results.length) return cb(utils.notFoundErr()) cb(null, results[0]) }) - - // hacky - // db.get(['d', '!x', 'seq', from, to, hexint(seq)].join(sep), cb) }, bySeq: streamBySeq, seq: function (opts, cb) { - typeforce({ - from: typeforce.String, - tip: typeforce.maybe(typeforce.Number), - gt: typeforce.maybe(typeforce.Number), - gte: typeforce.maybe(typeforce.Number) - }, opts) + seqOpts.assert(opts) const base = opts.from + sep + me.permalink + sep const offset = getSeqOffset(opts) @@ -629,9 +581,7 @@ function createObjectDB (opts) { } }, nextMessageMetadata: function (opts, cb) { - typeforce({ - with: typeforce.String, - }, opts) + nextMessageMetadataOpts.assert(opts) lastMessage({ to: opts.with, @@ -646,10 +596,7 @@ function createObjectDB (opts) { }) }, messagesWithObject: function (opts) { - typeforce({ - permalink: typeforce.String, - link: typeforce.maybe(typeforce.String) - }, opts) + messagesWithObjectOpts.assert(opts) let query = opts.permalink if (opts.link) query += sep + opts.link @@ -662,18 +609,6 @@ function createObjectDB (opts) { return indexes.messagesWithObject.createReadStream(indexStreamOpts) }, addBody: addBody - // nextMessageSeq: function (opts, cb) { - // typeforce({ - // with: typeforce.String, - // }, opts) - - // lastMessage({ - // to: opts.with - // }, function (err, msg) { - // const seq = err ? 0 : (msg.object[SEQ] || 0) + 1 - // cb(null, seq) - // }) - // } }) } diff --git a/lib/dbs/seals.js b/lib/dbs/seals.js index 0f907b0..1c82aad 100644 --- a/lib/dbs/seals.js +++ b/lib/dbs/seals.js @@ -1,13 +1,18 @@ /** @module sealsDB */ const EventEmitter = require('events').EventEmitter -const typeforce = require('../typeforce') +const typeforce = require('@tradle/typeforce') const indexer = require('feed-indexer') const topics = require('../topics') const statuses = require('../status') const SealStatus = statuses.seal const types = require('../types') -// const reducer = require('../reducers').seal + +const createSealsDbOpts = typeforce.object({ + changes: types.changes, + db: types.db, + confirmedAfter: typeforce.Number +}) /** * @typedef {Object} sealsDB @@ -22,14 +27,9 @@ const types = require('../types') * @param {Object} opts.db database to use to track seals */ module.exports = function createSealsDB (opts) { - typeforce({ - changes: types.changes, - db: types.db, - confirmedAfter: typeforce.Number - }, opts) + createSealsDbOpts.assert(opts) const { - syncInterval=10 * 60000, // 10 mins confirmedAfter } = opts @@ -74,39 +74,6 @@ module.exports = function createSealsDB (opts) { } }) - // function worker (change, cb) { - // const val = change.value - // if (relevantTopics.indexOf(val.topic) === -1) return cb() - - // const link = val.link - // // live === false, because otherwise we'll get a deadlock - // indexed.search('link', link, { live: false }, function (err, seals) { - // if (seals.length > 1) { - // throw new Error('found multiple seals for link: ' + link) - // } - - // const state = seals[0] - // if (!state) val.uid = utils.uuid() - - // const newState = reducer(state, val) - // const batch = indexed.batchForChange(state, newState) - // saveAndEmit(batch, newState, val, cb) - // }) - // } - - // TODO: generalize - // this code is currently repeated in all dbs - // function saveAndEmit (batch, newState, changeVal, cb) { - // db.batch(batch, function (err) { - // if (err) return cb(err) - - // cb() - - // let event = getEvent(changeVal) - // if (event) emitter.emit(event, newState) - // }) - // } - function calcPrimaryKey (change) { // sealPrevAddress takes priority // that way if sealAddress is not known initially, @@ -115,7 +82,6 @@ module.exports = function createSealsDB (opts) { if (!primaryKey) throw new Error('unable to derive seal primaryKey') return primaryKey - // return data.link + ':' + data.sealAddress } function getEvent (change, oldState) { @@ -133,7 +99,6 @@ module.exports = function createSealsDB (opts) { emitter.get = indexedDB.get - // emitter.search = indexed.search.bind(indexed) emitter.findOne = function (prop, val, cb) { indexes[prop].findOne(val, cb) } @@ -154,7 +119,3 @@ module.exports = function createSealsDB (opts) { return emitter } - -// function logErr (err) { -// if (err) debug(err) -// } diff --git a/lib/dbs/simpleCustom.js b/lib/dbs/simpleCustom.js index 1fc27a1..05bd66c 100644 --- a/lib/dbs/simpleCustom.js +++ b/lib/dbs/simpleCustom.js @@ -1,18 +1,25 @@ /** @module simpleCustomDB */ -const EventEmitter = require('events').EventEmitter const pump = require('pump') const through = require('through2') const indexer = require('feed-indexer') -const typeforce = require('../typeforce') -const topics = require('../topics') +const typeforce = require('@tradle/typeforce') const types = require('../types') const utils = require('../utils') const constants = require('../constants') -const TYPE = constants.TYPE -const MESSAGE_TYPE = constants.MESSAGE_TYPE const ENTRY_PROP = constants.ENTRY_PROP +const simpleCustomDBOpts = typeforce.object({ + changes: types.changes, + keeper: types.keeper, + db: types.db, + props: typeforce.Array, + getProps: typeforce.maybe(typeforce.Function), + preprocess: typeforce.maybe(typeforce.Function), + needBody: typeforce.maybe(typeforce.Boolean), + primaryKey: typeforce.maybe(typeforce.String) +}) + /** * @typedef {Object} simpleCustomDB */ @@ -27,16 +34,7 @@ const ENTRY_PROP = constants.ENTRY_PROP * @param {Object} opts.db database to use to track message context */ module.exports = function simpleCustomDB (opts) { - typeforce({ - changes: types.changes, - keeper: types.keeper, - db: types.db, - props: typeforce.Array, - getProps: typeforce.maybe(typeforce.Function), - preprocess: typeforce.maybe(typeforce.Function), - needBody: typeforce.maybe(typeforce.Boolean), - primaryKey: typeforce.maybe(typeforce.String) - }, opts) + simpleCustomDBOpts.assert(opts) const { keeper, diff --git a/lib/dbs/watches.js b/lib/dbs/watches.js index fc05329..349fabb 100644 --- a/lib/dbs/watches.js +++ b/lib/dbs/watches.js @@ -3,14 +3,22 @@ */ const collect = require('stream-collector') -const typeforce = require('../typeforce') -const subdown = require('subleveldown') +const typeforce = require('@tradle/typeforce') const debug = require('debug')('tradle:db:watches') const indexer = require('feed-indexer') -const utils = require('../utils') const topics = require('../topics') const types = require('../types') -const statuses = require('../status') + +const createWatchesDBOpts = typeforce.object({ + changes: types.changes, + db: types.db, + confirmedAfter: typeforce.maybe(typeforce.Number) +}) + +const getOpts = typeforce.object({ + address: typeforce.String, + headerHash: typeforce.String +}) /** * @typedef {Object} watchesDB @@ -25,17 +33,12 @@ const statuses = require('../status') * @param {Number} opts.confirmedAfter how many confirmations to wait for before the watch is complete */ module.exports = function createWatchesDB (opts) { - typeforce({ - changes: types.changes, - db: types.db, - confirmedAfter: typeforce.maybe(typeforce.Number) - }, opts) + createWatchesDBOpts.assert(opts) const confirmedAfter = opts.confirmedAfter const relevantTopics = [ topics.newwatch, - topics.readseal, - // topics.newobj + topics.readseal ] let closed @@ -59,18 +62,6 @@ module.exports = function createWatchesDB (opts) { cb(null, indexedDB.merge(state, change)) } } - - // custom: function (change, cb) { - // if (change.confirmations > 10) { - - // } - // }, - // reduce: function (state, change, cb) { - // const newState = indexedDB.merge(state, change) - // // console.log('state', state) - // // console.log('change', change) - // cb(null, newState) - // } }) const indexedProps = ['address', 'link', 'watchType', 'confirmations', 'blockHeight'] @@ -110,10 +101,7 @@ module.exports = function createWatchesDB (opts) { * @param {Function} cb */ ee.get = function (opts, cb) { - typeforce({ - address: typeforce.String, - headerHash: typeforce.String - }, opts) + getOpts.assert(opts) const pKey = calcPrimaryKey(opts) indexedDB.get(pKey, cb) @@ -184,7 +172,7 @@ module.exports = function createWatchesDB (opts) { ] } - typeforce(typeforce.arrayOf(typeforce.String), parts) + typeforce.arrayOf(typeforce.String).assert(parts) return parts.join(indexedDB.separator) } } diff --git a/lib/errors.js b/lib/errors.js index 3049e68..75a1f3b 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -3,8 +3,6 @@ */ const TypedError = require('error/typed') -const constants = require('./constants') -const LINK = constants.LINK exports.ObjectExists = TypedError({ type: 'exists', diff --git a/lib/manifest.js b/lib/manifest.js index 176f86c..4ec1e94 100644 --- a/lib/manifest.js +++ b/lib/manifest.js @@ -30,7 +30,7 @@ exports.node = { exports.objects = { get : {type: 'async'}, list : {type: 'async'}, - createReadStream : {type:'readable'}, + createReadStream : {type: 'readable'}, type : {type: 'readable'}, sealed : {type: 'readable'}, unsealed : {type: 'readable'}, diff --git a/lib/node.js b/lib/node.js index 1fd28d2..98f700b 100644 --- a/lib/node.js +++ b/lib/node.js @@ -4,18 +4,14 @@ const util = require('util') const EventEmitter = require('events').EventEmitter const path = require('path') const reemit = require('re-emitter') -const map = require('map-stream') const mutexify = require('mutexify') -// const trackchain = require('chain-tracker') const async = require('async') const debug = require('debug')('tradle:node') const protocol = require('@tradle/protocol') -const changesFeed = require('changes-feed') +const changesFeed = require('@tradle/changes-feed') const collect = require('stream-collector') const deepEqual = require('deep-equal') -// const subdown = require('subleveldown') -const tradle = require('../') -const typeforce = require('./typeforce') +const typeforce = require('@tradle/typeforce') const createActions = require('./actions') const symbols = require('./symbols') const errors = require('./errors') @@ -39,26 +35,103 @@ const { VERSION, } = constants -const { PARTIAL } = TYPES -const utils = tradle.utils -const createDB = tradle.dbs -const createSealWatcher = tradle.sealwatch -const createSealer = tradle.sealer -const createSender = tradle.sender -const topics = tradle.constants.topics -const createLiveQueue = tradle.queue -// const Status = tradle.constants.status -const types = tradle.types -// const MAX_CONFIRMATIONS = 10 +const utils = require('./utils.js') +const createDB = require('./dbs/index.js') +const createSealWatcher = require('./sealwatch.js') +const createSealer = require('./sealer.js') +const createSender = require('./sender.js') +const types = require('./types.js') const noop = function () {} -const asyncNoop = function (cb) { - process.nextTick(() => cb()) -} /** * @typedef {Object} node */ +const tradleOpts = typeforce.object({ + dir: typeforce.String, + network: typeforce.maybe(types.blockchainAdapter), + getBlockchainAdapter: typeforce.maybe(typeforce.Function), + identity: types.identity, + keeper: types.keeper, + keys: typeforce.Array, + leveldown: types.leveldown, + syncInterval: typeforce.maybe(typeforce.Number), + confirmedAfter: typeforce.maybe(typeforce.Number), + name: typeforce.maybe(typeforce.String), + lockTimeout: typeforce.maybe(typeforce.Number), + autoStart: typeforce.maybe(typeforce.Boolean) +}) + +const setIdentityOpts = typeforce.object({ + keys: typeforce.Array, + identity: types.identity, + link: typeforce.maybe(typeforce.String) +}) + +const updateIdentityOpts = typeforce.object({ + keys: typeforce.Array, + identity: types.identity +}) + +const saveObjectWrapper = typeforce.object({ + object: types.signedObject, + author: typeforce.maybe(typeforce.String) +}) + +const sendOpts = typeforce.object({ + to: types.identifier, + object: typeforce.maybe(types.signedObject), + link: typeforce.maybe(typeforce.String), + other: typeforce.maybe(typeforce.Object), + seal: typeforce.maybe(typeforce.Boolean), + time: typeforce.maybe(typeforce.Number), +}) + +const sealOpts = typeforce.object({ + object: types.signedObject, + basePubKey: typeforce.maybe(types.chainPubKey), + network: typeforce.maybe(types.blockchainAdapter), + amount: typeforce.maybe(typeforce.Number) +}) + +const watchNextVersionOpts = typeforce.object({ + chain: types.blockchainIdentifier, + link: typeforce.maybe(typeforce.String), + object: typeforce.maybe(typeforce.Object), + headerHash: typeforce.maybe(typeforce.String), + basePubKey: types.chainPubKey +}) + +const watchSealOpts = typeforce.object({ + chain: types.blockchainIdentifier, + basePubKey: types.chainPubKey, + link: typeforce.maybe(typeforce.String), + object: typeforce.maybe(typeforce.Object), + headerHash: typeforce.maybe(typeforce.String), + txId: typeforce.maybe(typeforce.String) +}) + +const _watchOpts = typeforce.object({ + chain: types.blockchainIdentifier, + link: typeforce.String, + headerHash: typeforce.String, + basePubKey: types.chainPubKey, + watchType: typeforce.String, + address: typeforce.maybe(typeforce.String), + txId: typeforce.maybe(typeforce.String), +}) + +const abortMessagesMessages = typeforce.arrayOf( + typeforce.object({ + link: typeforce.String, + to: typeforce.String + }) +) + +const abortUnsentOpts = typeforce.object({ + to: typeforce.String +}) + /** * main API to tradle engine * @@ -88,24 +161,7 @@ function Tradle (opts) { const self = this if (!(this instanceof Tradle)) return new Tradle (opts) - typeforce({ - dir: typeforce.String, - network: typeforce.maybe(types.blockchainAdapter), - getBlockchainAdapter: typeforce.maybe(typeforce.Function), - identity: types.identity, - keeper: types.keeper, - keys: typeforce.Array, - leveldown: types.leveldown, - syncInterval: typeforce.maybe(typeforce.Number), - confirmedAfter: typeforce.maybe(typeforce.Number), - name: typeforce.maybe(typeforce.String), - lockTimeout: typeforce.maybe(typeforce.Number), - autoStart: typeforce.maybe(typeforce.Boolean) - // merkle: typeforce.maybe(typeforce.compile({ - // leaf: typeforce.Function, - // parent: typeforce.Function - // }), opts.merkle) - }, opts) + tradleOpts.asserts(opts) if (!(this.network || this.getBlockchainAdapter)) { throw new Error('expected either "network" or "getBlockchainAdapter"') @@ -136,7 +192,6 @@ function Tradle (opts) { this.objects = createDB.objects({ name: this.name, changes: changes, - // db: subdown(ldb, 'o'), db: this.dbs.objects, keeper: this.keeper, identityInfo: this.identityInfo @@ -144,7 +199,6 @@ function Tradle (opts) { this.seals = createDB.seals({ changes: changes, - // db: subdown(ldb, 's'), db: this.dbs.seals, keeper: this.keeper, confirmedAfter: this.confirmedAfter @@ -154,21 +208,13 @@ function Tradle (opts) { changes: changes, db: this.dbs.watches, confirmedAfter: this.confirmedAfter - // db: subdown(ldb, 'w') }) - // this.txs = createTxsDB({ - // changes: changes, - // db: subdown(ldb, 't'), - // keeper: keeper - // }) - this.addressBook = createDB.addressBook({ changes: changes, keeper: this.keeper, db: this.dbs.addressBook, identityInfo: this.identityInfo - // db: subdown(ldb, 'a') }) this.sealwatch = createSealWatcher(this) @@ -192,8 +238,6 @@ function Tradle (opts) { reemit(this.sender, this, ['sent']) - // this.setIdentity(this.identity) - // misc this.validator = createValidator(this) @@ -239,8 +283,6 @@ function Tradle (opts) { this._exec('start') }) } - - // utils.lockify(this, ['createObject', 'addContact']) } module.exports = Tradle @@ -342,7 +384,7 @@ Tradle.prototype.identitySealStatus = function (cb) { */ Tradle.prototype.objectSealStatus = function (opts, cb) { const self = this - typeforce(types.someObjectInfo, opts) + types.someObjectInfo.assert(opts) const links = utils.getLinks(opts) const status = { permalink: false, prevLink: false, link: false, watches: {} } @@ -384,25 +426,9 @@ Tradle.prototype.objectSealStatus = function (opts, cb) { Tradle.prototype.setIdentity = function (opts, cb) { const self = this - typeforce({ - keys: typeforce.Array, - identity: types.identity, - link: typeforce.maybe(typeforce.String) - }, opts) + setIdentityOpts.assert(opts) cb = utils.asyncify(cb) -// if (!this.addressBook) return this._setIdentity(opts, cb) - -// // add own identity to addressBook -// this.addContact(opts.identity, err => { -// if (err) return cb(err) - -// this._setIdentity(opts, cb) -// }) -// } - -// Tradle.prototype._setIdentity = function (opts, cb) { - // const self = this this.keys = opts.keys.map(k => utils.importKey(k)) this.identity = opts.identity @@ -463,23 +489,7 @@ Tradle.prototype.setIdentity = function (opts, cb) { Tradle.prototype.updateIdentity = function (opts, cb) { const self = this - typeforce({ - keys: typeforce.Array, - identity: types.identity - }, opts) - - // utils.versionIdentity({ - // keys: this.keys, - // identity: opts.identity, - // prev: this.identity - // }, function (err, nextVersion) { - // if (err) return cb(err) - - // self.setIdentity({ - // keys: opts.keys, - // identity: nextVersion - // }, cb) - // }) + updateIdentityOpts.assert(opts) let { identity, keys } = opts identity = utils.extend( @@ -532,7 +542,7 @@ Tradle.prototype.addContactIdentity = Tradle.prototype.addContact = function addContact (identity, overwrite, cb) { const self = this - typeforce(types.identity, identity) + types.identity.assert(identity) if (typeof overwrite === 'function') { cb = overwrite overwrite = false @@ -540,8 +550,6 @@ Tradle.prototype.addContact = function addContact (identity, overwrite, cb) { cb = cb || noop - // if (deepEqual(identity, this.identity)) return cb() - let objInfo = utils.addLinks({ object: identity }) let pubkeys = identity.pubkeys.filter(key => !key.importedFrom) const indexes = pubkeys.map(key => { @@ -619,10 +627,7 @@ Tradle.prototype.addContact = function addContact (identity, overwrite, cb) { Tradle.prototype.saveObject = function saveObject (wrapper, cb) { const self = this - typeforce({ - object: types.signedObject, - author: typeforce.maybe(typeforce.String) - }, wrapper) + saveObjectWrapper.assert(wrapper) utils.addLinks(wrapper) if (wrapper.permalink !== this.permalink) { @@ -646,7 +651,6 @@ Tradle.prototype.saveObject = function saveObject (wrapper, cb) { // check if we already have it this.objects.exists(link, function (exists) { if (exists) return finish(new errors.ObjectExists({ link })) - // if (exists) return finish() async.series([ validate, @@ -685,12 +689,6 @@ Tradle.prototype.saveObject = function saveObject (wrapper, cb) { return done(err) } - // if (prev[PERMALINK] && prev[PERMALINK] !== object[PERMALINK]) { - // return done(new errors.InvalidVersion({ - // error: `prev version has a different ${PERMALINK}` - // })) - // } - done() }) } @@ -698,8 +696,7 @@ Tradle.prototype.saveObject = function saveObject (wrapper, cb) { function augment (done) { async.parallel([ save, - checkSealed, - // checkPartial + checkSealed ], done) } @@ -785,14 +782,7 @@ Tradle.prototype.signAndSend = function (opts, cb) { Tradle.prototype.send = function send (opts, cb) { const self = this - typeforce({ - to: types.identifier, - object: typeforce.maybe(types.signedObject), - link: typeforce.maybe(typeforce.String), - other: typeforce.maybe(typeforce.Object), - seal: typeforce.maybe(typeforce.Boolean), - time: typeforce.maybe(typeforce.Number), - }, opts) + sendOpts.assert(opts) this._lock(opts.to, function (unlock) { self._queueSend(opts, function () { @@ -806,12 +796,12 @@ Tradle.prototype._queueSend = function _queueSend (opts, cb) { const self = this let recipientPermalink = opts.to.permalink if (!recipientPermalink) { - throw new Error('expected recipient permalink') + return cb(new Error('expected recipient permalink')) } let { object, author, time=Date.now() } = opts let oLink = opts.link - if (!(object || oLink)) throw new Error('expected "object" or "link"') + if (!(object || oLink)) return cb(new Error('expected "object" or "link"')) oLink = oLink || utils.hexLink(object) let wrapper @@ -915,7 +905,6 @@ Tradle.prototype._queueSend = function _queueSend (opts, cb) { function createMessage (results, done) { const meta = results.getNextID self._debug(`${symbols.send} ${++step}. create message`) - // const author = self._authorOpts const base = protocol.object({ object: { [TYPE]: MESSAGE_TYPE, @@ -932,19 +921,6 @@ Tradle.prototype._queueSend = function _queueSend (opts, cb) { self.sign({ object: msg }, done) } - // don't need the below, as messages are sequenced per recipient - // - // function checkExists (result, done) { - // // messages can't have duplicates - // self._debug(`${symbols.send} 5. check if duplicate`) - // const link = protocol.linkString(result.object) - // self.objects.exists(link, function (exists) { - // if (exists) return done(new errors.MessageExists({ link })) - - // done(null, result) - // }) - // }, - function saveMessage (results, done) { const msg = results.createMessage self._debug(`${symbols.send} ${++step}. save object`) @@ -1034,7 +1010,7 @@ Tradle.prototype.resume = function () { Tradle.prototype.receive = function receive (msg, from, cb) { const self = this - typeforce(types.identifier, from) + types.identifier.assert(from) cb = utils.asyncify(cb) if (msg[PERMALINK] || msg[PREVLINK]) { @@ -1138,23 +1114,17 @@ Tradle.prototype._receive = function _receive (msg, from, cb) { Tradle.prototype.seal = function seal (opts, cb) { const self = this - typeforce({ - object: types.signedObject, - basePubKey: typeforce.maybe(types.chainPubKey), - network: typeforce.maybe(types.blockchainAdapter), - amount: typeforce.maybe(typeforce.Number) - }, opts) + sealOpts.assert(opts) let { object, network } = opts if (!network) network = this.network - if (!network) throw new Error('expected "network"') + if (!network) return cb(new Error('expected "network"')) const link = utils.hexLink(object) const headerHash = protocol.headerHash(object) const basePubKey = opts.basePubKey || this.chainPubKey const sealPubKey = protocol.sealPubKey({ object, basePubKey }) const sealAddress = network.pubKeyToAddress(sealPubKey.pub) - // const uid = utils.sealUID({ link, sealPubKey }) this.seals.findOne('sealAddress', sealAddress, function (err, seal) { if (err && !err.notFound) return cb(err) if (seal) return cb(new errors.SealExists(seal)) @@ -1171,9 +1141,6 @@ Tradle.prototype.seal = function seal (opts, cb) { sealPrevAddress = network.pubKeyToAddress(sealPrevPubKey.pub) } - // const sealPrevAddress = sealPrevPubKey && - // utils.sealPrevAddress(basePubKey, link, self.networkName) - const blockchain = network.blockchain const networkName = network.name const sealProps = { @@ -1217,13 +1184,7 @@ Tradle.prototype.seal = function seal (opts, cb) { * @param {Function} cb */ Tradle.prototype.watchNextVersion = function (opts, cb) { - typeforce({ - chain: types.blockchainIdentifier, - link: typeforce.maybe(typeforce.String), - object: typeforce.maybe(typeforce.Object), - headerHash: typeforce.maybe(typeforce.String), - basePubKey: types.chainPubKey - }, opts) + watchNextVersionOpts.assert(opts) let { chain, link, object, headerHash, basePubKey } = opts if (!headerHash) headerHash = protocol.headerHash(object) @@ -1256,14 +1217,7 @@ Tradle.prototype.watchNextVersion = function (opts, cb) { * @param {Function} cb */ Tradle.prototype.watchSeal = function (opts, cb) { - typeforce({ - chain: types.blockchainIdentifier, - basePubKey: types.chainPubKey, - link: typeforce.maybe(typeforce.String), - object: typeforce.maybe(typeforce.Object), - headerHash: typeforce.maybe(typeforce.String), - txId: typeforce.maybe(typeforce.String) - }, opts) + watchSealOpts.assert(opts) let { chain, link, object, headerHash, basePubKey, txId } = opts if (!headerHash) headerHash = protocol.headerHash(object) @@ -1304,15 +1258,7 @@ Tradle.prototype.watchSeal = function (opts, cb) { Tradle.prototype._watch = function (opts, cb) { const self = this - typeforce({ - chain: types.blockchainIdentifier, - link: typeforce.String, - headerHash: typeforce.String, - basePubKey: types.chainPubKey, - watchType: typeforce.String, - address: typeforce.maybe(typeforce.String), - txId: typeforce.maybe(typeforce.String), - }, opts, true) + _watchOpts.assert(opts, true) async.parallel([ function checkExistingWatch (done) { @@ -1332,12 +1278,6 @@ Tradle.prototype._watch = function (opts, cb) { } done() - - // if (seal && seal.status) { - // return done(new errors.SealExists({ uid })) - // } - - // done() }) } ], function (err) { @@ -1355,7 +1295,7 @@ Tradle.prototype._watch = function (opts, cb) { * @param {Function} cb */ Tradle.prototype._send = function _send (msg, recipientInfo, cb) { - throw new Error('implement this method yourself') + cb(new Error('implement this method yourself')) } /** @@ -1375,7 +1315,7 @@ Tradle.prototype._onready = function (fn) { */ Tradle.prototype.destroy = function destroy (cb) { cb = cb || noop - if (this._destroyed) throw new Error('already destroying or destroyed') + if (this._destroyed) return cb(new Error('already destroying or destroyed')) if (!this._ready) return this.once('ready', () => this.destroy()) this.emit('destroying') @@ -1416,10 +1356,14 @@ Tradle.prototype.sync = function (cb) { Tradle.prototype._lock = function (id, cb) { const self = this if (typeof id === 'object') { - id = getLockId(id) + try { + id = getLockId(id) + } catch (err) { + return cb(err) + } } - typeforce(typeforce.String, id) + typeforce.String.assert(id) if (!this._locks[id]) this._locks[id] = mutexify() this._locks[id](function (release) { @@ -1439,12 +1383,7 @@ Tradle.prototype._lock = function (id, cb) { Tradle.prototype.abortMessages = function (messages, cb) { const self = this - messages.forEach(message => { - typeforce({ - link: typeforce.String, - to: typeforce.String - }, message) - }) + abortMessagesMessages.assert(messages) const recipients = messages.map(({ to }) => to) const links = messages.map(({ link }) => link) @@ -1467,9 +1406,7 @@ Tradle.prototype.abortMessages = function (messages, cb) { Tradle.prototype.abortUnsent = function (opts, cb) { const self = this - typeforce({ - to: typeforce.String - }, opts) + abortUnsentOpts.assert(opts) const { to } = opts this.sender.pause(to) diff --git a/lib/partial.js b/lib/partial.js index 38daccb..ec0b38f 100644 --- a/lib/partial.js +++ b/lib/partial.js @@ -3,17 +3,16 @@ const merkleProofs = require('merkle-proofs') const protocol = require('@tradle/protocol') const flat = require('flat-tree') const utils = require('./utils') -const typeforce = require('./typeforce') const types = require('./types') const { SIG, TYPE, TYPES } = require('./constants') const { PARTIAL } = TYPES exports.from = function (object) { - typeforce(types.signedObject, object) + types.signedObject.assert(object) const neutered = utils.omit(object, SIG) const prover = protocol.prover(neutered) - const indices = protocol.indices(neutered) + protocol.indices(neutered) const added = {} const builder = { add: opts => { @@ -66,7 +65,7 @@ exports.extractSigPubKey = function (partial, cb) { const { pubKey, sig } = utils.parseSig(partial.sig) pubKey.type = 'ec' const nkey = utils.importKey(pubKey) - nkey.verify(new Buffer(partial.root.hash, 'hex'), sig, function (err, verified) { + nkey.verify(Buffer.from(partial.root.hash, 'hex'), sig, function (err, verified) { if (err) return cb(err) cb(null, verified && pubKey) @@ -80,12 +79,10 @@ exports.interpretLeaves = function interpretLeaves (leaves) { }) const props = [] - let key for (var i = 0; i < leaves.length; i++) { let leaf = leaves[i] let isKey = leaf.index % 4 === 0 if (isKey) { - key = leaf props.push({ key: leaf.data }) } else { // merkle tree uses stringified values @@ -96,8 +93,6 @@ exports.interpretLeaves = function interpretLeaves (leaves) { } else { props.push({ value: leaf.data }) } - - key = null } } @@ -131,11 +126,11 @@ function bufferizeMerkleNode (node) { } if (node.hash) { - withBufs.hash = new Buffer(node.hash, 'hex') + withBufs.hash = Buffer.from(node.hash, 'hex') } if (node.data) { - withBufs.data = new Buffer(node.data) + withBufs.data = Buffer.from(node.data) } return withBufs diff --git a/lib/proto.js b/lib/proto.js index 1785e51..b935963 100644 --- a/lib/proto.js +++ b/lib/proto.js @@ -1,186 +1 @@ -/** - * protocol buffers schema - * @module protobufs - */ - -const typeforce = require('typeforce') -const protocol = require('@tradle/protocol') -const constants = require('./constants') -const { - SIG, - SEQ, - PREV_TO_RECIPIENT, - PREVLINK, - PERMALINK, - AUTHOR, - RECIPIENT, -} = constants -const types = require('./types') -const proto = exports.schema = require('protocol-buffers')(` - ${protocol.protobufs.string} - - // message PubKey { - // required PubKeyType type = 1; - // optional ECPubKey ec = 2; - // // optional DSAPubKey dsa = 3; - // // optional RSAPubKey rsa = 4; - // } - - // enum PubKeyType { - // EC = 1; - // RSA = 2; - // DSA = 3; - // } - - message Message { - required bytes object = 1; - required bytes ${AUTHOR} = 2; - required bytes ${RECIPIENT} = 3; - required ECSignature ${SIG} = 4; - optional bytes ${PREV_TO_RECIPIENT} = 5; - optional uint32 ${SEQ} = 6; - optional bytes other = 7; - optional Seal seal = 8; - optional uint64 time = 9; - } - - enum Network { - none = 1; - btcmain = 2; - btctest = 3; - ethmain = 4; - ethropsten = 5; - ethmorden = 6; - ethrinkeby = 7; - } - - message Seal { - required string network = 1; - // presumably all keys on a network - // are homogenous (e.g. have the save curve for elliptic curve based networks) - required bytes basePubKey = 2; - required bytes link = 3; - required string blockchain = 4; - required bytes headerHash = 5; - } - - enum KeyType { - bitcoin = 1; - ec = 2; - dsa = 3; - ethereum = 4; - } - - enum ECurve { - none = 1; - ed25519 = 2; - secp256k1 = 3; - p256 = 4; - curve25519 = 5; - } - - enum KeyPurpose { - payment = 1; - sign = 2; - update = 3; - messaging = 4; - tls = 5; - } - - message PubKey { - required KeyType type = 1; - required KeyPurpose purpose = 2; - required bytes pub = 3; - optional ECurve curve = 4 [default = none]; - optional Network network = 5 [default = none]; - optional bytes fingerprint = 6; - } - - message Identity { - required bytes ${SIG} = 1; - optional bytes ${PREVLINK} = 2; - optional bytes ${PERMALINK} = 3; - repeated PubKey pubkeys = 4; - } -`) - - // message Message { - // required bytes object = 1; - // required Signature sig = 2; - // } - - // enum IdentifierType { - // ROOT = 0; - // CUR = 1; - // PUBKEY = 2; - // } - - // message Recipient { - // required IdentifierType identifierType = 1; - // required bytes identifier = 2; - // } - - // message TxData { - // required bytes merkleRoot = 1; - // required Recipient recipient = 2; - // } - - // message Object { - // required bytes json = 1; - // } - - // message Message { - // repeated Header header = 1; - // required bytes object = 2; - // } - - // message Object { - // required bytes body = 1; - // required Signature sig = 2; - // } - - // message Object { - // required Signature sig = 1; - // required bytes body = 2; - // } - - // message Share { - // required Header header = 1; - // required Signature sig = 2; - // required bytes body = 3; - // } - -// exports.serialize = function (opts) { -// typeforce({ -// toKey: typeforce.Buffer, -// object: typeforce.Object -// }, opts) - -// return proto.Message.encode({ -// header: [ -// { -// sig: header.sig, -// sigKey: header.sigKey, -// sigInput: { -// merkleRoot: header.sigInput.merkleRoot, -// recipient: { -// identifierType: proto.IdentifierType.PUBKEY, -// identifier: opts.toKey -// } -// } -// } -// ], -// object: new Buffer(JSON.stringify(opts.object)) -// }) -// } - -// exports.unserialize = function (msg) { -// msg = exports.proto.Message.decode(msg) -// const sigInput = msg.header[0].sigInput -// // only pubKeys for now -// sigInput.recipient = sigInput.recipient.identifier -// msg.object = JSON.parse(msg.object) -// msg.headers = msg.header -// delete msg.header -// return msg -// } +exports.schema = require('./schema.js') diff --git a/lib/retrystream.js b/lib/retrystream.js index 9155c72..e3c656f 100644 --- a/lib/retrystream.js +++ b/lib/retrystream.js @@ -3,17 +3,21 @@ * @module retrystream */ -// const EventEmitter = require('events') const createBackoff = require('backoff') const through = require('through2') const combine = require('stream-combiner2') -const typeforce = require('./typeforce') +const typeforce = require('@tradle/typeforce') const constants = require('./constants') module.exports = exports = createRetryStream // for ease of testing module.exports.DEFAULT_BACKOFF_OPTS = constants.DEFAULT_BACKOFF_OPTS +const createRetryStreamOpts = typeforce.object({ + primaryKey: typeforce.String, + worker: typeforce.Function +}) + /** * stream-based queue * @alias module:retrystream @@ -23,10 +27,7 @@ module.exports.DEFAULT_BACKOFF_OPTS = constants.DEFAULT_BACKOFF_OPTS * @return {stream} */ function createRetryStream (opts) { - typeforce({ - primaryKey: typeforce.String, - worker: typeforce.Function - }, opts) + createRetryStreamOpts.assert(opts) // to support concurrency, use map-stream, but then you obviously lose order guarantees diff --git a/lib/schema.js b/lib/schema.js new file mode 100644 index 0000000..63e86d1 --- /dev/null +++ b/lib/schema.js @@ -0,0 +1,767 @@ +// This file is auto generated by the protocol-buffers compiler + +/* eslint-disable quotes */ +/* eslint-disable indent */ +/* eslint-disable no-redeclare */ +/* eslint-disable camelcase */ + +// Remember to `npm install --save protocol-buffers-encodings` +var encodings = require('protocol-buffers-encodings') +var varint = encodings.varint +var skip = encodings.skip + +exports.Network = { + none: 1, + btcmain: 2, + btctest: 3, + ethmain: 4, + ethropsten: 5, + ethmorden: 6, + ethrinkeby: 7 +} + +exports.KeyType = { + bitcoin: 1, + ec: 2, + dsa: 3, + ethereum: 4 +} + +exports.ECurve = { + none: 1, + ed25519: 2, + secp256k1: 3, + p256: 4, + curve25519: 5 +} + +exports.KeyPurpose = { + payment: 1, + sign: 2, + update: 3, + messaging: 4, + tls: 5 +} + +var Message = exports.Message = { + buffer: true, + encodingLength: null, + encode: null, + decode: null +} + +var Seal = exports.Seal = { + buffer: true, + encodingLength: null, + encode: null, + decode: null +} + +var PubKey = exports.PubKey = { + buffer: true, + encodingLength: null, + encode: null, + decode: null +} + +var Identity = exports.Identity = { + buffer: true, + encodingLength: null, + encode: null, + decode: null +} + +var ECSignature = exports.ECSignature = { + buffer: true, + encodingLength: null, + encode: null, + decode: null +} + +var ECPubKey = exports.ECPubKey = { + buffer: true, + encodingLength: null, + encode: null, + decode: null +} + +defineMessage() +defineSeal() +definePubKey() +defineIdentity() +defineECSignature() +defineECPubKey() + +function defineMessage () { + Message.encodingLength = encodingLength + Message.encode = encode + Message.decode = decode + + function encodingLength (obj) { + var length = 0 + if (!defined(obj.object)) throw new Error("object is required") + var len = encodings.bytes.encodingLength(obj.object) + length += 1 + len + if (!defined(obj._author)) throw new Error("_author is required") + var len = encodings.bytes.encodingLength(obj._author) + length += 1 + len + if (!defined(obj._recipient)) throw new Error("_recipient is required") + var len = encodings.bytes.encodingLength(obj._recipient) + length += 1 + len + if (!defined(obj._s)) throw new Error("_s is required") + var len = ECSignature.encodingLength(obj._s) + length += varint.encodingLength(len) + length += 1 + len + if (defined(obj._q)) { + var len = encodings.bytes.encodingLength(obj._q) + length += 1 + len + } + if (defined(obj._n)) { + var len = encodings.varint.encodingLength(obj._n) + length += 1 + len + } + if (defined(obj.other)) { + var len = encodings.bytes.encodingLength(obj.other) + length += 1 + len + } + if (defined(obj.seal)) { + var len = Seal.encodingLength(obj.seal) + length += varint.encodingLength(len) + length += 1 + len + } + if (defined(obj.time)) { + var len = encodings.varint.encodingLength(obj.time) + length += 1 + len + } + return length + } + + function encode (obj, buf, offset) { + if (!offset) offset = 0 + if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) + var oldOffset = offset + if (!defined(obj.object)) throw new Error("object is required") + buf[offset++] = 10 + encodings.bytes.encode(obj.object, buf, offset) + offset += encodings.bytes.encode.bytes + if (!defined(obj._author)) throw new Error("_author is required") + buf[offset++] = 18 + encodings.bytes.encode(obj._author, buf, offset) + offset += encodings.bytes.encode.bytes + if (!defined(obj._recipient)) throw new Error("_recipient is required") + buf[offset++] = 26 + encodings.bytes.encode(obj._recipient, buf, offset) + offset += encodings.bytes.encode.bytes + if (!defined(obj._s)) throw new Error("_s is required") + buf[offset++] = 34 + varint.encode(ECSignature.encodingLength(obj._s), buf, offset) + offset += varint.encode.bytes + ECSignature.encode(obj._s, buf, offset) + offset += ECSignature.encode.bytes + if (defined(obj._q)) { + buf[offset++] = 42 + encodings.bytes.encode(obj._q, buf, offset) + offset += encodings.bytes.encode.bytes + } + if (defined(obj._n)) { + buf[offset++] = 48 + encodings.varint.encode(obj._n, buf, offset) + offset += encodings.varint.encode.bytes + } + if (defined(obj.other)) { + buf[offset++] = 58 + encodings.bytes.encode(obj.other, buf, offset) + offset += encodings.bytes.encode.bytes + } + if (defined(obj.seal)) { + buf[offset++] = 66 + varint.encode(Seal.encodingLength(obj.seal), buf, offset) + offset += varint.encode.bytes + Seal.encode(obj.seal, buf, offset) + offset += Seal.encode.bytes + } + if (defined(obj.time)) { + buf[offset++] = 72 + encodings.varint.encode(obj.time, buf, offset) + offset += encodings.varint.encode.bytes + } + encode.bytes = offset - oldOffset + return buf + } + + function decode (buf, offset, end) { + if (!offset) offset = 0 + if (!end) end = buf.length + if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") + var oldOffset = offset + var obj = { + object: null, + _author: null, + _recipient: null, + _s: null, + _q: null, + _n: 0, + other: null, + seal: null, + time: 0 + } + var found0 = false + var found1 = false + var found2 = false + var found3 = false + while (true) { + if (end <= offset) { + if (!found0 || !found1 || !found2 || !found3) throw new Error("Decoded message is not valid") + decode.bytes = offset - oldOffset + return obj + } + var prefix = varint.decode(buf, offset) + offset += varint.decode.bytes + var tag = prefix >> 3 + switch (tag) { + case 1: + obj.object = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found0 = true + break + case 2: + obj._author = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found1 = true + break + case 3: + obj._recipient = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found2 = true + break + case 4: + var len = varint.decode(buf, offset) + offset += varint.decode.bytes + obj._s = ECSignature.decode(buf, offset, offset + len) + offset += ECSignature.decode.bytes + found3 = true + break + case 5: + obj._q = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + break + case 6: + obj._n = encodings.varint.decode(buf, offset) + offset += encodings.varint.decode.bytes + break + case 7: + obj.other = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + break + case 8: + var len = varint.decode(buf, offset) + offset += varint.decode.bytes + obj.seal = Seal.decode(buf, offset, offset + len) + offset += Seal.decode.bytes + break + case 9: + obj.time = encodings.varint.decode(buf, offset) + offset += encodings.varint.decode.bytes + break + default: + offset = skip(prefix & 7, buf, offset) + } + } + } +} + +function defineSeal () { + Seal.encodingLength = encodingLength + Seal.encode = encode + Seal.decode = decode + + function encodingLength (obj) { + var length = 0 + if (!defined(obj.network)) throw new Error("network is required") + var len = encodings.string.encodingLength(obj.network) + length += 1 + len + if (!defined(obj.basePubKey)) throw new Error("basePubKey is required") + var len = encodings.bytes.encodingLength(obj.basePubKey) + length += 1 + len + if (!defined(obj.link)) throw new Error("link is required") + var len = encodings.bytes.encodingLength(obj.link) + length += 1 + len + if (!defined(obj.blockchain)) throw new Error("blockchain is required") + var len = encodings.string.encodingLength(obj.blockchain) + length += 1 + len + if (!defined(obj.headerHash)) throw new Error("headerHash is required") + var len = encodings.bytes.encodingLength(obj.headerHash) + length += 1 + len + return length + } + + function encode (obj, buf, offset) { + if (!offset) offset = 0 + if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) + var oldOffset = offset + if (!defined(obj.network)) throw new Error("network is required") + buf[offset++] = 10 + encodings.string.encode(obj.network, buf, offset) + offset += encodings.string.encode.bytes + if (!defined(obj.basePubKey)) throw new Error("basePubKey is required") + buf[offset++] = 18 + encodings.bytes.encode(obj.basePubKey, buf, offset) + offset += encodings.bytes.encode.bytes + if (!defined(obj.link)) throw new Error("link is required") + buf[offset++] = 26 + encodings.bytes.encode(obj.link, buf, offset) + offset += encodings.bytes.encode.bytes + if (!defined(obj.blockchain)) throw new Error("blockchain is required") + buf[offset++] = 34 + encodings.string.encode(obj.blockchain, buf, offset) + offset += encodings.string.encode.bytes + if (!defined(obj.headerHash)) throw new Error("headerHash is required") + buf[offset++] = 42 + encodings.bytes.encode(obj.headerHash, buf, offset) + offset += encodings.bytes.encode.bytes + encode.bytes = offset - oldOffset + return buf + } + + function decode (buf, offset, end) { + if (!offset) offset = 0 + if (!end) end = buf.length + if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") + var oldOffset = offset + var obj = { + network: "", + basePubKey: null, + link: null, + blockchain: "", + headerHash: null + } + var found0 = false + var found1 = false + var found2 = false + var found3 = false + var found4 = false + while (true) { + if (end <= offset) { + if (!found0 || !found1 || !found2 || !found3 || !found4) throw new Error("Decoded message is not valid") + decode.bytes = offset - oldOffset + return obj + } + var prefix = varint.decode(buf, offset) + offset += varint.decode.bytes + var tag = prefix >> 3 + switch (tag) { + case 1: + obj.network = encodings.string.decode(buf, offset) + offset += encodings.string.decode.bytes + found0 = true + break + case 2: + obj.basePubKey = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found1 = true + break + case 3: + obj.link = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found2 = true + break + case 4: + obj.blockchain = encodings.string.decode(buf, offset) + offset += encodings.string.decode.bytes + found3 = true + break + case 5: + obj.headerHash = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found4 = true + break + default: + offset = skip(prefix & 7, buf, offset) + } + } + } +} + +function definePubKey () { + PubKey.encodingLength = encodingLength + PubKey.encode = encode + PubKey.decode = decode + + function encodingLength (obj) { + var length = 0 + if (!defined(obj.type)) throw new Error("type is required") + var len = encodings.enum.encodingLength(obj.type) + length += 1 + len + if (!defined(obj.purpose)) throw new Error("purpose is required") + var len = encodings.enum.encodingLength(obj.purpose) + length += 1 + len + if (!defined(obj.pub)) throw new Error("pub is required") + var len = encodings.bytes.encodingLength(obj.pub) + length += 1 + len + if (defined(obj.curve)) { + var len = encodings.enum.encodingLength(obj.curve) + length += 1 + len + } + if (defined(obj.network)) { + var len = encodings.enum.encodingLength(obj.network) + length += 1 + len + } + if (defined(obj.fingerprint)) { + var len = encodings.bytes.encodingLength(obj.fingerprint) + length += 1 + len + } + return length + } + + function encode (obj, buf, offset) { + if (!offset) offset = 0 + if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) + var oldOffset = offset + if (!defined(obj.type)) throw new Error("type is required") + buf[offset++] = 8 + encodings.enum.encode(obj.type, buf, offset) + offset += encodings.enum.encode.bytes + if (!defined(obj.purpose)) throw new Error("purpose is required") + buf[offset++] = 16 + encodings.enum.encode(obj.purpose, buf, offset) + offset += encodings.enum.encode.bytes + if (!defined(obj.pub)) throw new Error("pub is required") + buf[offset++] = 26 + encodings.bytes.encode(obj.pub, buf, offset) + offset += encodings.bytes.encode.bytes + if (defined(obj.curve)) { + buf[offset++] = 32 + encodings.enum.encode(obj.curve, buf, offset) + offset += encodings.enum.encode.bytes + } + if (defined(obj.network)) { + buf[offset++] = 40 + encodings.enum.encode(obj.network, buf, offset) + offset += encodings.enum.encode.bytes + } + if (defined(obj.fingerprint)) { + buf[offset++] = 50 + encodings.bytes.encode(obj.fingerprint, buf, offset) + offset += encodings.bytes.encode.bytes + } + encode.bytes = offset - oldOffset + return buf + } + + function decode (buf, offset, end) { + if (!offset) offset = 0 + if (!end) end = buf.length + if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") + var oldOffset = offset + var obj = { + type: 1, + purpose: 1, + pub: null, + curve: 1, + network: 1, + fingerprint: null + } + var found0 = false + var found1 = false + var found2 = false + while (true) { + if (end <= offset) { + if (!found0 || !found1 || !found2) throw new Error("Decoded message is not valid") + decode.bytes = offset - oldOffset + return obj + } + var prefix = varint.decode(buf, offset) + offset += varint.decode.bytes + var tag = prefix >> 3 + switch (tag) { + case 1: + obj.type = encodings.enum.decode(buf, offset) + offset += encodings.enum.decode.bytes + found0 = true + break + case 2: + obj.purpose = encodings.enum.decode(buf, offset) + offset += encodings.enum.decode.bytes + found1 = true + break + case 3: + obj.pub = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found2 = true + break + case 4: + obj.curve = encodings.enum.decode(buf, offset) + offset += encodings.enum.decode.bytes + break + case 5: + obj.network = encodings.enum.decode(buf, offset) + offset += encodings.enum.decode.bytes + break + case 6: + obj.fingerprint = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + break + default: + offset = skip(prefix & 7, buf, offset) + } + } + } +} + +function defineIdentity () { + Identity.encodingLength = encodingLength + Identity.encode = encode + Identity.decode = decode + + function encodingLength (obj) { + var length = 0 + if (!defined(obj._s)) throw new Error("_s is required") + var len = encodings.bytes.encodingLength(obj._s) + length += 1 + len + if (defined(obj._p)) { + var len = encodings.bytes.encodingLength(obj._p) + length += 1 + len + } + if (defined(obj._r)) { + var len = encodings.bytes.encodingLength(obj._r) + length += 1 + len + } + if (defined(obj.pubkeys)) { + for (var i = 0; i < obj.pubkeys.length; i++) { + if (!defined(obj.pubkeys[i])) continue + var len = PubKey.encodingLength(obj.pubkeys[i]) + length += varint.encodingLength(len) + length += 1 + len + } + } + return length + } + + function encode (obj, buf, offset) { + if (!offset) offset = 0 + if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) + var oldOffset = offset + if (!defined(obj._s)) throw new Error("_s is required") + buf[offset++] = 10 + encodings.bytes.encode(obj._s, buf, offset) + offset += encodings.bytes.encode.bytes + if (defined(obj._p)) { + buf[offset++] = 18 + encodings.bytes.encode(obj._p, buf, offset) + offset += encodings.bytes.encode.bytes + } + if (defined(obj._r)) { + buf[offset++] = 26 + encodings.bytes.encode(obj._r, buf, offset) + offset += encodings.bytes.encode.bytes + } + if (defined(obj.pubkeys)) { + for (var i = 0; i < obj.pubkeys.length; i++) { + if (!defined(obj.pubkeys[i])) continue + buf[offset++] = 34 + varint.encode(PubKey.encodingLength(obj.pubkeys[i]), buf, offset) + offset += varint.encode.bytes + PubKey.encode(obj.pubkeys[i], buf, offset) + offset += PubKey.encode.bytes + } + } + encode.bytes = offset - oldOffset + return buf + } + + function decode (buf, offset, end) { + if (!offset) offset = 0 + if (!end) end = buf.length + if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") + var oldOffset = offset + var obj = { + _s: null, + _p: null, + _r: null, + pubkeys: [] + } + var found0 = false + while (true) { + if (end <= offset) { + if (!found0) throw new Error("Decoded message is not valid") + decode.bytes = offset - oldOffset + return obj + } + var prefix = varint.decode(buf, offset) + offset += varint.decode.bytes + var tag = prefix >> 3 + switch (tag) { + case 1: + obj._s = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found0 = true + break + case 2: + obj._p = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + break + case 3: + obj._r = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + break + case 4: + var len = varint.decode(buf, offset) + offset += varint.decode.bytes + obj.pubkeys.push(PubKey.decode(buf, offset, offset + len)) + offset += PubKey.decode.bytes + break + default: + offset = skip(prefix & 7, buf, offset) + } + } + } +} + +function defineECSignature () { + ECSignature.encodingLength = encodingLength + ECSignature.encode = encode + ECSignature.decode = decode + + function encodingLength (obj) { + var length = 0 + if (!defined(obj.pubKey)) throw new Error("pubKey is required") + var len = ECPubKey.encodingLength(obj.pubKey) + length += varint.encodingLength(len) + length += 1 + len + if (!defined(obj.sig)) throw new Error("sig is required") + var len = encodings.bytes.encodingLength(obj.sig) + length += 1 + len + return length + } + + function encode (obj, buf, offset) { + if (!offset) offset = 0 + if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) + var oldOffset = offset + if (!defined(obj.pubKey)) throw new Error("pubKey is required") + buf[offset++] = 10 + varint.encode(ECPubKey.encodingLength(obj.pubKey), buf, offset) + offset += varint.encode.bytes + ECPubKey.encode(obj.pubKey, buf, offset) + offset += ECPubKey.encode.bytes + if (!defined(obj.sig)) throw new Error("sig is required") + buf[offset++] = 18 + encodings.bytes.encode(obj.sig, buf, offset) + offset += encodings.bytes.encode.bytes + encode.bytes = offset - oldOffset + return buf + } + + function decode (buf, offset, end) { + if (!offset) offset = 0 + if (!end) end = buf.length + if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") + var oldOffset = offset + var obj = { + pubKey: null, + sig: null + } + var found0 = false + var found1 = false + while (true) { + if (end <= offset) { + if (!found0 || !found1) throw new Error("Decoded message is not valid") + decode.bytes = offset - oldOffset + return obj + } + var prefix = varint.decode(buf, offset) + offset += varint.decode.bytes + var tag = prefix >> 3 + switch (tag) { + case 1: + var len = varint.decode(buf, offset) + offset += varint.decode.bytes + obj.pubKey = ECPubKey.decode(buf, offset, offset + len) + offset += ECPubKey.decode.bytes + found0 = true + break + case 2: + obj.sig = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found1 = true + break + default: + offset = skip(prefix & 7, buf, offset) + } + } + } +} + +function defineECPubKey () { + ECPubKey.encodingLength = encodingLength + ECPubKey.encode = encode + ECPubKey.decode = decode + + function encodingLength (obj) { + var length = 0 + if (!defined(obj.curve)) throw new Error("curve is required") + var len = encodings.string.encodingLength(obj.curve) + length += 1 + len + if (!defined(obj.pub)) throw new Error("pub is required") + var len = encodings.bytes.encodingLength(obj.pub) + length += 1 + len + return length + } + + function encode (obj, buf, offset) { + if (!offset) offset = 0 + if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj)) + var oldOffset = offset + if (!defined(obj.curve)) throw new Error("curve is required") + buf[offset++] = 10 + encodings.string.encode(obj.curve, buf, offset) + offset += encodings.string.encode.bytes + if (!defined(obj.pub)) throw new Error("pub is required") + buf[offset++] = 18 + encodings.bytes.encode(obj.pub, buf, offset) + offset += encodings.bytes.encode.bytes + encode.bytes = offset - oldOffset + return buf + } + + function decode (buf, offset, end) { + if (!offset) offset = 0 + if (!end) end = buf.length + if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid") + var oldOffset = offset + var obj = { + curve: "", + pub: null + } + var found0 = false + var found1 = false + while (true) { + if (end <= offset) { + if (!found0 || !found1) throw new Error("Decoded message is not valid") + decode.bytes = offset - oldOffset + return obj + } + var prefix = varint.decode(buf, offset) + offset += varint.decode.bytes + var tag = prefix >> 3 + switch (tag) { + case 1: + obj.curve = encodings.string.decode(buf, offset) + offset += encodings.string.decode.bytes + found0 = true + break + case 2: + obj.pub = encodings.bytes.decode(buf, offset) + offset += encodings.bytes.decode.bytes + found1 = true + break + default: + offset = skip(prefix & 7, buf, offset) + } + } + } +} + +function defined (val) { + return val !== null && val !== undefined && (typeof val !== 'number' || !isNaN(val)) +} diff --git a/lib/schema.proto b/lib/schema.proto new file mode 100644 index 0000000..83a267b --- /dev/null +++ b/lib/schema.proto @@ -0,0 +1,73 @@ +syntax = "proto3"; +import "node_modules/@tradle/protocol/lib/schema.proto"; + +message Message { + required bytes object = 1; + required bytes _author = 2; // AUTHOR + required bytes _recipient = 3; // RECIPIENT + required ECSignature _s = 4; // SIG + optional bytes _q = 5; // PREV_TO_RECIPIENT + optional uint32 _n = 6; // SEQ + optional bytes other = 7; + optional Seal seal = 8; + optional uint64 time = 9; +} + +enum Network { + none = 1; + btcmain = 2; + btctest = 3; + ethmain = 4; + ethropsten = 5; + ethmorden = 6; + ethrinkeby = 7; +} + +message Seal { + required string network = 1; + // presumably all keys on a network + // are homogenous (e.g. have the save curve for elliptic curve based networks) + required bytes basePubKey = 2; + required bytes link = 3; + required string blockchain = 4; + required bytes headerHash = 5; +} + +enum KeyType { + bitcoin = 1; + ec = 2; + dsa = 3; + ethereum = 4; +} + +enum ECurve { + none = 1; + ed25519 = 2; + secp256k1 = 3; + p256 = 4; + curve25519 = 5; +} + +enum KeyPurpose { + payment = 1; + sign = 2; + update = 3; + messaging = 4; + tls = 5; +} + +message PubKey { + required KeyType type = 1; + required KeyPurpose purpose = 2; + required bytes pub = 3; + optional ECurve curve = 4 [default = none]; + optional Network network = 5 [default = none]; + optional bytes fingerprint = 6; +} + +message Identity { + required bytes _s = 1; // SIG + optional bytes _p = 2; // PREVLINK + optional bytes _r = 3; // PERMALINK + repeated PubKey pubkeys = 4; +} diff --git a/lib/sealer.js b/lib/sealer.js index 8d95135..29bc5ca 100644 --- a/lib/sealer.js +++ b/lib/sealer.js @@ -2,16 +2,12 @@ * @module sealer */ -const EventEmitter = require('events').EventEmitter -const collect = require('stream-collector') const pump = require('pump') -const typeforce = require('./typeforce') +const typeforce = require('@tradle/typeforce') const createBackoff = require('backoff') const debug = require('debug')('tradle:sealer') -const protocol = require('@tradle/protocol') const through = require('through2') const constants = require('./constants') -const LINK = constants.LINK const utils = require('./utils') const controls = require('./controls') const types = require('./types') @@ -20,6 +16,14 @@ const createRetryStream = require('./retrystream') module.exports = sealer module.exports.DEFAULT_BACKOFF_OPTS = constants.DEFAULT_BACKOFF_OPTS +const sealerOpts = typeforce.object({ + seals: typeforce.Object, + actions: typeforce.Object, + getBlockchainAdapter: typeforce.Function, + transactor: types.transactor, + backoffOptions: typeforce.maybe(typeforce.Object), + name: typeforce.maybe(typeforce.String) +}) /** * blockchain seal creator with retry @@ -32,14 +36,7 @@ module.exports.DEFAULT_BACKOFF_OPTS = constants.DEFAULT_BACKOFF_OPTS * @param {String} [opts.name] for logging */ function sealer (opts) { - typeforce({ - seals: typeforce.Object, - actions: typeforce.Object, - getBlockchainAdapter: typeforce.Function, - transactor: types.transactor, - backoffOptions: typeforce.maybe(typeforce.Object), - name: typeforce.maybe(typeforce.String) - }, opts) + sealerOpts.assert(opts) const myDebug = utils.subdebugger(debug, opts.name) const { actions, seals, getBlockchainAdapter, transactor } = opts @@ -47,13 +44,13 @@ function sealer (opts) { return createBackoff.exponential(opts.backoffOptions || module.exports.DEFAULT_BACKOFF_OPTS) } - const ee = new EventEmitter() let sealsStream let sealerStream - return utils.extend(ee, controls({ start, pause })) + const ee = controls({start, pause}) + return ee function writeSeal (state, cb) { - let to = [ state.sealAddress ] + let to = [state.sealAddress] if (state.sealPrevAddress) { if (transactor.multipleRecipientsAllowed === false) { myDebug('transactor does not allow multiple output addresses, skipping prev') @@ -97,7 +94,6 @@ function sealer (opts) { sealsStream = seals.pending({ live: true, keys: false }) sealerStream = createRetryStream({ worker: writeSeal, - // primaryKey: 'link' primaryKey: 'uid', backoff: newBackoff() }) diff --git a/lib/sealwatch.js b/lib/sealwatch.js index c25301f..2199fac 100644 --- a/lib/sealwatch.js +++ b/lib/sealwatch.js @@ -5,7 +5,7 @@ const EventEmitter = require('events').EventEmitter const debug = require('debug')('tradle:sealwatch') const thunky = require('thunky') -const typeforce = require('./typeforce') +const typeforce = require('@tradle/typeforce') const async = require('async') const constants = require('./constants') const utils = require('./utils') @@ -15,6 +15,17 @@ const DEFAULT_BATCH_SIZE = Number(process.env.SEALWATCH_BATCH_SIZE) || 50 const DEFAULT_SYNC_INTERVAL = Number(process.env.SEALWATCH_SYNC_INTERVAL) || 600000 // 10 mins const DEFAULT_INTER_BATCH_TIMEOUT = Number(process.env.SEALWATCH_BATCH_TIMEOUT) || 60000 +const sealwatchOpts = typeforce.object({ + getBlockchainAdapter: typeforce.Function, + watches: typeforce.Object, + objects: typeforce.Object, + actions: typeforce.Object, + syncInterval: typeforce.Number, + confirmedAfter: typeforce.Number, + batchSize: typeforce.maybe(typeforce.Number), + interBatchTimeout: typeforce.maybe(typeforce.Number) +}) + /** * blockchain seal monitor * @alias module:sealwatch @@ -25,17 +36,7 @@ const DEFAULT_INTER_BATCH_TIMEOUT = Number(process.env.SEALWATCH_BATCH_TIMEOUT) * @param {Number} opts.confirmedAfter */ module.exports = function sealwatch (opts) { - typeforce({ - getBlockchainAdapter: typeforce.Function, - watches: typeforce.Object, - objects: typeforce.Object, - actions: typeforce.Object, - // chaintracker: typeforce.Object, - syncInterval: typeforce.Number, - confirmedAfter: typeforce.Number, - batchSize: typeforce.maybe(typeforce.Number), - interBatchTimeout: typeforce.maybe(typeforce.Number) - }, opts) + sealwatchOpts.assert(opts) const emitter = new EventEmitter() const nodeName = opts.name @@ -50,7 +51,6 @@ module.exports = function sealwatch (opts) { syncInterval=DEFAULT_SYNC_INTERVAL } = opts - // const chaintracker = opts.chaintracker const watchesDB = opts.watches const objectsDB = opts.objects let watched = [] @@ -302,10 +302,6 @@ module.exports = function sealwatch (opts) { }, cb) } - // function maybeEmitErr (err) { - // if (err) emitter.emit('error', err) - // } - function defaultProcessTx (txInfo, cb) { const { blockchain, networkName } = txInfo const toAddrs = txInfo.to.addresses @@ -345,11 +341,9 @@ module.exports = function sealwatch (opts) { [linkProp]: watch.link, [addressProp]: watch.address, [headerHashProp]: watch.headerHash, - // link: watch.link, basePubKey: watch.basePubKey, txId: txInfo.txId, confirmations: txInfo.confirmations || 0, - // confirmed: txInfo.confirmations >= confirmedAfter, addresses: toAddrs } @@ -369,40 +363,10 @@ module.exports = function sealwatch (opts) { data.sealAddress = sealAddress } - // debug('ignoring transaction seals only previous version: ' + ) } actions.readSeal(data, cb) }) - - // lookup seal and object to figure out if this is - // a valid seal - - // const uid = utils.sealUID({ - // networkName: networkName, - // [addressProp]: watch.address, - // link: watch.link - // }) - - // async.find([ - // function lookupSeal (done) { - // seals.byLink(watch.link, function (err, seals) { - // if (err) return done() - - // const sealed = seals.some(seal => { - // const sealAddrs = utils.getSealAddresses(seal) - // return sealAddrs.every(addr => toAddrs.indexOf(addr) !== -1) - // }) - - // done(null, sealed) - // }) - // } - // ], cb) - - // actions.readSeal({ - // link: watch.link, - // address - // }) }) } } diff --git a/lib/sender.js b/lib/sender.js index 32135d9..935e7ff 100644 --- a/lib/sender.js +++ b/lib/sender.js @@ -3,17 +3,11 @@ */ const EventEmitter = require('events').EventEmitter -const typeforce = require('./typeforce') +const typeforce = require('@tradle/typeforce') const pump = require('pump') -const thunky = require('thunky') const through = require('through2') const debug = require('debug')('tradle:sender') -const protocol = require('@tradle/protocol') -const topics = require('./topics') -const statuses = require('./status') -const types = require('./types') const utils = require('./utils') -const controls = require('./controls') const Channel = require('./channel') module.exports = createSender @@ -22,6 +16,15 @@ module.exports = createSender * @typedef {Object} sender */ +const createSenderOpts = typeforce.object({ + send: typeforce.Function, + objects: typeforce.Object, + addressBook: typeforce.Object, + actions: typeforce.Object, + backoffOptions: typeforce.maybe(typeforce.Object), + name: typeforce.maybe(typeforce.String) +}) + /** * message send with retry * @alias module:sender @@ -29,22 +32,13 @@ module.exports = createSender * @param {Function} opts.send * @param {objectsDB} opts.objects * @param {addressBook} opts.addressBook - * @param {Actions} opts.actions * @param {Object} opts.backoffOptions * @param {string} [opts.name] (for logging) */ function createSender (opts) { - typeforce({ - send: typeforce.Function, - objects: typeforce.Object, - addressBook: typeforce.Object, - actions: typeforce.Object, - backoffOptions: typeforce.maybe(typeforce.Object), - name: typeforce.maybe(typeforce.String) - }, opts) + createSenderOpts.assert(opts) const myDebug = utils.subdebugger(debug, opts.name) - const actions = opts.actions const objects = opts.objects const addressBook = opts.addressBook const send = opts.send @@ -65,7 +59,6 @@ function createSender (opts) { if (unsentStream) { unsentStream.pause() - // unsentStream = null } } @@ -113,18 +106,11 @@ function createSender (opts) { if (unsentStream) { unsentStream.end() - // unsentStream = null } return sender.resumeAll.bind(sender) } - function getChannels (recipients) { - return recipients.map(rh => channels[rh]) - // filter out nulls - .filter(stream => stream) - } - function activateChannel (permalink) { if (paused[permalink]) return // this resume() not needed anymore as channel drains itself diff --git a/lib/status.js b/lib/status.js index 0f4e943..6d03321 100644 --- a/lib/status.js +++ b/lib/status.js @@ -14,10 +14,6 @@ module.exports = { sent: '1', aborted: '2' }, - // receive: { - // notreceived: '0', - // received: '1' - // }, watch: { unseen: '0', seen: '1', diff --git a/lib/topics.js b/lib/topics.js index 199d9b9..113eb9b 100644 --- a/lib/topics.js +++ b/lib/topics.js @@ -3,11 +3,10 @@ * @module topics */ -module.exports = exports = { +const topics = { newobj: 'newobj', archiveobj: 'archiveobj', unarchiveobj: 'unarchiveobj', - // setidentity: 'setidentity', addcontact: 'addcontact', tx: 'tx', newwatch: 'newwatch', @@ -19,8 +18,9 @@ module.exports = exports = { sendaborted: 'sendaborted', forget: 'forget' } +topics.reverse = Object.entries(topics).reduce((result, [key, value]) => { + result[value] = key + return result +}, {}) -exports.reverse = {} -for (let p in exports) { - exports.reverse[exports[p]] = p -} +module.exports = topics diff --git a/lib/typeforce.js b/lib/typeforce.js deleted file mode 100644 index 2980e8e..0000000 --- a/lib/typeforce.js +++ /dev/null @@ -1,26 +0,0 @@ - -/** - * typeforce wrapper, disabled in production mode - * @module typeforce - */ - -const extend = require('lodash/extend') -const typeforce = require('typeforce') -const debug = require('debug')('tradle:debug') - -module.exports = extend(function typeforceWithDebug () { - if (!debug.enabled) return typeforce.apply(typeforce, arguments) - - try { - return typeforce.apply(typeforce, arguments) - } catch (err) { - debug('typecheck failed: ' + getStack(err), arguments) - throw err - } -}, typeforce) - -function getStack (err) { - if (err.__error) return err.__error.stack - - return err.stack -} diff --git a/lib/types.js b/lib/types.js index c84fcf5..83ac6fe 100644 --- a/lib/types.js +++ b/lib/types.js @@ -1,85 +1,15 @@ - /** * complex types used in type checks throughout the library - * @module types */ -const typeforce = require('./typeforce') -const extend = require('lodash/extend') +const typeforce = require('@tradle/typeforce') const protocol = require('@tradle/protocol') const constants = require('@tradle/constants') const { - SIG, TYPE, - PERMALINK, - LINK, } = constants -const types = exports - -extend(exports, protocol.types) - -exports.bufferOrString = typeforce.oneOf(typeforce.Buffer, typeforce.String) - -// exports.hasRootHash = function hasPermalink (value) { -// return !!value[PERMALINK] -// } - -/** - * @typedef {Object} identifier - */ -exports.identifier = typeforce.compile({ - permalink: typeforce.String -}) - -/** - * @typedef {Object} pubKey - */ -exports.pubKey = typeforce.compile({ - fingerprint: typeforce.String, - purpose: typeforce.String, - type: typeforce.String, - pub: typeforce.String, - networkName: typeforce.maybe(typeforce.String) -}) - -/** - * @typedef {Object} identity - */ -exports.identity = function identity (value) { - if (value[TYPE] !== constants.TYPES.IDENTITY) return false - - try { - typeforce({ - pubkeys: typeforce.arrayOf(types.pubKey) - }, value) - } catch (err) { - return false - } - - return true -} - -exports.transactor = typeforce.compile({ - send: typeforce.Function -}) - -/** - * @typedef {Object|Function} leveldown - */ -exports.leveldown = typeforce.oneOf(typeforce.Object, typeforce.Function) - -/** - * @typedef {Object} changes - */ -exports.changes = typeforce.compile({ - append: typeforce.Function -}) - -/** - * @typedef {Object} levelup - */ -exports.db = typeforce.compile({ +const db = typeforce.compile({ get: typeforce.Function, put: typeforce.Function, batch: typeforce.Function, @@ -87,90 +17,76 @@ exports.db = typeforce.compile({ close: typeforce.Function }) -// exports.logbase = typeforce.compile({ -// get: typeforce.Function, -// put: typeforce.Function, -// batch: typeforce.Function, -// createReadStream: typeforce.Function, -// close: typeforce.Function, -// live: typeforce.compile({ -// get: typeforce.Function, -// createReadStream: typeforce.Function -// }) -// }) - -/** - * @typedef {Object} Keeper - */ -exports.keeper = types.db - -/** - * @typedef {Object} objectInfo - */ -exports.objectInfo = typeforce.compile({ - object: types.object, - permalink: typeforce.String, - link: typeforce.String, - prevLink: typeforce.maybe(typeforce.String) -}) - -/** - * @typedef {Object} someObjectInfo - */ -exports.someObjectInfo = typeforce.compile({ - object: typeforce.maybe(types.signedObject), - permalink: typeforce.maybe(typeforce.String), - link: typeforce.maybe(typeforce.String), - prevLink: typeforce.maybe(typeforce.String) +const pubKey = typeforce.object({ + fingerprint: typeforce.String, + purpose: typeforce.String, + type: typeforce.String, + pub: typeforce.String, + networkName: typeforce.maybe(typeforce.String) }) -/** - * @typedef {Object} identityInfo - */ -exports.identityInfo = typeforce.compile({ - object: types.identity, - permalink: typeforce.String, - link: typeforce.String, - prevLink: typeforce.maybe(typeforce.String) +const identity = typeforce.object({ + [TYPE]: typeforce.value(constants.TYPES.IDENTITY), + pubkeys: typeforce.arrayOf(pubKey) }) -/** - * @typedef {Object} Blockchain - */ -exports.blockchainReader = typeforce.compile({ - transactions: typeforce.compile({ - get: typeforce.Function +module.exports = { + ...protocol.types, + bufferOrString: typeforce.anyOf(typeforce.Buffer, typeforce.String), + identifier: typeforce.object({ + permalink: typeforce.String + }), + pubKey, + identity, + transactor: typeforce.object({ + send: typeforce.Function }), - addresses: typeforce.compile({ - transactions: typeforce.Function + leveldown: typeforce.anyOf(typeforce.Object, typeforce.Function), + changes: typeforce.object({ + append: typeforce.Function + }), + db, + keeper: db, + objectInfo: typeforce.object({ + object: protocol.types.object, + permalink: typeforce.String, + link: typeforce.String, + prevLink: typeforce.maybe(typeforce.String) + }), + someObjectInfo: typeforce.object({ + object: typeforce.maybe(protocol.types.signedObject), + permalink: typeforce.maybe(typeforce.String), + link: typeforce.maybe(typeforce.String), + prevLink: typeforce.maybe(typeforce.String) + }), + identityInfo: typeforce.object({ + object: identity, + permalink: typeforce.String, + link: typeforce.String, + prevLink: typeforce.maybe(typeforce.String) + }), + blockchainReader: typeforce.object({ + transactions: typeforce.object({ + get: typeforce.Function + }), + addresses: typeforce.object({ + transactions: typeforce.Function + }) + }), + blockchainAdapter: typeforce.object({ + blockchain: typeforce.String, + name: typeforce.String, + pubKeyToAddress: typeforce.Function, + minOutputAmount: typeforce.Number, + createBlockchainAPI: typeforce.Function, + createTransactor: typeforce.Function + }), + seal: typeforce.object({ + basePubKey: protocol.types.chainPubKey, + link: typeforce.String + }), + blockchainIdentifier: typeforce.object({ + blockchain: typeforce.String, + networkName: typeforce.String }) -}) - -exports.blockchainAdapter = typeforce.compile({ - blockchain: typeforce.String, - name: typeforce.String, - pubKeyToAddress: typeforce.Function, - minOutputAmount: typeforce.Number, - createBlockchainAPI: typeforce.Function, - createTransactor: typeforce.Function -}) - -/** - * @typedef {Object} seal - */ -exports.seal = typeforce.compile({ - basePubKey: types.chainPubKey, - link: typeforce.String -}) - -// exports.wrapper = typeforce.compile({ -// object: types.signedObject, -// permalink: typeforce.String, -// link: typeforce.String, -// prevLink: typeforce.maybe(typeforce.String) -// }) - -exports.blockchainIdentifier = typeforce.compile({ - blockchain: typeforce.String, - networkName: typeforce.String -}) +} diff --git a/lib/utils.js b/lib/utils.js index bd13e0f..b8c5191 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -3,42 +3,35 @@ * @module utils * @augments tradle/protocol/lib/utils */ - -const crypto = require('crypto') // maybe we only need createHash const extend = require('lodash/extend') const clone = require('lodash/clone') const cloneDeep = require('lodash/cloneDeep') const groupBy = require('lodash/groupBy') const chunk = require('lodash/chunk') const partition = require('lodash/partition') -const collect = require('stream-collector') const once = require('once') const Stream = require('readable-stream') const Readable = Stream.Readable -const PassThrough = Stream.PassThrough -const pump = require('pump') const combine = require('stream-combiner2') const stringify = require('json-stable-stringify') const deepEqual = require('deep-equal') -const bs58check = require('bs58check') const async = require('async') -const subdown = require('subleveldown') const through = require('through2') const levelup = require('levelup') const levelErrors = require('level-errors') -const LiveStream = require('level-live-stream') const hydration = require('hydration') const mutexify = require('mutexify') -// const kiki = require('@tradle/kiki') -// const nkeyEC = require('nkey-ec') -// const nkeyBitcoin = require('nkey-bitcoin') -const nkeyImpls = loadNKeyImplementations() +const nkeyImpls = Object.freeze({ + get ec () { return require('nkey-ecdsa') }, + get curve25519 () { return require('nkey-curve25519') }, + get bitcoin () { return require('nkey-bitcoin') }, + get ethereum () { return require('nkey-ethereum') } +}) +const debug = require('debug')('tradle:utils') const protocol = require('@tradle/protocol') -const putils = require('@tradle/protocol/lib/utils') -const schema = require('./proto').schema -const typeforce = require('./typeforce') +const putils = require('@tradle/protocol/utils') +const typeforce = require('@tradle/typeforce') const constants = require('./constants') -const topics = require('./topics') const types = require('./types') const head = require('./head') const manifest = require('./manifest') @@ -47,13 +40,11 @@ const hydra = hydration() const { TYPE, TYPES, - PERMALINK, PREV_TO_RECIPIENT, LINK, PREVLINK, SIG, SEQ, - TIMESTAMP, AUTHOR, RECIPIENT } = constants @@ -64,12 +55,6 @@ const { PARTIAL } = TYPES -/** - * @constant - * @type {String} - * @default - */ -const DEFAULT_CURVE = 'p256' /** * @constant * @type {String} @@ -80,12 +65,33 @@ const DEFAULT_NETWORK = { ethereum: 'ropsten' } -const utils = exports - -;['omit', 'pick', 'asyncify', 'ecPubKeysAreEqual', 'assert', 'sign', 'parseSig'].forEach(method => { - utils[method] = putils[method] +const generateKeySetKeys = typeforce.arrayOf( + typeforce.object({ + type: typeforce.String, + purpose: typeforce.String + }) +) +const findPubKeyProps = typeforce.object({ + pub: types.bufferOrString +}) +const newIdentityOpts = typeforce.object({ + networks: typeforce.maybe(typeforce.Object), + keys: typeforce.maybe(typeforce.Array) +}) +const signeeOpts = typeforce.object({ + permalink: typeforce.String, + link: typeforce.String }) +const utils = exports + +exports.omit = require('lodash/omit') +exports.pick = require('lodash/pick') +exports.asyncify = putils.asyncify +exports.ecPubKeysAreEqual = putils.ecPubKeysAreEqual +exports.assert = putils.assert +exports.sign = putils.sign +exports.parseSig = putils.parseSig exports.defineGetter = defineGetter exports.stringify = stringify exports.deepEqual = deepEqual @@ -128,7 +134,7 @@ exports.mergeStreams = function mergeStreams (streams, compare) { return out - function done (cb) { + function done () { if (--togo) return arr.sort(compare).forEach(out.push, out) @@ -140,108 +146,10 @@ exports.notFoundErr = function notFoundErr () { return new levelErrors.NotFoundError() } -// exports.watchUID = function watchUID (opts) { -// typeforce({ -// address: typeforce.String, -// link: typeforce.String, -// watchType: typeforce.String -// }, opts) - -// return `watch:${opts.watchType}:${opts.address}:${opts.link}` -// } - -// exports.addBody = function addBody (keeper, wrapper, link, cb) { -// keeper.get(link, function (err, body) { -// if (err) return cb(err) - -// wrapper.object = body -// cb() -// }) -// } - -// exports.getSealAddresses = function (seal) { -// typeforce({ -// sealAddress: typeforce.String, -// sealPrevAddress: typeforce.maybe(typeforce.String) -// }, seal) - -// const arr = [seal.sealAddress] -// if (seal.sealPrevAddress) arr.push(seal) - -// return arr -// } - -// utils.sealUID = function sealUID (opts) { -// typeforce({ -// link: typeforce.String, -// networkName: typeforce.String, -// sealAddress: typeforce.maybe(typeforce.String), -// sealPrevAddress: typeforce.maybe(typeforce.String), -// sealPubKey: typeforce.maybe(types.chainPubKey), -// sealPrevPubKey: typeforce.maybe(types.chainPubKey) -// }, opts) - -// const sealAddress = opts.sealAddress -// || (opts.sealPubKey && utils.pubKeyToAddress(opts.sealPubKey, opts.networkName)) -// || '' - -// const sealPrevAddress = opts.sealPrevAddress -// || (opts.sealPrevPubKey && utils.pubKeyToAddress(opts.sealPrevPubKey, opts.networkName)) -// || '' - -// if (!(sealAddress || sealPrevAddress)) throw Error('expeted "sealAddress" or "sealPrevAddress"') - -// return `seal:${opts.networkName}:${sealAddress}:${sealPrevAddress}:${opts.link}` -// } - exports.uid = function (opts) { const links = utils.getLinks(opts) return links.permalink + ':' + links.link - - // const object = opts.object - // const link = utils.hexLink(opts.link || object) - // const permalink = opts.permalink || object[PERMALINK] || link - // return link + ':' + permalink -} - -// exports.prevUID = function (opts) { -// const links = utils.getLinks(opts) -// if (!links.prevLink) throw new Error('missing prevLink') - -// return links.permalink + ':' + links.prevLink -// } - -// exports.parseUID = function (uid) { -// const parts = uid.split(':') -// return { -// [PERMALINK]: parts[0], -// [LINK]: parts[1] -// } -// } - -// exports.getMsgID = function getMsgID (opts) { -// typeforce({ -// link: types.bufferOrString, -// sender: typeforce.bufferOrString, -// recipient: typeforce.bufferOrString -// }, opts) - -// return [ -// 'msg', -// utils.hex(opts.sender), -// utils.hex(opts.recipient), -// utils.hex(opts.link) -// ].join(':') -// } - -// exports.augment = function augment (wrapper, keeper, cb) { -// keeper.get(utils.hex(wrapper.link), function (err, obj) { -// if (err) return cb(err) - -// wrapper.object = obj -// cb(null, wrapper) -// }) -// } +} exports.isSigningKey = function isSigningKey (key) { if (key.type !== 'ec') return @@ -266,14 +174,10 @@ exports.isIdentityVersioningKey = function isIdentityVersioningKey (key) { } return true - // const purpose = key.purpose || key.get('purpose') - // return purpose === 'update' } exports.sigKey = keys => utils.find(keys, utils.isSigningKey, isPrivateKey) -// exports.sigKeys = keys => keys.filter(isSigningKey) - exports.sigPubKey = function (identity) { const key = utils.find(identity.pubkeys, utils.isSigningKey) return key && utils.toECKeyObj(key) @@ -286,25 +190,19 @@ exports.identityVersioningPubKey = function identityVersioningPubKey (identity) return key && utils.toECKeyObj(key) } -// exports.sigPubKeys = identity => identity.pubkeys.filter(utils.isSigningKey) - exports.chainKey = function (keys, chain) { return utils.find(keys, key => utils.isChainKey(key, chain), isPrivateKey) } -// exports.chainKeys = keys => keys.filter(utils.isChainKey) - exports.chainPubKey = function chainPubKey (identity, chain) { const key = utils.find(identity.pubkeys, key => utils.isChainKey(key, chain)) return key && utils.toECKeyObj(key) } -// exports.chainPubKeys = identity => identity.pubkeys.filter(utils.isChainKey) - exports.toECKeyObj = function toECKeyObj (key) { return { curve: getKeyCurve(key), - pub: new Buffer(key.pub, 'hex') + pub: Buffer.from(key.pub, 'hex') } } @@ -320,10 +218,8 @@ exports.bindFunctions = function bindFunctions (obj) { } exports.findPubKey = function (identity, props) { - typeforce(types.identity, identity) - typeforce({ - pub: types.bufferOrString - }, props) + types.identity.assert(identity) + findPubKeyProps.assert(props) return utils.find(identity.pubkeys, key => { for (let p in props) { @@ -374,15 +270,8 @@ exports.hexLink = function (object) { } exports.linkToBuf = function (link) { - return Buffer.isBuffer(link) ? link : new Buffer(link, 'hex') + return Buffer.isBuffer(link) ? link : Buffer.from(link, 'hex') } - -// utils.toBuffer = function (obj, enc) { -// return Buffer.isBuffer(obj) ? obj : -// typeof obj === 'string' ? new Buffer(obj, enc) : -// new Buffer(JSON.stringify(obj), enc) -// } - exports.filterStream = function (test) { return through.obj(function (data, enc, cb) { cb(null, test(data) ? data : null) @@ -396,8 +285,6 @@ exports.flatten = function (arr) { }, []) } -// exports.stringToObject = str => rebuf(JSON.parse(str)) - exports.opToBatch = function (op) { return op.batch ? op.batch : [op.value] } @@ -405,7 +292,7 @@ exports.opToBatch = function (op) { exports.pubKeyString = function (key) { if (typeof key === 'string') return key - typeforce(typeforce.Buffer, key.pub) + typeforce.Buffer.assert(key.pub) return key.pub.toString('hex') } @@ -427,28 +314,12 @@ exports.maybeAddPrev = function maybeAddPrev (node, wrapper, cb) { const prevLink = wrapper.object[PREVLINK] if (!prevLink) return cb() - // const uid = utils.prevUID(wrapper) node.objects.get({ link: prevLink }, function (err, prev) { - // if (err) return cb(err) - wrapper.prev = prev cb() }) } -// exports.xor = function (a, b) { -// if (typeof a !== 'number') a = a ? 1 : 0 -// if (typeof b !== 'number') b = b ? 1 : 0 - -// return a ^ b -// } - -// exports.addAuthors = function addAuthors (wrappers, addressBook, cb) { -// async.each(wrappers, function iterator (wrapper, done) { -// utils.addAuthor(wrapper, addressBook, done) -// }, cb) -// } - exports.addRecipient = function addRecipient (node, wrapper, cb) { if (wrapper.object[TYPE] !== MESSAGE) return cb() @@ -510,7 +381,7 @@ exports.subdebugger = function (debug, name) { // accept `node` or string if (name.name) name = name.name - typeforce(typeforce.String, name) + typeforce.String.assert(name) return function () { utils.subdebug(debug, name, arguments) } @@ -601,20 +472,7 @@ exports.getPartialInfo = function getPartialInfo (node, wrapper, cb) { } } -// exports.identityIndices = function identityIndices (identityInfo) { -// typeforce(types.identityInfo, identityInfo) -// const keys = identityInfo.object.pubkeys -// return keys.map(key => key.pub) -// .concat(keys.map(key => key.fingerprint)) -// .concat(identityInfo.link) -// } - exports.claimedSigPubKey = function (object) { - // const sig = object[TYPE] === PARTIAL - // // get signature of original object - // ? utils.find(object.properties, p => p === SIG).value - // : object[SIG] || object - const sig = object[SIG] || object return protocol.utils.parseSig(sig).pubKey } @@ -645,35 +503,6 @@ exports.sign = function (data, key) { return utils.importKey(key).signSync(data) } -// exports.verifyAuthor = function verifyAuthor (wrapper) { -// const signingKey = utils.getSigPubKey(wrapper.object) -// if (!signingKey) throw new Error('bad signature') - -// // key encoding should really be recorded in each key in an identity -// signingKey.pub = utils.hex(signingKey.pub) -// const hasKey = wrapper.author.object.pubkeys.some(function (key) { -// for (let p in signingKey) { -// if (signingKey[p] !== key[p]) { -// return false -// } -// } - -// return true -// }) - -// if (!hasKey) throw new Error('wrong author') -// } - -// exports.execAsync = function (fn, cb) { -// try { -// var result = fn() -// } catch (err) { -// return cb(err) -// } - -// cb(null, result) -// } - exports.saveToKeeper = function saveToKeeper (keeper, wrappers, cb) { const batch = wrappers.map(w => { return { @@ -732,11 +561,6 @@ exports.levelup = function (path, opts) { return levelup(path, opts) } -// exports.alphabetical = function alphabetical (a, b) { -// return a < b ? -1 : -// a > b ? 1 : 0 -// } - /** * monkey-patch `obj` to ensure async `methods` of `obj` never overlap * @static @@ -800,7 +624,6 @@ exports.printStack = function () { * @returns {Array} */ exports.defaultKeySet = function defaultKeySet (networks) { - // networkName = networkName || DEFAULT_NETWORK const networkKeys = Object.keys(networks).map(chainName => { const networkNames = networks[chainName] || DEFAULT_NETWORK[chainName] const keyDefs = [].concat(networkNames).map(networkName => ([ @@ -812,12 +635,9 @@ exports.defaultKeySet = function defaultKeySet (networks) { }) return [ - // { type: 'bitcoin', purpose: 'payment', networkName: networkName }, - // { type: 'bitcoin', purpose: 'messaging', networkName: networkName }, { type: 'ec', purpose: 'sign', curve: 'p256' }, { type: 'ec', purpose: 'update', curve: 'p256' }, - { type: 'ec', purpose: 'tls', curve: 'curve25519' } - // { type: 'dsa', purpose: 'sign' } + { type: 'ec', purpose: 'tls', curve: 'curve25519' } ].concat(utils.flatten(networkKeys)) } @@ -839,10 +659,7 @@ exports.generateDefaultKeySet = function generateDefaultKeySet (networks) { * @returns {Array} */ exports.generateKeySet = function generateKeySet (keys) { - keys.forEach(key => typeforce({ - type: typeforce.String, - purpose: typeforce.String - }, key)) + generateKeySetKeys.assert(keys) return keys.map(k => { if ((k.type === 'bitcoin' || k.type === 'ethereum') && !k.networkName) { @@ -901,10 +718,7 @@ exports.importKey = function (key) { * @param {Function} cb */ exports.newIdentity = function newIdentity (opts, cb) { - typeforce({ - networks: typeforce.maybe(typeforce.Object), - keys: typeforce.maybe(typeforce.Array) - }, opts) + newIdentityOpts.assert(opts) let keys if (opts.keys) { @@ -945,10 +759,7 @@ exports.newIdentityForKeys = function newIdentityForKeys (keys, cb) { } exports.signee = function signee (opts) { - typeforce({ - permalink: typeforce.String, - link: typeforce.String - }, opts) + signeeOpts.assert(opts) return opts.permalink + ':' + opts.link } @@ -1047,232 +858,6 @@ exports.getMessageCustomProps = function (msg) { ]) } -/** - * serialize a message object to a Buffer - * @static - * @param {Object} msg - * @return {Buffer} - */ -// exports.serializeMessage = function (msg) { -// var copy = {} -// var other = utils.getMessageCustomProps(msg) -// for (var p in msg) { -// var val = msg[p] -// switch (p) { -// case TYPE: -// break -// case SEQ: -// case TIMESTAMP: -// copy[p] = val -// break -// case 'object': -// copy[p] = new Buffer(stringify(val)) -// break -// case SIG: -// copy[p] = protocol.utils.parseSig(val) -// break -// case AUTHOR: -// case RECIPIENT: -// case PREV_TO_RECIPIENT: -// copy[p] = new Buffer(val, 'hex') -// break -// case 'seal': -// copy.seal = { -// blockchain: val.blockchain, -// network: val.network, -// basePubKey: val.basePubKey, -// link: new Buffer(val.link, 'hex'), -// headerHash: new Buffer(val.headerHash, 'hex'), -// } - -// break -// } -// } - -// if (Object.keys(other).length) { -// copy.other = new Buffer(JSON.stringify(other)) -// } - -// return schema.Message.encode(copy) -// } - -/** - * unserialize a message Buffer to a message object - * @static - * @param {Buffer} msg - * @return {Object} - */ -// exports.unserializeMessage = function (msg) { -// msg = schema.Message.decode(msg) -// utils.cleanupDecodedProtobuf(msg) - -// for (var p in msg) { -// var val = msg[p] -// if (val == null) { -// delete msg[p] -// continue -// } - -// switch (p) { -// case 'other': -// break -// case 'object': -// msg[p] = JSON.parse(val) -// maybeParseEmbeddedMessage(msg[p]) -// break -// case SIG: -// msg[p] = protocol.utils.sigToString(protocol.utils.encodeSig(val)) -// break -// case AUTHOR: -// case RECIPIENT: -// case PREV_TO_RECIPIENT: -// msg[p] = val.toString('hex') -// break -// case 'seal': -// // val.network = SchemaNetworkToName[val.network] -// val.link = val.link.toString('hex') -// val.headerHash = val.headerHash.toString('hex') -// break -// } -// } - -// msg[TYPE] = MESSAGE -// if (msg.other) { -// utils.extend(msg, JSON.parse(msg.other)) -// delete msg.other -// } - -// if (msg.time === 0) { -// // this is a message from @tradle/engine -// // before 'time' was introduced -// delete msg.time -// } - -// return msg -// } - -// var SERIALIZABLE_IDENTITY_PROPS = [ -// TYPE, SIG, PERMALINK, PREVLINK, 'pubkeys' -// ] - -/** - * compact serialization of an identity object - * @static - * @param {identity} identity - * @return {Buffer} - */ -// exports.serializeIdentity = function (identity) { -// for (var p in identity) { -// if (SERIALIZABLE_IDENTITY_PROPS.indexOf(p) === -1) { -// throw new Error('identity not serializable') -// } -// } - -// const formatted = { -// [SIG]: new Buffer(identity[SIG], 'base64'), -// pubkeys: identity.pubkeys.map(utils.toCompactPubKey) -// } - -// if (identity[PERMALINK]) formatted[PERMALINK] = new Buffer(identity[PERMALINK], 'hex') -// if (identity[PREVLINK]) formatted[PREVLINK] = new Buffer(identity[PREVLINK], 'hex') - -// return schema.Identity.encode(formatted) -// } - -/** - * unserialize a serialized identity - * @static - * @param {Buffer} encoded - * @return {identity} - */ -// exports.deserializeIdentity = -// exports.unserializeIdentity = function (encoded) { -// const identity = schema.Identity.decode(encoded) -// utils.cleanupDecodedProtobuf(identity) -// identity[SIG] = identity[SIG].toString('base64') -// identity[TYPE] = IDENTITY -// if (identity[PERMALINK]) identity[PERMALINK] = identity[PERMALINK].toString('hex') -// if (identity[PREVLINK]) identity[PREVLINK] = identity[PREVLINK].toString('hex') - -// identity.pubkeys = identity.pubkeys.map(utils.deserializePubKey) -// return identity -// } - -// exports.toCompactPubKey = function (key) { -// const compact = { -// purpose: schema.KeyPurpose[key.purpose], -// type: schema.KeyType[key.type], -// pub: new Buffer(key.pub, key.type === 'dsa' ? 'base64' : 'hex') -// } - -// if ('curve' in key) { -// compact.curve = key.curve && schema.ECurve[key.curve] -// } - -// if ('networkName' in key) { -// compact.network = +utils.keyByValue(SchemaNetworkToName, key.networkName) -// } - -// if ('fingerprint' in key) { -// compact.fingerprint = key.type === 'bitcoin' -// ? bs58check.decode(key.fingerprint) -// : new Buffer(key.fingerprint, 'hex') -// } - -// return compact -// } - -// exports.serializePubKey = function (key) { -// return schema.PubKey.encode(utils.toCompactPubKey(key)) -// } - -// this uses bitcoinjs-lib's names for bitcoin networks -// const SchemaNetworkToName = { -// [schema.Network.btcmain]: 'bitcoin', -// [schema.Network.btctest]: 'testnet', -// [schema.Network.ethmain]: 'mainnet', -// [schema.Network.ethropsten]: 'ropsten', -// [schema.Network.ethmorden]: 'morden', -// [schema.Network.ethrinkeby]: 'rinkeby', -// } - -// exports.deserializePubKey = -// exports.unserializePubKey = function (serialized) { -// const compact = Buffer.isBuffer(serialized) ? schema.PubKey.decode(serialized) : serialized -// utils.cleanupDecodedProtobuf(compact) - -// const key = { -// type: utils.keyByValue(schema.KeyType, compact.type), -// purpose: utils.keyByValue(schema.KeyPurpose, compact.purpose), -// pub: compact.type === schema.KeyType.dsa -// ? compact.pub.toString('base64') -// : compact.pub.toString('hex') -// } - -// const networkName = SchemaNetworkToName[compact.network] -// if (networkName) { -// key.networkName = networkName -// } - -// if (compact.curve === schema.ECurve.none) { -// if (compact.type === 'ec') throw new Error('key is missing curve') - -// delete compact.curve -// } else { -// key.curve = utils.keyByValue(schema.ECurve, compact.curve) -// } - -// if ('fingerprint' in compact) { -// key.fingerprint = key.type === 'bitcoin' -// ? bs58check.encode(compact.fingerprint) -// : compact.fingerprint.toString('hex') -// } else { -// key.fingerprint = utils.importKey(key).fingerprint -// } - -// return key -// } - exports.cleanupDecodedProtobuf = function (decoded) { for (var p in decoded) { const val = decoded[p] @@ -1323,7 +908,7 @@ exports.throttledQueue = (millis) => { try { queue.shift()() } catch (err) { - myDebug('throttled blockchain call failed', err.message) + debug('throttled blockchain call failed', err.message) } timeout = utils.timeout(pollQueue, millis) @@ -1338,36 +923,6 @@ exports.throttledQueue = (millis) => { } } -// function toBuffer (object) { -// if (Buffer.isBuffer(object)) return object -// if (typeof object === 'object') object = protocol.stringify(object) -// if (typeof object === 'string') object = new Buffer(object) - -// return object -// } - -function truthy (obj) { - return !!obj -} - -// function rebuf (json) { -// if (Object.prototype.toString.call(json) !== '[object Object]') return json - -// if (json && -// json.type === 'Buffer' && -// json.data && -// !Buffer.isBuffer(json) && -// Object.keys(json).length === 2) { -// return new Buffer(json.data) -// } else { -// for (var p in json) { -// json[p] = rebuf(json[p]) -// } - -// return json -// } -// } - function getKeyProp (key, prop) { if (prop === 'type') return key.type if (typeof key.get === 'function') return key.get(prop) @@ -1379,21 +934,6 @@ function isPrivateKey (key) { return !!key.priv || (typeof key.sign === 'function' && key.isPrivateKey) } -function loadNKeyImplementations () { - const impls = {} - defineGetter(impls, 'ec', () => require('nkey-ecdsa')) - defineGetter(impls, 'curve25519', () => require('nkey-curve25519')) - defineGetter(impls, 'bitcoin', () => require('nkey-bitcoin')) - defineGetter(impls, 'ethereum', () => require('nkey-ethereum')) - return impls -} - -function maybeParseEmbeddedMessage (obj) { - if (obj[TYPE] !== MESSAGE) return - - maybeParseEmbeddedMessage(obj.object) -} - function getKeyCurve (key) { if (key.curve) return key.curve diff --git a/lib/validator.js b/lib/validator.js index ac4f579..a5e54f5 100644 --- a/lib/validator.js +++ b/lib/validator.js @@ -2,14 +2,11 @@ * @module validator */ -const typeforce = require('./typeforce') const async = require('async') const protocol = require('@tradle/protocol') const constants = require('./constants') const utils = require('./utils') -const types = require('./types') const errors = require('./errors') -const MESSAGE_TYPE = require('./constants').TYPES.MESSAGE const { PERMALINK, PREVLINK, @@ -50,13 +47,6 @@ module.exports = function validator (node) { async.series(tasks, function (err) { if (err) return cb(err) checkMore(wrapper, cb) - // try { - // checkPrev(wrapper, cb) - // } catch (err2) { - // return cb(err2) - // } - - // checkAuthentic(wrapper, cb) }) } @@ -66,7 +56,6 @@ module.exports = function validator (node) { }) } - // function checkPrev (wrapper, cb) { function checkMore (wrapper, cb) { const object = wrapper.object const prev = wrapper.prev @@ -77,7 +66,6 @@ module.exports = function validator (node) { checkAuthentic(wrapper, cb) return } - debugger // Check if the object was submitted from user's another device let _masterAuthor = object._masterAuthor || object._author node.addressBook.lookupIdentity(_masterAuthor, (err, identity) => { @@ -95,7 +83,8 @@ module.exports = function validator (node) { }) } - function checkPrev(masterIdentity, object, prev) { + function checkPrev (masterIdentity, object, prev) { + let otherAuthor if (masterIdentity[PERMALINK] === prev.author) otherAuthor = masterIdentity else { @@ -154,48 +143,3 @@ module.exports = function validator (node) { }) } } - // function validate (wrapper, cb) { - // utils.addLinks(wrapper) - - // const isMsg = wrapper.object[TYPE] === MESSAGE_TYPE - // node.objects.get(wrapper.link, function (err) { - // if (!err && isMsg) { - // return cb(new errors.ObjectExists({ link: wrapper.link })) - // } - - // // utils.extend(node, wrapper, opts) - // utils.loadBG(node, wrapper, function (err) { - // if (err) return cb(err) - - // const object = wrapper.object - // const sig = object[SIG] - // const link = wrapper.link - // let signingKey - // try { - // signingKey = utils.getSigPubKey(object) - // } catch (err) { - // } - - // if (!signingKey) return cb(new errors.InvalidSignature({ sig })) - - // if (!utils.hasPubKey(wrapper.author.object, signingKey)) { - // return cb(new errors.Author({ - // author: wrapper.author.link, - // sig: sig - // })) - // } - - // if (isMsg) { - // try { - // // TODO: msg.prev - // protocol.validateMessage({ object }) - // } catch (err) { - // return cb(err) - // } - // } - - // cb() - // }) - // }) - // } - diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b5e70a6..0000000 --- a/package-lock.json +++ /dev/null @@ -1,9085 +0,0 @@ -{ - "name": "@tradle/engine", - "version": "8.3.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true - }, - "@tradle/bitcoin-adapter": { - "version": "github:tradle/bitcoin-adapter#b1d6f09e1ff9acd865d71a5945938cbe50d1fa99", - "from": "github:tradle/bitcoin-adapter", - "dev": true, - "requires": { - "@tradle/bitcoinjs-lib": "^1.6.0", - "@tradle/cb-blockr": "^3.2", - "@tradle/simple-wallet": "^1.3.1", - "bs58check": "^2.0.1", - "xtend": "^4.0.1" - }, - "dependencies": { - "base-x": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", - "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - } - } - }, - "@tradle/bitcoinjs-lib": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@tradle/bitcoinjs-lib/-/bitcoinjs-lib-1.6.1.tgz", - "integrity": "sha512-jgdj6gom5hsvqhC3Y7a3UO0EygxTEDWyFULBVFRksRCUdXh+Z7MLbUi88w+zvb0GPzcSQw1PphDdea838Vtc8g==", - "requires": { - "bigi": "^1.4.0", - "bs58check": "^1.0.5", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "ecurve": "^1.0.0", - "randombytes": "^2.0.1", - "typeforce": "^1.0.0" - } - }, - "@tradle/cb-blockr": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@tradle/cb-blockr/-/cb-blockr-3.2.1.tgz", - "integrity": "sha1-B17bkxeXDQfo8uvVR3ymb5IgYfI=", - "dev": true, - "requires": { - "@tradle/bitcoinjs-lib": "^1.5.7", - "async": "^0.9.0", - "superagent": "^1.2.0", - "throttleme": "^1.0.3" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - } - } - }, - "@tradle/constants": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@tradle/constants/-/constants-2.5.0.tgz", - "integrity": "sha512-FhfzpUE8dZO3xEXoQHFWZxewDLdckcjbBPKWRUX2JbqqrbDflaq49YatgWbtiVK5qoBfEt2M4ENq5GIbrBac+A==" - }, - "@tradle/ethereum-adapter": { - "version": "file:../ethereum-adapter", - "dev": true, - "requires": { - "async": "^2.1.5", - "debug": "^3.0.1", - "ethereumjs-util": "^5.1.1", - "ethereumjs-wallet": "github:mvayngrib/ethereumjs-wallet", - "object.omit": "^2.0.1", - "request": "^2.81.0", - "web3-provider-engine": "github:mvayngrib/provider-engine", - "xhr": "^2.4.0", - "xtend": "^4.0.1" - } - }, - "@tradle/keeper": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@tradle/keeper/-/keeper-3.4.0.tgz", - "integrity": "sha512-kAlGZNISVtkidVt2sXutBb2sNr/NYp1do/jnRSRDPz64PcPAOf1fVkuTGrRX0/44q+6/s9xjdy4jVw7hPq9YGQ==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "error": "^7.0.2", - "level-encrypt": "^3.2.0", - "levelup": "^1.3.2", - "lru-cache": "^4.0.1" - } - }, - "@tradle/otr": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/@tradle/otr/-/otr-0.2.17.tgz", - "integrity": "sha1-MN0XAr/EXez+Td7zn5SUiWHmQ5g=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "inherits": "^2.0.1", - "webworker-threads": "~0.4.13" - } - }, - "@tradle/protocol": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@tradle/protocol/-/protocol-4.2.0.tgz", - "integrity": "sha1-6BRCC3xFglB44aYiCQ33XeH27Lg=", - "dev": true, - "requires": { - "@tradle/constants": "^2.4.0", - "elliptic": "^6.3.1", - "error-ex": "^1.3.1", - "flat-tree": "1.4.0", - "json-stable-stringify": "^1.0.1", - "merkle-proofs": "^1.0.3", - "merkle-tree-stream": "github:mvayngrib/merkle-tree-stream#finalize", - "protocol-buffers": "^3.1.6", - "secp256k1": "^3.0.1", - "traverse": "^0.6.6", - "typeforce": "^1.6.2", - "xtend": "^4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "merkle-tree-stream": { - "version": "github:mvayngrib/merkle-tree-stream#ef1abd6b566a410f8cdc7190f0966b97f403e290", - "from": "github:mvayngrib/merkle-tree-stream#finalize", - "dev": true, - "requires": { - "flat-tree": "^1.3.0", - "readable-stream": "^2.0.5" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "@tradle/simple-wallet": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@tradle/simple-wallet/-/simple-wallet-1.3.2.tgz", - "integrity": "sha512-MfdQf4lddbgX1wgJE2QKAS4/sTGV29Ec8R2G4VqBzFm4GIlb7tms8K8XtukyI/OF0Cv3VAZ8nIJlbrxn8AetnA==", - "dev": true, - "requires": { - "@tradle/bitcoinjs-lib": "^1.5.7", - "@tradle/spender": "^1.2.1", - "deep-equal": "^1.0.0", - "typeforce": "^1.0.0" - } - }, - "@tradle/spender": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@tradle/spender/-/spender-1.2.1.tgz", - "integrity": "sha1-9GIdSDUAdUfC1g1qj/hfQLjC3HE=", - "dev": true, - "requires": { - "@tradle/bitcoinjs-lib": "^1.5.7", - "dezalgo": "^1.0.3" - } - }, - "@tradle/test-helpers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@tradle/test-helpers/-/test-helpers-1.3.0.tgz", - "integrity": "sha1-DlW/y8LxYDawvrw01RrpGXBTt7A=", - "dev": true, - "requires": { - "@tradle/bitcoinjs-lib": "^1.5.7", - "@tradle/simple-wallet": "^1.0.0", - "@tradle/utils": "^1.0.0", - "q": "^1.4.1", - "typeforce": "^1.0.0" - } - }, - "@tradle/utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@tradle/utils/-/utils-1.3.0.tgz", - "integrity": "sha1-NpgafXUVabmU60djL7Kzx1VjzF0=", - "dev": true, - "requires": { - "@tradle/bitcoinjs-lib": "^1.5.7", - "bn.js": "^4.1.1", - "compute-cluster": "0.0.9", - "create-torrent": "^3.5.1", - "defaults": "^1.0.0", - "elliptic": "^6.0.1", - "json-stable-stringify": "^1.0.0", - "parse-torrent": "^3.0.0", - "typeforce": "^1.6.1", - "xtend": "^4.0.1" - } - }, - "@tradle/wire": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@tradle/wire/-/wire-1.2.0.tgz", - "integrity": "sha1-To2mod94qDwzCSIDnLJFjXW8GfM=", - "dev": true, - "requires": { - "bindall": "^2.0.1", - "debug": "^2.2.0", - "duplexify": "^3.4.5", - "forward-secrecy": "github:tradle/forward-secrecy#dev", - "length-prefixed-stream": "^1.5.0", - "protocol-buffers": "^3.1.6", - "pump": "^1.0.1", - "readable-stream": "^2.1.4", - "through2": "^2.0.1", - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "forward-secrecy": { - "version": "github:tradle/forward-secrecy#5ad4c2ee429db4b10599efbd41c650b9debbf7fe", - "from": "github:tradle/forward-secrecy#dev", - "dev": true, - "requires": { - "pbkdf2-sha256": "^1.1.0", - "tweetnacl": "^0.13.1" - }, - "dependencies": { - "tweetnacl": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", - "integrity": "sha1-1ii1bzvMPVrnS6nUwacE3vWrS1Y=", - "dev": true - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - } - } - }, - "abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "requires": { - "xtend": "~3.0.0" - }, - "dependencies": { - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } - }, - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "~2.1.11", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "aes-js": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-0.2.4.tgz", - "integrity": "sha1-lLiBq3FyhtAV+iGeCPtmcJ3aWj0=", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "requires": { - "async": "^2.4.0" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "requires": { - "precond": "0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base-x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-1.1.0.tgz", - "integrity": "sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w=" - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.2.tgz", - "integrity": "sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q=" - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - } - } - }, - "bencode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.1.tgz", - "integrity": "sha512-2uhEl8FdjSBUyb69qDTgOEeeqDTa+n3yMQzLW0cOzNf1Ow5bwcg3idf+qsWisIKRH8Bk8oC7UXL8irRcPA8ZEQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "bigi": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", - "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=" - }, - "bindall": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bindall/-/bindall-2.0.1.tgz", - "integrity": "sha1-1xu/y8H/mblpyCDE3m7Qh0U2Z9g=", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bip39": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.2.0.tgz", - "integrity": "sha1-QOc/cGdMJn8UjNv4N08qUL4Waw0=", - "dev": true, - "requires": { - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.0", - "randombytes": "^2.0.1", - "unorm": "^1.3.3" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "block-stream2": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-1.1.0.tgz", - "integrity": "sha1-xzjjqRupd+u14f70MeE8oR2GOeI=", - "dev": true, - "requires": { - "defined": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "boom": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", - "dev": true, - "optional": true, - "requires": { - "hoek": "0.9.x" - } - }, - "bops": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bops/-/bops-0.1.1.tgz", - "integrity": "sha1-Bi4CqNqoAfoQ8uXb5nQM/4Af4X4=", - "requires": { - "base64-js": "0.0.2", - "to-utf8": "0.0.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "requires": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-sha3": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", - "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", - "dev": true, - "requires": { - "js-sha3": "^0.6.1", - "safe-buffer": "^5.1.1" - } - }, - "bs58": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-3.1.0.tgz", - "integrity": "sha1-1MJjiL9IBMrHFBQbGUWqR+XrJI4=", - "requires": { - "base-x": "^1.1.0" - } - }, - "bs58check": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-1.3.4.tgz", - "integrity": "sha1-xSVABzdJEXcU+gQsMEfrj5FRy/g=", - "requires": { - "bs58": "^3.1.0", - "create-hash": "^1.1.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "bytewise": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-0.7.1.tgz", - "integrity": "sha1-Q6R512PIUlbVRnyP4FpzT08urC4=", - "requires": { - "bops": "~0.1.0" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "catharsis": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", - "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "changes-feed": { - "version": "github:mvayngrib/changes-feed#ac8d4e47ec8ec3fe3242ccbc0ae717efb93e99b3", - "from": "github:mvayngrib/changes-feed", - "requires": { - "from2": "^1.3.0", - "lexicographic-integer": "^1.1.0", - "pump": "^1.0.0", - "stream-collector": "^1.0.1", - "through2": "^0.6.3", - "thunky": "^0.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", - "dev": true, - "requires": { - "functional-red-black-tree": "^1.0.1" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "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": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": 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 - }, - "codecov.io": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/codecov.io/-/codecov.io-0.1.6.tgz", - "integrity": "sha1-Wd/QLaH/McL7K5Uq2K0W/TeBtyg=", - "dev": true, - "requires": { - "request": "2.42.0", - "urlgrey": "0.4.0" - }, - "dependencies": { - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "dev": true, - "optional": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", - "dev": true, - "optional": true - }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26" - } - }, - "caseless": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", - "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ=", - "dev": true - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "0.0.5" - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", - "dev": true - }, - "form-data": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", - "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", - "dev": true, - "optional": true, - "requires": { - "async": "~0.9.0", - "combined-stream": "~0.0.4", - "mime": "~1.2.11" - } - }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "dev": true, - "optional": true, - "requires": { - "asn1": "0.1.11", - "assert-plus": "^0.1.5", - "ctype": "0.5.3" - } - }, - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", - "dev": true - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, - "oauth-sign": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", - "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k=", - "dev": true, - "optional": true - }, - "qs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", - "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "request": { - "version": "2.42.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz", - "integrity": "sha1-VyvQFIk4VkBArHqxSLlkI6BjMEo=", - "dev": true, - "requires": { - "aws-sign2": "~0.5.0", - "bl": "~0.9.0", - "caseless": "~0.6.0", - "forever-agent": "~0.5.0", - "form-data": "~0.1.0", - "hawk": "1.1.1", - "http-signature": "~0.10.0", - "json-stringify-safe": "~5.0.0", - "mime-types": "~1.0.1", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.4.0", - "qs": "~1.2.0", - "stringstream": "~0.0.4", - "tough-cookie": ">=0.12.0", - "tunnel-agent": "~0.4.0" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, - "coinstring": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", - "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", - "dev": true, - "requires": { - "bs58": "^2.0.1", - "create-hash": "^1.1.1" - }, - "dependencies": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=", - "dev": true - } - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compute-cluster": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/compute-cluster/-/compute-cluster-0.0.9.tgz", - "integrity": "sha1-+GIoK0IL928/+XVuANFu1TM8H+0=", - "dev": true, - "requires": { - "vows": "0.6.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 - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookiejar": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", - "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", - "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=" - }, - "coveralls": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", - "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", - "dev": true, - "requires": { - "js-yaml": "3.6.1", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.79.0" - }, - "dependencies": { - "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 - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "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.x.x" - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": 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, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "commander": "^2.9.0", - "is-my-json-valid": "^2.12.4", - "pinkie-promise": "^2.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "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, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "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 - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1", - "uuid": "^3.0.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-torrent": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/create-torrent/-/create-torrent-3.33.0.tgz", - "integrity": "sha512-KMd0KuvwVUg1grlRd5skG9ZkSbBYDDkAjDUMLnvxdRn0rL7ph3IwoOk7I8u1yLX4HYjGiLVlWYO55YWNNPjJFA==", - "dev": true, - "requires": { - "bencode": "^2.0.0", - "block-stream2": "^1.0.0", - "filestream": "^4.0.0", - "flatten": "^1.0.2", - "is-file": "^1.0.0", - "junk": "^2.1.0", - "minimist": "^1.1.0", - "multistream": "^2.0.2", - "once": "^1.3.0", - "piece-length": "^1.0.0", - "readable-stream": "^3.0.2", - "run-parallel": "^1.0.0", - "simple-sha1": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "cryptiles": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", - "dev": true, - "optional": true, - "requires": { - "boom": "0.4.x" - } - }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==", - "dev": true - }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "dev": true, - "optional": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "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" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deeper": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deeper/-/deeper-2.1.0.tgz", - "integrity": "sha1-vFZOX3MXT98gHgiwADDooU2nQ2g=", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - } - } - }, - "deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", - "requires": { - "abstract-leveldown": "~0.12.1" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" - }, - "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 - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", - "dev": true - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", - "dev": true - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "dev": true, - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecurve": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ecurve/-/ecurve-1.0.6.tgz", - "integrity": "sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w==", - "requires": { - "bigi": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.5.tgz", - "integrity": "sha512-j1DWIcktw4hRwrv6nWx++5nFH2X64x16MAG2P0Lmi5Dvdfi3I+Jhc7JKJIdAmDJa+5aZ/imHV7dWRPy2Cqjh3A==", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "~1.1.5" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-client": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.5.tgz", - "integrity": "sha512-AYTgHyeVUPitsseqjoedjhYJapNVoSPShbZ+tEUX9/73jgZ/Z3sUlJf9oYgdEBBdVhupUpUqSxH0kBCXlQnmZg==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~1.1.5", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "error": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", - "requires": { - "string-template": "~0.2.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.15.0.tgz", - "integrity": "sha1-vcxqbF/+CBYOe5PAZmlTYqkeMPI=", - "dev": true, - "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.4.6", - "debug": "^2.1.1", - "doctrine": "^1.2.2", - "escope": "^3.6.0", - "espree": "^3.4.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "ethereumjs-testrpc": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-3.0.3.tgz", - "integrity": "sha1-gwSAMQ3AI1UwW2dLwQBLqKZJtE0=", - "dev": true, - "requires": { - "async": "~1.5.0", - "bignumber.js": "~2.1.4", - "bip39": "~2.2.0", - "ethereumjs-account": "~2.0.4", - "ethereumjs-block": "~1.2.2", - "ethereumjs-tx": "1.1.2", - "ethereumjs-util": "~4.5.0", - "ethereumjs-vm": "~2.0.1", - "ethereumjs-wallet": "~0.6.0", - "fake-merkle-patricia-tree": "~1.0.1", - "heap": "~0.2.6", - "merkle-patricia-tree": "~2.1.2", - "seedrandom": "~2.4.2", - "shelljs": "~0.6.0", - "solc": "0.4.6", - "web3": "~0.16.0", - "web3-provider-engine": "~8.1.0", - "yargs": "~3.29.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "bignumber.js": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.1.4.tgz", - "integrity": "sha1-KbO7aT27I46Ity6sL7iWUIiLLVk=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "ethereum-common": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.16.tgz", - "integrity": "sha1-mh4Wnq00q3XgifUMpRK/0PvRJlU=", - "dev": true - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-block": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.2.2.tgz", - "integrity": "sha1-LsdTSlkCG47JuDww5JaQxuuu3aE=", - "dev": true, - "requires": { - "async": "^1.5.2", - "ethereum-common": "0.0.16", - "ethereumjs-tx": "^1.0.0", - "ethereumjs-util": "^4.0.1", - "merkle-patricia-tree": "^2.1.2" - } - }, - "ethereumjs-tx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.1.2.tgz", - "integrity": "sha1-wVFHfGIF0YYGAOKRCMPqyul+Kfo=", - "dev": true, - "requires": { - "ethereum-common": "^0.0.17", - "ethereumjs-util": "^4.5.0" - }, - "dependencies": { - "ethereum-common": { - "version": "0.0.17", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.17.tgz", - "integrity": "sha1-C1VMqdUSytyL4EVvvQAP/MOsT28=", - "dev": true - } - } - }, - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - }, - "ethereumjs-vm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.0.2.tgz", - "integrity": "sha1-hOI3KlcVqApi9/KjEvjGRTfoqEI=", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereum-common": "0.0.18", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "^1.2.2", - "ethereumjs-util": "^4.0.1", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", - "dev": true - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "merkle-patricia-tree": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.1.2.tgz", - "integrity": "sha1-ckSD1Ut1YxpI/t2lXhFAUXBqcpE=", - "dev": true, - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^4.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "shelljs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", - "dev": true - }, - "solc": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.6.tgz", - "integrity": "sha1-r6kpoc6vwCUs+7QhfI4rHasTnbc=", - "dev": true, - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "web3": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.16.0.tgz", - "integrity": "sha1-pFVBdc1GKUMDWx8dOUMvdBxrYBk=", - "dev": true, - "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#master", - "crypto-js": "^3.1.4", - "utf8": "^2.1.1", - "xmlhttprequest": "*" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#c7a38de919ed75e6fb6ba38051986e294b328df9", - "from": "git+https://github.com/debris/bignumber.js.git#master", - "dev": true - } - } - }, - "web3-provider-engine": { - "version": "8.1.19", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-8.1.19.tgz", - "integrity": "sha1-PMrpWt7O9VYy4qc7877mS35i/Pc=", - "dev": true, - "requires": { - "async": "^2.1.2", - "clone": "^2.0.0", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "^2.0.2", - "isomorphic-fetch": "^2.2.0", - "request": "^2.67.0", - "semaphore": "^1.0.3", - "solc": "^0.4.2", - "tape": "^4.4.0", - "web3": "^0.16.0", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", - "dev": true - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "dev": true, - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - } - } - }, - "yargs": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", - "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", - "dev": true, - "requires": { - "camelcase": "^1.2.1", - "cliui": "^3.0.3", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - }, - "dependencies": { - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - } - } - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.0.tgz", - "integrity": "sha1-gnY7Fpfuenlr5xVdqd+0my+Yz9s=", - "dev": true, - "requires": { - "aes-js": "^0.2.3", - "bs58check": "^1.0.8", - "ethereumjs-util": "^4.4.0", - "hdkey": "^0.7.0", - "scrypt.js": "^0.2.0", - "utf8": "^2.1.1", - "uuid": "^2.0.1" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", - "dev": true - }, - "externr": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/externr/-/externr-1.0.0.tgz", - "integrity": "sha1-4qdB98+aN/6ZGaAqVgsKCv5/oLo=", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, - "fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", - "dev": true, - "requires": { - "checkpoint-store": "^1.1.0" - } - }, - "falafel": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", - "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", - "requires": { - "acorn": "^7.1.1", - "foreach": "^2.0.5", - "isarray": "^2.0.1", - "object-keys": "^1.0.6" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "feed-indexer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/feed-indexer/-/feed-indexer-1.4.0.tgz", - "integrity": "sha512-XQ0HINbPl30xRrFsFOk60qMzwxy6znX+xV37AdQojPR7DmN07NIp2Adwg8NssTPJtrUIG6x5YvJOhXVLJ5MPvA==", - "requires": { - "level-change-processor": "github:mvayngrib/level-change-processor#7100404", - "level-errors": "^1.0.4", - "level-live-stream": "1.4.11", - "level-option-wrap": "^1.1.0", - "lexicographic-integer": "^1.1.0", - "pump": "^1.0.1", - "readable-stream": "^2.1.4", - "stream-collector": "^1.0.1", - "subleveldown": "^2.1.0", - "through2": "^2.0.1", - "xtend": "^4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, - "filestream": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/filestream/-/filestream-4.1.3.tgz", - "integrity": "sha1-lI/KregiH3FfXsrdxUhi+qrMkyU=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "typedarray-to-buffer": "^3.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flat-tree": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.4.0.tgz", - "integrity": "sha1-2XZVHoKbUPQqUhPJE8z52Bk1GB0=" - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "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.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "1.0.0-rc3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", - "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", - "dev": true, - "requires": { - "async": "^1.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.3" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "formidable": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.16.tgz", - "integrity": "sha1-SRbP38TL7QILJXpqlQWpqzjCzQ4=", - "dev": true - }, - "from2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-1.3.0.tgz", - "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "requires": { - "is-property": "^1.0.2" - } - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "requires": { - "is-property": "^1.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hawk": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", - "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", - "dev": true, - "optional": true, - "requires": { - "boom": "0.4.x", - "cryptiles": "0.2.x", - "hoek": "0.9.x", - "sntp": "0.2.x" - } - }, - "hdkey": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.7.1.tgz", - "integrity": "sha1-yu5L6BqneSHpCbjSKN0PKayu5jI=", - "dev": true, - "requires": { - "coinstring": "^2.0.0", - "secp256k1": "^3.0.1" - } - }, - "heap": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", - "dev": true, - "optional": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "hydration": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hydration/-/hydration-1.0.0.tgz", - "integrity": "sha1-pa3yKMrlNvTjkXzXhAMsIHYzF78=" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" - }, - "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-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-file/-/is-file-1.0.0.tgz", - "integrity": "sha1-KKRM+9nT2xkwRfIrZfzo7fliBZY=", - "dev": 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.0" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", - "dev": true - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", - "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "requires": { - "has-symbols": "^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 - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "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 - }, - "js-sha3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", - "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "js2xmlparser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz", - "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==", - "dev": true, - "requires": { - "xmlcreate": "^2.0.3" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdoc": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz", - "integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==", - "dev": true, - "requires": { - "@babel/parser": "^7.4.4", - "bluebird": "^3.5.4", - "catharsis": "^0.8.11", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.0", - "klaw": "^3.0.0", - "markdown-it": "^8.4.2", - "markdown-it-anchor": "^5.0.2", - "marked": "^0.7.0", - "mkdirp": "^0.5.1", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.0.1", - "taffydb": "2.6.2", - "underscore": "~1.9.1" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": 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 - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "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=", - "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 - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "junk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-2.1.0.tgz", - "integrity": "sha1-9DG0t/By3FAKXxDOf07HGTDnATQ=", - "dev": true - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "dev": true, - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - }, - "keccakjs": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", - "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", - "dev": true, - "requires": { - "browserify-sha3": "^0.0.4", - "sha3": "^1.2.2" - } - }, - "key-encoder": { - "version": "github:mvayngrib/key-encoder-js#d4574052671b6e10fbaf39d4cea36d90f151d15e", - "from": "github:mvayngrib/key-encoder-js", - "dev": true, - "requires": { - "asn1.js": "^4.10.1", - "bn.js": ">= 3.1.2 <5", - "elliptic": "^6.4.0" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "length-prefixed-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/length-prefixed-stream/-/length-prefixed-stream-1.6.0.tgz", - "integrity": "sha512-gsJvrb5giDqil/ScQ7fEoplsI2Ch4DwnvnfTW2EGl9KBW6Ekzn8JSNESObqNAeZD8HkSjEMvc5XjhuB66fsSZQ==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.0.0", - "readable-stream": "^2.0.0", - "varint": "^5.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "level-change-processor": { - "version": "github:mvayngrib/level-change-processor#7100404cfc465fd2428cf5f7e11f03fe241bd56b", - "from": "github:mvayngrib/level-change-processor#7100404", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^1.0.33" - } - }, - "level-codec": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-6.1.0.tgz", - "integrity": "sha1-9d8KmVgvdtrEOFUVGrb05NDWAEU=" - }, - "level-encrypt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/level-encrypt/-/level-encrypt-3.2.1.tgz", - "integrity": "sha1-VekjywOlfeoeZK3Wswo6sBVClCg=", - "dev": true, - "requires": { - "buffer": "^4.9.1", - "hydration": "^1.0.0", - "level-updown": "^2.0.2" - } - }, - "level-errors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz", - "integrity": "sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==", - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "level-live-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/level-live-stream/-/level-live-stream-1.4.11.tgz", - "integrity": "sha1-d6V1RMRGQS4xD1pcxHm11YS7v3o=", - "requires": { - "level-sublevel": "~6.3.1", - "pull-level": "^1.4.1", - "pull-stream-to-stream": "~1.2.4" - } - }, - "level-option-wrap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/level-option-wrap/-/level-option-wrap-1.1.0.tgz", - "integrity": "sha1-rSDmjZ88IsiJdTHMaqevWWse0Sk=", - "requires": { - "defined": "~0.0.0" - } - }, - "level-post": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", - "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", - "requires": { - "ltgt": "^2.1.2" - }, - "dependencies": { - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" - } - } - }, - "level-sublevel": { - "version": "6.3.17", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.3.17.tgz", - "integrity": "sha1-bVFP5DJhkZn6MAkRv9+j+Y3nYcs=", - "requires": { - "bytewise": "~0.7.1", - "levelup": "~0.19.0", - "ltgt": "~2.0.0", - "pull-stream": "~2.21.0", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "levelup": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.19.1.tgz", - "integrity": "sha1-86anIFJyxLXzXkEv8ASgOgrt9Qs=", - "requires": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~5.1.0", - "xtend": "~3.0.0" - }, - "dependencies": { - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" - } - } - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-updown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/level-updown/-/level-updown-2.0.2.tgz", - "integrity": "sha1-vquHaCTDGrjbe/LBnFWDypFsezA=", - "dev": true, - "requires": { - "abstract-leveldown": ">=0.12.4 <0.13.0-0", - "externr": ">=1.0.0 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", - "dev": true, - "requires": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.3.tgz", - "integrity": "sha1-v522K9thiNCOqqLvz2zDEZFvQf0=", - "requires": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~6.1.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.1.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "requires": { - "abstract-leveldown": "~2.6.0" - } - }, - "level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "requires": { - "errno": "~0.1.1" - } - } - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lexicographic-integer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lexicographic-integer/-/lexicographic-integer-1.1.0.tgz", - "integrity": "sha1-UsptmYpXLmMitRX1uA45bGBD6bg=" - }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "looper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", - "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=" - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "ltgt": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.0.0.tgz", - "integrity": "sha1-tA7R4zfK9XfAqWP5z/vGgDGACcI=" - }, - "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "requires": { - "vlq": "^0.2.2" - } - }, - "magnet-uri": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-4.2.3.tgz", - "integrity": "sha1-ecxtZaALtbfvXCWuYOu7XZp2gag=", - "dev": true, - "requires": { - "flatten": "0.0.1", - "thirty-two": "^0.0.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "flatten": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-0.0.1.tgz", - "integrity": "sha1-VURAdm2goNYDmZ9DNFP2wvxqdcE=", - "dev": true - } - } - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=" - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "markdown-it-anchor": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.5.tgz", - "integrity": "sha512-xLIjLQmtym3QpoY9llBgApknl7pxAcN3WDRc2d3rwpl+/YvDZHPmKscGs+L6E05xf2KrCXPBvosWt7MZukwSpQ==", - "dev": true - }, - "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", - "dev": true - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "merkle-proofs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merkle-proofs/-/merkle-proofs-1.0.3.tgz", - "integrity": "sha1-AwxNkLdrzFpCTGiJxAmOoIxtFdw=", - "requires": { - "flat-tree": "^1.4.0", - "merkle-tree-stream": "github:mvayngrib/merkle-tree-stream#finalize", - "readable-stream": "^2.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "merkle-tree-stream": { - "version": "github:mvayngrib/merkle-tree-stream#ef1abd6b566a410f8cdc7190f0966b97f403e290", - "from": "github:mvayngrib/merkle-tree-stream#finalize", - "requires": { - "flat-tree": "^1.3.0", - "readable-stream": "^2.0.5" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "requires": { - "mime-db": "1.43.0" - } - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "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": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multistream": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", - "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "mutexify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.2.0.tgz", - "integrity": "sha512-oprzxd2zhfrJqEuB98qc1dRMMonClBQ57UPDjnbcrah4orEMTq1jq3+AcdFe5ePzdbJXI7zmdhfftIdMnhYFoQ==" - }, - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nkey": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/nkey/-/nkey-2.0.2.tgz", - "integrity": "sha1-QvnEuI4v4NLaLUD0zGR4HXTI7qA=", - "dev": true, - "requires": { - "typeforce": "^1.6.2", - "xtend": "^4.0.1" - } - }, - "nkey-bitcoin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/nkey-bitcoin/-/nkey-bitcoin-1.2.0.tgz", - "integrity": "sha1-Xk9MuR+slcV5S8bQ9I6pBDjMhio=", - "dev": true, - "requires": { - "@tradle/bitcoinjs-lib": "^1.6.0", - "nkey": "^2.0.0" - } - }, - "nkey-curve25519": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nkey-curve25519/-/nkey-curve25519-1.0.1.tgz", - "integrity": "sha1-OXqtSe8tAFv75DoNPa4EBvOFWNw=", - "dev": true, - "requires": { - "nkey": "^2.0.0", - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - } - } - }, - "nkey-ecdsa": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nkey-ecdsa/-/nkey-ecdsa-1.1.0.tgz", - "integrity": "sha1-IZ6E7lxT0TsknvBF8URk8aEXo3s=", - "dev": true, - "requires": { - "key-encoder": "github:mvayngrib/key-encoder-js", - "nkey": "^2.0.2", - "nkey-secp256k1": "^1.1.1", - "xtend": "^4.0.1" - } - }, - "nkey-ethereum": { - "version": "github:tradle/nkey-ethereum#cd27e1be8f142226cab5476a50740af968f46bc3", - "from": "github:tradle/nkey-ethereum", - "dev": true, - "requires": { - "ethereumjs-wallet": "^0.6.0", - "nkey": "^2.0.2", - "object.omit": "^2.0.1" - } - }, - "nkey-secp256k1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nkey-secp256k1/-/nkey-secp256k1-1.1.1.tgz", - "integrity": "sha1-N7pxAb91OAMP5HCfUgZAQ4QeNuM=", - "dev": true, - "requires": { - "nkey": "^2.0.0", - "secp256k1": "^3.1.0" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "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 - }, - "nyc": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-6.6.1.tgz", - "integrity": "sha1-L2AUYQpXBwAhxMBn6bnjMKI6xqc=", - "dev": true, - "requires": { - "append-transform": "^0.4.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.1.2", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^1.1.2", - "foreground-child": "^1.5.1", - "glob": "^7.0.3", - "istanbul": "^0.4.3", - "md5-hex": "^1.2.0", - "micromatch": "^2.3.7", - "mkdirp": "^0.5.0", - "pkg-up": "^1.0.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.5.0", - "signal-exit": "^3.0.0", - "source-map": "^0.5.3", - "spawn-wrap": "^1.2.2", - "test-exclude": "^1.1.0", - "yargs": "^4.7.0" - }, - "dependencies": { - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "^1.0.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "dev": true, - "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" - }, - "dependencies": { - "write-file-atomic": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.4.tgz", - "integrity": "sha1-sfUtwujcDjywTRh6JfdYo4qQyjs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - } - } - } - } - }, - "convert-source-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz", - "integrity": "sha1-RMCMJQbxD7PKb9iI1aNETPjWpmk=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - }, - "dependencies": { - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - }, - "foreground-child": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.1.tgz", - "integrity": "sha1-76NNl4DSV8dQsR4pbi4e3BT/+qo=", - "dev": true, - "requires": { - "cross-spawn-async": "^2.1.1", - "signal-exit": "^2.0.0", - "which": "^1.2.1" - }, - "dependencies": { - "cross-spawn-async": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.4.tgz", - "integrity": "sha1-yajY6aBlAsekYpbjOhoFS10vGBI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.0", - "which": "^1.2.8" - }, - "dependencies": { - "lru-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.1.tgz", - "integrity": "sha1-E0OVXtry432bnn7nJB4nxLn7cr4=", - "dev": true, - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - }, - "dependencies": { - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "yallist": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", - "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=", - "dev": true - } - } - } - } - }, - "signal-exit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=", - "dev": true - }, - "which": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", - "integrity": "sha1-kc2b0HUTIkEbZZtA8FSyHelXqy0=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "glob": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", - "integrity": "sha1-CqI1kxpKlqwT1g/6wvuHe9btT1g=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "minimatch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", - "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", - "integrity": "sha1-RkogTHf0gsCFwqNsRWu/uvtnoSc=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", - "integrity": "sha1-GQU+LgdI6ts3nabAnUVc9eEDkzU=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - } - } - } - } - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "istanbul": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.3.tgz", - "integrity": "sha1-W3FO4K5JOsXvIEuZ84crzu9z1To=", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "fileset": "0.2.x", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "abbrev": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", - "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "escodegen": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.0.tgz", - "integrity": "sha1-skaq6CnOc9WeLFVyc1nt0cEwqBs=", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "optionator": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.1.tgz", - "integrity": "sha1-4xtJMs3V+4Yqiw0QvGPT7h7H14s=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "^1.1.0", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "fast-levenshtein": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.3.tgz", - "integrity": "sha1-KuezKrweYS2kik4ThJuIii9h5+k=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true, - "optional": true - } - } - } - } - }, - "esprima": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz", - "integrity": "sha1-9DvlQ2CZhOrkTJM6xjNSpq818zk=", - "dev": true - }, - "fileset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz", - "integrity": "sha1-WI74lzxmI7KnbfRlEFaWuWqsgGc=", - "dev": true, - "requires": { - "glob": "5.x", - "minimatch": "2.x" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "inflight": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz", - "integrity": "sha1-2zIEzVqd4ubNiQuFxuL2a89PYgo=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", - "dev": true - } - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz", - "integrity": "sha1-RkogTHf0gsCFwqNsRWu/uvtnoSc=", - "dev": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz", - "integrity": "sha1-GQU+LgdI6ts3nabAnUVc9eEDkzU=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - } - } - } - } - } - } - }, - "handlebars": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", - "integrity": "sha1-ksbta7FkEQxQ1NjQ+93HCAbG+Oc=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - } - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - } - } - }, - "uglify-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", - "integrity": "sha1-9QvoikLNOWpiUdxSqzcvccwS/vA=", - "dev": true, - "optional": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true, - "optional": true - }, - "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 - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", - "integrity": "sha1-xhYIdH2BWwNiVW2zJ2Nip6OK3tM=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=", - "dev": true, - "optional": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true, - "optional": true - } - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - } - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", - "integrity": "sha1-xhYIdH2BWwNiVW2zJ2Nip6OK3tM=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=", - "dev": true, - "optional": true - } - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true, - "optional": true - } - } - } - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": 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, - "optional": true - } - } - } - } - } - } - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz", - "integrity": "sha1-wolQZIBVeBDxSovGLXoG9j7X+VE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - } - } - }, - "which": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", - "integrity": "sha1-kc2b0HUTIkEbZZtA8FSyHelXqy0=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - }, - "dependencies": { - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - } - } - }, - "micromatch": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.8.tgz", - "integrity": "sha1-lPv4837Z7eyga/HI97dD+19vWFQ=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "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": "^1.0.1" - }, - "dependencies": { - "arr-flatten": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", - "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=", - "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 - }, - "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.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "dependencies": { - "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.1.0" - }, - "dependencies": { - "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.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "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.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "randomatic": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", - "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", - "dev": true, - "requires": { - "is-number": "^2.0.2", - "kind-of": "^3.0.2" - } - }, - "repeat-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz", - "integrity": "sha1-ZOwMkeD0tHX5DVtkNlHj5uW2wtU=", - "dev": true - } - } - } - } - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "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 - } - } - }, - "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.0" - }, - "dependencies": { - "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 - } - } - }, - "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" - } - }, - "filename-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", - "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=", - "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-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" - } - }, - "kind-of": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz", - "integrity": "sha1-xhYIdH2BWwNiVW2zJ2Nip6OK3tM=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz", - "integrity": "sha1-24l/w/esotUN6UtsjCiWpHcWJ68=", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", - "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=", - "dev": true - }, - "object.omit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", - "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz", - "integrity": "sha1-AUm0GjkIjHUV9R6+HBOG1F+TUHI=", - "dev": true, - "requires": { - "for-in": "^0.1.5" - }, - "dependencies": { - "for-in": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz", - "integrity": "sha1-AHN04rbVxnQgoUeb23WgSHK3OMQ=", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "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.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "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.0" - }, - "dependencies": { - "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.0" - } - } - } - }, - "is-dotfile": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", - "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", - "dev": true - } - } - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "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" - }, - "dependencies": { - "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-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "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" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "pkg-up": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - }, - "rimraf": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", - "integrity": "sha1-YrqUf6TAtDY4Oa7+zU8PutYFlyY=", - "dev": true, - "requires": { - "glob": "^7.0.0" - } - }, - "signal-exit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", - "integrity": "sha1-PAVDtl17T7xgts2UWT2b9DZzm+g=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "spawn-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.2.3.tgz", - "integrity": "sha1-3300R/tKAZYZpB9o7mQqcY5gYuk=", - "dev": true, - "requires": { - "foreground-child": "^1.3.3", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.3.3", - "signal-exit": "^2.0.0", - "which": "^1.2.4" - }, - "dependencies": { - "os-homedir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz", - "integrity": "sha1-DWK99EuRb9O73PLKsZGUj7CU8Ac=", - "dev": true - }, - "signal-exit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=", - "dev": true - }, - "which": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz", - "integrity": "sha1-kc2b0HUTIkEbZZtA8FSyHelXqy0=", - "dev": true, - "requires": { - "isexe": "^1.1.1" - }, - "dependencies": { - "isexe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", - "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=", - "dev": true - } - } - } - } - }, - "test-exclude": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-1.1.0.tgz", - "integrity": "sha1-9d3XGJJ7Ev0C8nCgqpOc627qQVE=", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "lodash.assign": "^4.0.9", - "micromatch": "^2.3.8", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "lodash.assign": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", - "integrity": "sha1-Cgcx2TWQ3dm6RYn61lqvbuCSF+M=", - "dev": true, - "requires": { - "lodash.keys": "^4.0.0", - "lodash.rest": "^4.0.0" - }, - "dependencies": { - "lodash.keys": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.0.7.tgz", - "integrity": "sha1-MOGzvZjlTWoGEZkYEmhba8R8tjs=", - "dev": true - }, - "lodash.rest": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.3.tgz", - "integrity": "sha1-TBwyxAAoCHJQ+r9w1C4BUVSPSMU=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", - "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", - "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", - "dev": true, - "requires": { - "spdx-exceptions": "^1.0.4", - "spdx-license-ids": "^1.0.0" - }, - "dependencies": { - "spdx-exceptions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", - "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=", - "dev": true - } - } - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - } - } - }, - "yargs": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.7.1.tgz", - "integrity": "sha1-5gQyZYozh/8mnAKOrN5KUS5Djf8=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "pkg-conf": "^1.1.2", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^1.0.0", - "string-width": "^1.0.1", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.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 - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "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.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - }, - "wrap-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.0.0.tgz", - "integrity": "sha1-fTD4+HP5pbvDpk2ryNF34HGuQm8=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "lodash.assign": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.0.9.tgz", - "integrity": "sha1-Cgcx2TWQ3dm6RYn61lqvbuCSF+M=", - "dev": true, - "requires": { - "lodash.keys": "^4.0.0", - "lodash.rest": "^4.0.0" - }, - "dependencies": { - "lodash.keys": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.0.7.tgz", - "integrity": "sha1-MOGzvZjlTWoGEZkYEmhba8R8tjs=", - "dev": true - }, - "lodash.rest": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash.rest/-/lodash.rest-4.0.3.tgz", - "integrity": "sha1-TBwyxAAoCHJQ+r9w1C4BUVSPSMU=", - "dev": true - } - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - }, - "dependencies": { - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - }, - "dependencies": { - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - } - } - } - } - }, - "pkg-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", - "integrity": "sha1-N45W1v0T6Iv7b0ol33qD+qvduls=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "load-json-file": "^1.1.0", - "object-assign": "^4.0.1", - "symbol": "^0.2.1" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - }, - "symbol": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", - "integrity": "sha1-O5hzuKkB5Hxu/iFSajrDcu8ou8c=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - }, - "dependencies": { - "error-ex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz", - "integrity": "sha1-5ntD8+gsluo6WE/+4Ln8MyXYAtk=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - } - } - } - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - }, - "dependencies": { - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - } - } - }, - "normalize-package-data": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", - "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz", - "integrity": "sha1-C6gdkNouJas0ozLm7HeTbhWYEYs=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } - } - }, - "semver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", - "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "~1.0.0", - "spdx-expression-parse": "~1.0.0" - }, - "dependencies": { - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "^1.0.2" - }, - "dependencies": { - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=", - "dev": true - } - } - }, - "spdx-expression-parse": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz", - "integrity": "sha1-1SsUtelnB3FECvIlvLVjEirEUvY=", - "dev": true, - "requires": { - "spdx-exceptions": "^1.0.4", - "spdx-license-ids": "^1.0.0" - }, - "dependencies": { - "spdx-exceptions": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz", - "integrity": "sha1-IguEI5EZrpBFqJLbgag/TOFvgP0=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.1.tgz", - "integrity": "sha1-0H6hek0v2TUfnZTi/5zsdBgP6PM=", - "dev": true - } - } - } - } - } - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - }, - "dependencies": { - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - } - } - } - } - } - } - } - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "set-blocking": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-1.0.0.tgz", - "integrity": "sha1-zV5dk4BI3xrJLf6S4fFq3WVvXsU=", - "dev": true - }, - "string-width": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", - "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "code-point-at": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", - "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": 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.0" - }, - "dependencies": { - "number-is-nan": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", - "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=", - "dev": 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.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", - "dev": true - } - } - } - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs-parser": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.0.tgz", - "integrity": "sha1-HzZ9ycbPpWYLaXEjDzsnf8Xjrco=", - "dev": true, - "requires": { - "camelcase": "^2.1.1", - "lodash.assign": "^4.0.6" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - } - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": 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 - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" - }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "only-shallow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/only-shallow/-/only-shallow-1.2.0.tgz", - "integrity": "sha1-cc7O26kyS8BRiu8Q7AgNMkncJGU=", - "dev": true - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", - "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", - "dev": true - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "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 - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-headers": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", - "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-torrent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-torrent/-/parse-torrent-3.0.1.tgz", - "integrity": "sha1-20/lbbXo92qkvVp2+rYisMclv+E=", - "dev": true, - "requires": { - "magnet-uri": "^4.0.0", - "parse-torrent-file": "^2.0.0" - } - }, - "parse-torrent-file": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/parse-torrent-file/-/parse-torrent-file-2.1.4.tgz", - "integrity": "sha1-MtS2r95jFCDl9BWRmiIrd0tXVwc=", - "dev": true, - "requires": { - "bencode": "^0.7.0", - "simple-sha1": "^2.0.0" - }, - "dependencies": { - "bencode": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-0.7.0.tgz", - "integrity": "sha1-gR7WR8ARiUXkG7S7veqaLHihcIM=", - "dev": true - } - } - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "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 - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pbkdf2-sha256": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2-sha256/-/pbkdf2-sha256-1.1.1.tgz", - "integrity": "sha1-1Ehv/CwxTPtctXwo+cuH5W+y4T0=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "piece-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/piece-length/-/piece-length-1.0.1.tgz", - "integrity": "sha512-7JNneRNPcdyNLvCF9/HR4shVJFn2Sx/RUUCmaloklNUa+zhthhb1S6QBprg+C3LIgcOUWDQDws+AIiTYawtE4A==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "protocol-buffers": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/protocol-buffers/-/protocol-buffers-3.2.1.tgz", - "integrity": "sha1-NyWOF+JKCC8G67F3MekoUdHHaIk=", - "requires": { - "brfs": "^1.4.0", - "generate-function": "^2.0.0", - "generate-object-property": "^1.2.0", - "protocol-buffers-schema": "^3.1.1", - "signed-varint": "^2.0.0", - "varint": "^5.0.0" - } - }, - "protocol-buffers-schema": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.4.0.tgz", - "integrity": "sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA==" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pull-cat": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", - "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=" - }, - "pull-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pull-core/-/pull-core-1.0.0.tgz", - "integrity": "sha1-4OuTkY36cJY+0J429j2qFbdrOKQ=" - }, - "pull-level": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-1.5.2.tgz", - "integrity": "sha1-K0vcjquNTy43CLSVEjULFLsDW1Y=", - "requires": { - "level-post": "~1.0.3", - "pull-cat": "^1.1.9", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.6.6" - }, - "dependencies": { - "pull-stream": { - "version": "3.6.14", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz", - "integrity": "sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==" - } - } - }, - "pull-pushable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", - "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=" - }, - "pull-stream": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-2.21.0.tgz", - "integrity": "sha1-WwTguzX/5kdE+pu2hGWoT54f5dE=", - "requires": { - "pull-core": "~1.0.0" - } - }, - "pull-stream-to-stream": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/pull-stream-to-stream/-/pull-stream-to-stream-1.2.6.tgz", - "integrity": "sha1-3Z+jcy7bPRbmfNHyJLyjim1XSMc=", - "requires": { - "pull-core": "1" - } - }, - "pull-window": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", - "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", - "requires": { - "looper": "^2.0.0" - } - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", - "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", - "dev": true - }, - "quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", - "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - } - }, - "random-name": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/random-name/-/random-name-0.1.2.tgz", - "integrity": "sha1-IKGtDvzpl2dkxd08QYxwGLV+gW0=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "re-emitter": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.4.tgz", - "integrity": "sha512-C0SIXdXDSus2yqqvV7qifnb4NoWP7mEBXJq3axci301mXHCZb8Djwm4hrEZo4UeXRaEnfjH98uQ8EBppk2oNWA==" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "reduce-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", - "integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo=", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true, - "requires": { - "through": "~2.3.4" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", - "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", - "dev": true, - "requires": { - "bn.js": "^4.11.1" - } - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "^1.3.0" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rusha": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", - "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=", - "dev": true - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "dev": true, - "requires": { - "nan": "^2.0.8" - } - }, - "scrypt.js": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.1.tgz", - "integrity": "sha512-XMoqxwABdotuW+l+qACmJ/h0kVSCgMPZXpbncA/zyBO90z/NnDISzVw+xJ4tUY+X/Hh0EFT269OYHm26VCPgmA==", - "dev": true, - "requires": { - "scrypt": "^6.0.2", - "scryptsy": "^1.2.1" - } - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "dev": true, - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "secp256k1": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.8.0.tgz", - "integrity": "sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw==", - "dev": true, - "requires": { - "bindings": "^1.5.0", - "bip66": "^1.1.5", - "bn.js": "^4.11.8", - "create-hash": "^1.2.0", - "drbg.js": "^1.0.1", - "elliptic": "^6.5.2", - "nan": "^2.14.0", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - } - } - }, - "seedrandom": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", - "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", - "dev": true - }, - "semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true - }, - "semver": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.1.tgz", - "integrity": "sha1-oykqNz5vPgeY2gsgZBuanFvEfhk=" - }, - "sendy": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/sendy/-/sendy-2.4.0.tgz", - "integrity": "sha1-caOwFYB9GGEtIhyvcL/Y9fXqqmU=", - "dev": true, - "requires": { - "bindall": "^2.0.1", - "browser-process-hrtime": "^0.1.2", - "cyclist": "^1.0.1", - "debug": "^2.2.0", - "length-prefixed-stream": "^1.4.0", - "once": "^1.3.3", - "re-emitter": "^1.1.3", - "typeforce": "^1.6.2", - "varint": "^4.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "varint": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/varint/-/varint-4.0.1.tgz", - "integrity": "sha1-SQgpuULSSEY7KzUJeZXDv3NxmOk=", - "dev": true - } - } - }, - "sendy-axolotl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sendy-axolotl/-/sendy-axolotl-1.0.1.tgz", - "integrity": "sha1-Nf7/su72B0ULyGW/0fTZDJ/Wmls=", - "dev": true, - "requires": { - "@tradle/wire": "^1.1.0", - "debug": "^2.2.0", - "sendy": "^2.1.1", - "typeforce": "^1.6.2" - } - }, - "sendy-otr": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sendy-otr/-/sendy-otr-2.1.0.tgz", - "integrity": "sha1-M+ZlPRNL4kb+tcAixwu3XUNe1Fc=", - "dev": true, - "requires": { - "@tradle/otr": "^0.2.17", - "debug": "^2.2.0", - "sendy": "^2.1.0", - "sendy-ws": "^1.2.5", - "typeforce": "^1.6.2" - } - }, - "sendy-protobufs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sendy-protobufs/-/sendy-protobufs-1.0.0.tgz", - "integrity": "sha1-tEFMcobw0IqJXW4wHoaZA9leAD4=", - "dev": true - }, - "sendy-ws": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sendy-ws/-/sendy-ws-1.5.2.tgz", - "integrity": "sha1-HdyS4HJX2SwEFh78bb8tZkdFuT0=", - "dev": true, - "requires": { - "backoff": "^2.4.1", - "bindall": "2.0.1", - "debug": "^2.2.0", - "protocol-buffers": "^3.1.6", - "sendy-protobufs": "1.0.0", - "socket.io-client": "^1.4.5", - "socketio-wildcard": "0.3.0", - "typeforce": "^1.6.2", - "xtend": "^4.0.1" - } - }, - "sendy-ws-relay": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sendy-ws-relay/-/sendy-ws-relay-1.6.0.tgz", - "integrity": "sha1-hfx3nH4FdXn1Da1dPtkpI3YZeoc=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "object.omit": "^2.0.0", - "protocol-buffers": "^3.1.6", - "q": "^1.4.1", - "sendy-protobufs": "^1.0.0", - "socket.io": "^1.4.4", - "typeforce": "^1.6.1", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "sha3": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.6.tgz", - "integrity": "sha512-KgLGmJGrmNB4JWVsAV11Yk6KbvsAiygWJc7t5IebWva/0NukNrjJqhtKhzy3Eiv2AKuGvhZZt7dt1mDo7HkoiQ==", - "dev": true, - "requires": { - "nan": "2.13.2" - } - }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "signal-exit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", - "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=", - "dev": true - }, - "signed-varint": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", - "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", - "requires": { - "varint": "~5.0.0" - } - }, - "simple-sha1": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.2.tgz", - "integrity": "sha512-TQl9rm4rdKAVmhO++sXAb8TNN0D6JAD5iyI1mqEPNpxUzTRrtm4aOG1pDf/5W/qCFihiaoK6uuL9rvQz1x1VKw==", - "dev": true, - "requires": { - "rusha": "^0.8.1" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "sntp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", - "dev": true, - "optional": true, - "requires": { - "hoek": "0.9.x" - } - }, - "socket.io": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz", - "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=", - "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "~1.8.4", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.4", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-client": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", - "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "~1.8.4", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "socketio-wildcard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/socketio-wildcard/-/socketio-wildcard-0.3.0.tgz", - "integrity": "sha1-gVWt1B4RHQ8nxlnUjvoOgfE9qoA=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", - "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", - "dev": true, - "requires": { - "through": "2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - } - } - }, - "stack-utils": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-0.4.0.tgz", - "integrity": "sha1-lAy4L8z6hOj/Lz/fKT/ngBa+zNE=", - "dev": true - }, - "static-eval": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.5.tgz", - "integrity": "sha512-nNbV6LbGtMBgv7e9LFkt5JV8RVlRsyJrphfAt9tOtBBW/SfnzZDf2KnS72an8e434A+9e/BmJuTxeGPvrAK7KA==", - "requires": { - "escodegen": "^1.11.1" - }, - "dependencies": { - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - } - } - }, - "static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "requires": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-collector": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-collector/-/stream-collector-1.0.1.tgz", - "integrity": "sha1-TU5V8XE1YSGyxfZVn5RHBaso2xU=", - "requires": { - "once": "^1.3.1" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "stream-to-pull-stream": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz", - "integrity": "sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==", - "requires": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - }, - "dependencies": { - "looper": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", - "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=" - }, - "pull-stream": { - "version": "3.6.14", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz", - "integrity": "sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==" - } - } - }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" - }, - "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.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string.prototype.trim": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", - "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": 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.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "dev": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "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 - }, - "subleveldown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/subleveldown/-/subleveldown-2.1.0.tgz", - "integrity": "sha1-sj7KI8IodypnxsTkSWlDBPDXBqE=", - "requires": { - "abstract-leveldown": "^2.4.1", - "level-option-wrap": "^1.1.0", - "levelup": "^1.2.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "superagent": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.5.tgz", - "integrity": "sha1-HA3cOvMOgOuE68BcshItqP6UC1U=", - "dev": true, - "requires": { - "component-emitter": "~1.2.0", - "cookiejar": "2.0.6", - "debug": "2", - "extend": "3.0.0", - "form-data": "1.0.0-rc3", - "formidable": "~1.0.14", - "methods": "~1.1.1", - "mime": "1.3.4", - "qs": "2.3.3", - "readable-stream": "1.0.27-1", - "reduce-component": "1.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.27-1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz", - "integrity": "sha1-a2eYPCA1fO/QfwFlABoW1xDZEHg=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", - "dev": true - }, - "tap": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/tap/-/tap-5.8.0.tgz", - "integrity": "sha1-y9cWSITLyFVm+ck3ooBrkR9Cmtw=", - "dev": true, - "requires": { - "bluebird": "^3.3.1", - "clean-yaml-object": "^0.1.0", - "codecov.io": "0.1.6", - "coveralls": "^2.11.2", - "deeper": "^2.1.0", - "foreground-child": "^1.3.3", - "glob": "^7.0.0", - "isexe": "^1.0.0", - "js-yaml": "^3.3.1", - "nyc": "^6.6.1", - "only-shallow": "^1.0.2", - "opener": "^1.4.1", - "readable-stream": "^2.0.2", - "signal-exit": "^2.0.0", - "stack-utils": "^0.4.0", - "supports-color": "^1.3.1", - "tap-mocha-reporter": "0.0 || 1", - "tap-parser": "^1.2.2", - "tmatch": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "supports-color": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz", - "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=", - "dev": true - } - } - }, - "tap-mocha-reporter": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-0.0.27.tgz", - "integrity": "sha1-svcvPh6Lp4DuApGPzes6QNqAGPc=", - "dev": true, - "requires": { - "color-support": "^1.1.0", - "debug": "^2.1.3", - "diff": "^1.3.2", - "escape-string-regexp": "^1.0.3", - "glob": "^7.0.5", - "js-yaml": "^3.3.1", - "readable-stream": "^1.1.13", - "tap-parser": "^1.0.4", - "unicode-length": "^1.0.0" - } - }, - "tap-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-1.3.2.tgz", - "integrity": "sha1-EgxQiciMPIp5PvKIhn3jIeGPjCI=", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "inherits": "~2.0.1", - "js-yaml": "^3.2.7", - "readable-stream": "^2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tape": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.2.tgz", - "integrity": "sha512-waWwC/OqYVE9TS6r1IynlP2sEdk4Lfo6jazlgkuNkPTHIbuG2BTABIaKdlQWwPeB6Oo4ksZ1j33Yt0NTOAlYMQ==", - "dev": true, - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.0", - "object-inspect": "~1.7.0", - "resolve": "~1.15.1", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - }, - "dependencies": { - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thirty-two": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-0.0.2.tgz", - "integrity": "sha1-QlPinYywWPBIAmfFaYwOSSflS2o=", - "dev": true - }, - "throttleme": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/throttleme/-/throttleme-1.0.3.tgz", - "integrity": "sha1-t+X3YxGeO9hr7ROW9G0HGcvec28=", - "dev": true, - "requires": { - "debug": "^2.2.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=" - }, - "tmatch": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-2.0.1.tgz", - "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=", - "dev": true - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-utf8": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz", - "integrity": "sha1-0Xrqcv8vujm55DYBvns/9y4ImFI=" - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typeforce": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", - "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" - }, - "typewiselite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", - "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=" - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "underscore": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", - "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==", - "dev": true - }, - "unicode-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", - "dev": true, - "requires": { - "punycode": "^1.3.2", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "unorm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", - "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urlgrey": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.0.tgz", - "integrity": "sha1-8GU1cED7NcOzEdTl3DZITZbb6gY=", - "dev": true, - "requires": { - "tape": "2.3.0" - }, - "dependencies": { - "deep-equal": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz", - "integrity": "sha1-skbCuApXCkfBG+HZvRBw7IeLh84=", - "dev": true - }, - "tape": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.0.tgz", - "integrity": "sha1-Df7scJIn+8yRcKvn8EaWKycUMds=", - "dev": true, - "requires": { - "deep-equal": "~0.1.0", - "defined": "~0.0.0", - "inherits": "~2.0.1", - "jsonify": "~0.0.0", - "resumer": "~0.0.0", - "split": "~0.2.10", - "stream-combiner": "~0.0.2", - "through": "~2.3.4" - } - } - } - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "varint": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" - }, - "vows": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/vows/-/vows-0.6.0.tgz", - "integrity": "sha1-vi8GgAnTmjezevhcKfqG2Fc9tDE=", - "dev": true, - "requires": { - "eyes": ">=0.1.6" - } - }, - "webworker-threads": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/webworker-threads/-/webworker-threads-0.4.13.tgz", - "integrity": "sha1-1zvf0AIb9wkxy4XCTMP0zvvrH5g=", - "dev": true, - "optional": true, - "requires": { - "nan": "0.8.x" - }, - "dependencies": { - "nan": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-0.8.0.tgz", - "integrity": "sha1-AiqPpen+hCCWSsH7PclOF/RJ9f0=", - "dev": true, - "optional": true - } - } - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - }, - "dependencies": { - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - } - } - }, - "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.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "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": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "dev": true, - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } - }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "dev": true, - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xmlcreate": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz", - "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", - "dev": true - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - } - } -} diff --git a/package.json b/package.json index 2ae0adb..2d93338 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,11 @@ "main": "index.js", "scripts": { "test": "npm run test:bitcoin && npm run test:ethereum", - "tests": "tap `git ls-files test/*.test.js`", + "tests": "tape test/*.test.js", "test:bitcoin": "BLOCKCHAIN=bitcoin npm run tests", - "test:ethereum": "npm run ether:stop 2>/dev/null; npm run ether:start; BLOCKCHAIN=ethereum npm run tests; npm run ether:stop;", - "ether:start": "forever start ./test/etherrpc.js; sleep 5s", - "ether:stop": "forever stop ./test/etherrpc.js", - "etherrpc": "node ./test/etherrpc", + "test:ethereum": "env DEBUG= npm run ether:start 2> /dev/null && BLOCKCHAIN=ethereum npm run tests; EXIT=$?; env DEBUG= npm run ether:stop; exit $EXIT", + "ether:start": "npm run ether:stop; ./test/etherrpc.js", + "ether:stop": "bash -c 'if [ -f test/etherrpc.js.pid ]; then kill -2 \"$(cat ./test/etherrpc.js.pid)\"; rm test/etherrpc.js.pid; fi;'", "coverage": "npm test -- --cov --coverage-report=lcov", "installhooks": "./installhooks.sh", "postinstall": "npm run installhooks", @@ -21,29 +20,30 @@ "license": "GPLv3", "dependencies": { "@tradle/bitcoinjs-lib": "^1.6.0", + "@tradle/changes-feed": "^1.1.1", "@tradle/constants": "^2.3.2", - "async": "^2.6.1", + "@tradle/typeforce": "^2.2.1", + "async": "^3.2.3", "backoff": "^2.5.0", "bs58check": "^1.0.8", - "changes-feed": "mvayngrib/changes-feed", "clone": "^2.0.0", "debug": "^2.2.0", "deep-equal": "^1.0.1", "error": "^7.0.2", "feed-indexer": "1.4.0", - "flat-tree": "1.4.0", + "flat-tree": "^1.9.0", "hydration": "^1.0.0", "json-stable-stringify": "^1.0.1", "level-errors": "^1.0.4", - "level-live-stream": "1.4.11", + "level-live-stream": "^1.4.13", "levelup": "1.3.3", "lexicographic-integer": "^1.1.0", "lodash": "^4.17", "map-stream": "0.0.7", "merkle-proofs": "1.0.3", - "mutexify": "^1.1.0", + "mutexify": "^1.4.0", "once": "^1.3.3", - "protocol-buffers": "^3.2.1", + "protocol-buffers-encodings": "^1.1.1", "pump": "^1.0.1", "re-emitter": "^1.1.3", "readable-stream": "^1.0.34", @@ -52,20 +52,19 @@ "subleveldown": "^2.1.0", "through2": "^2.0.1", "thunky": "^0.1.0", - "typeforce": "^1.6.2", "xtend": "^4.0.1" }, "devDependencies": { "@tradle/bitcoin-adapter": "github:tradle/bitcoin-adapter", - "@tradle/ethereum-adapter": "github:tradle/ethereum-adapter", + "@tradle/ethereum-adapter": "^1.0.2", + "@tradle/ethereumjs-wallet": "^0.6.2", "@tradle/keeper": "^3.1.0", - "@tradle/protocol": "^4.0.0", + "@tradle/protocol": "^5.1.1", "@tradle/simple-wallet": "^1.3.1", "@tradle/test-helpers": "^1.3.0", "dotenv": "4.0.0", "eslint": "3.15.0", - "ethereumjs-testrpc": "3.0.3", - "ethereumjs-wallet": "0.6.0", + "ganache": "^7.0.3", "jsdoc": "^3.4.0", "lru-cache": "^4.0.1", "memdown": "^1.1.2", @@ -73,15 +72,17 @@ "nkey-bitcoin": "^1.2.0", "nkey-curve25519": "^1.0.1", "nkey-ecdsa": "^1.0.1", - "nkey-ethereum": "github:tradle/nkey-ethereum", + "nkey-ethereum": "^1.1.0", + "npid": "^0.4.0", + "protocol-buffers": "^5.0.0", "random-name": "^0.1.1", "sendy": "^2.0.1", "sendy-axolotl": "^1.0.1", "sendy-otr": "^2.0.0", "sendy-ws": "^1.2.4", "sendy-ws-relay": "^1.1.3", - "tap": "^5.7.2", - "tape": "^4.5.1" + "tap": "^15.1.6", + "tape": "^5.5.2" }, "peerDependencies": { "@tradle/protocol": ">4 <6" diff --git a/test/addressBook.test.js b/test/addressBook.test.js index 1b0e673..cd2eb16 100644 --- a/test/addressBook.test.js +++ b/test/addressBook.test.js @@ -1,99 +1,22 @@ require('./env') const test = require('tape') -const async = require('async') -const levelup = require('levelup') const leveldown = require('memdown') const collect = require('stream-collector') -// const tradle = require('../') -const changesFeed = require('changes-feed') const Cache = require('lru-cache') const protocol = require('@tradle/protocol') const createAddressBook = require('../lib/dbs/addressBook') const users = require('./fixtures/users') const utils = require('../lib/utils') -const topics = require('../lib/topics') const constants = require('../lib/constants') const createActions = require('../lib/actions') const { - TYPE, - PERMALINK, - PREVLINK, - LINK, SIG, AUTHOR, } = constants -const IDENTITY_TYPE = constants.TYPES.IDENTITY const helpers = require('./helpers') -// test('ignore identities that collide on keys', function (t) { -// const ted = extend(users[0].pub) // defensive copy -// const changes = helpers.nextFeed() -// const badPerson = extend(ted, { name: 'evil ted' }) -// const tedHash = 'abc' -// const badPersonHash = 'efg' -// const keeper = helpers.keeper() -// const keyValMap = { -// [tedHash]: ted, -// [badPersonHash]: badPerson -// } - -// keeper.batch(utils.mapToBatch(keyValMap), start) - -// // const tedFromChain = new Entry({ -// // type: EventType.chain.readSuccess -// // }) -// // .set(TYPE, IDENTITY_TYPE) -// // .set(LINK, tedHash) -// // .set(PERMALINK, tedHash) - -// // const badPersonFromChain = new Entry({ -// // type: EventType.chain.readSuccess -// // }) -// // .set(TYPE, IDENTITY_TYPE) -// // .set(LINK, badPersonHash) -// // .set(PERMALINK, badPersonHash) - -// const db = helpers.nextDB() -// const identities = createAddressBook({ -// changes: changes, -// keeper: keeper, -// db: db -// }) - -// const actions = createActions({ changes }) - -// actions.addContact(ted, tedHash) -// actions.addContact(badPerson, badPersonHash) - -// function start (err) { -// if (err) throw err - -// identities.lookupIdentity(badPersonHash, function (err) { -// t.ok(err) -// }) - -// async.parallel(ted.pubkeys.map(key => { -// return function (cb) { -// identities.lookupIdentity(key.fingerprint, function (err, identityInfo) { -// if (err) throw err - -// delete identityInfo.timestamp -// t.same(identityInfo, { -// permalink: tedHash, -// link: tedHash, -// prevLink: null, -// object: ted -// }) - -// cb() -// }) -// } -// }), t.end) -// } -// }) - test('update identity (no caching)', newUpdateTest()) test('update identity (caching)', newUpdateTest(true)) diff --git a/test/bitcoin-fakechain.js b/test/bitcoin-fakechain.js index 1c47625..19a3219 100644 --- a/test/bitcoin-fakechain.js +++ b/test/bitcoin-fakechain.js @@ -1,18 +1,18 @@ const { EventEmitter } = require('events') const crypto = require('crypto') -const Wallet = require('@tradle/simple-wallet') const bitcoin = require('@tradle/bitcoinjs-lib') -const typeforce = require('typeforce') -const { testnet } = require('@tradle/bitcoin-adapter') +const typeforce = require('@tradle/typeforce') const utils = require('../lib/utils') const constants = require('./constants') +const fakeBitcoinBlockchainOpts = typeforce.object({ + unspents: 'Array', + network: 'Object', + blocktime: '?Number' +}) + module.exports = function fakeBitcoinBlockchain (opts) { - typeforce({ - unspents: 'Array', - network: 'Object', - blocktime: '?Number' - }, opts) + fakeBitcoinBlockchainOpts.assert(opts) const { network, blocktime=constants.blocktime } = opts const unspents = [] @@ -108,7 +108,6 @@ function createFakeChain ({ network, unspents, blocktime }) { })) }, []) - // console.log(txs.length, addrs, Object.keys(ADDR_CACHE)) if (!txs.length) return cb(null, []) cb(null, txs.map(function (tx) { @@ -126,16 +125,7 @@ function createFakeChain ({ network, unspents, blocktime }) { process.nextTick(function () { cb(null, unspents.filter(unspent => unspent.address === addr)) }) - }, - // summary: function (addrs, cb) { - // process.nextTick(function () { - // cb(null, addrs.map(function (a) { - // return { - // balance: total - // } - // })) - // }) - // } + } }, transactions: { get: function (txIds, cb) { @@ -151,8 +141,7 @@ function createFakeChain ({ network, unspents, blocktime }) { txId: tx.getId(), txHex: tx.toHex(), blockId: tx.block.getId(), - blockHeight: tx.block.blockHeight, - // confirmations: blocks.length - tx.block.blockHeight - 1 + blockHeight: tx.block.blockHeight } }) diff --git a/test/bitcoin-helpers.js b/test/bitcoin-helpers.js index f12700b..b82accb 100644 --- a/test/bitcoin-helpers.js +++ b/test/bitcoin-helpers.js @@ -1,12 +1,8 @@ -const Wallet = require('@tradle/simple-wallet') -const fakeWallet = require('./wallet') const network = require('@tradle/bitcoin-adapter').testnet const users = require('./fixtures/users') const fakeChain = require('./bitcoin-fakechain') const utils = require('../lib/utils') -const { createBlockchainAPI } = network - let api network.createBlockchainAPI = opts => { if (!api) api = exports.createAPI(opts) @@ -21,14 +17,8 @@ exports.transactor = function ({ privateKey }) { if (!api) api = exports.createAPI() - const wallet = new Wallet({ - networkName: network.name, - blockchain: api, - priv: privateKey - }) const transactor = network.createTransactor({ privateKey, api }) - // const transactor = Wallet.transactor({ wallet }) transactor.api = api transactor.network = network return transactor diff --git a/test/contexts.js b/test/contexts.js index d6da454..100f836 100644 --- a/test/contexts.js +++ b/test/contexts.js @@ -7,7 +7,6 @@ const helpers = require('./helpers') const contexts = exports exports.nUsers = function nUsers (n) { - let blockchainReader if (users.length < n) throw new Error('not enough users in fixtures') if (helpers.names.length < n) throw new Error('not enough names in fixtures') @@ -49,14 +48,12 @@ exports.twoFriendsSentReceived = function (object, cb) { b: 2 } - let blockchain contexts.twoFriends(function (err, friends) { if (err) return cb(err) const sender = friends[0] const receiver = friends[1] const aInfo = { permalink: sender.identityInfo.permalink } - let numTries = 0 sender._send = function (msg, recipient, cb) { receiver.receive(msg.object, aInfo, function (err) { @@ -109,7 +106,6 @@ exports.twoFriendsSentReceivedSealed = function (opts, cb) { const alice = friends[0] const bob = friends[1] - // console.log(result.sent) const sealer = opts.sealer === 'sender' ? alice : bob const auditor = sealer === alice ? bob : alice sealer.seal({ @@ -117,9 +113,6 @@ exports.twoFriendsSentReceivedSealed = function (opts, cb) { basePubKey: sealer.chainPubKey }, rethrow) - // alice.seal(result.sent, rethrow) - // bob.seal(result.message, rethrow) - sealer.once('wroteseal', seal => { result.wroteseal = seal done() diff --git a/test/e2e.test.js b/test/e2e.test.js index 6689d64..0026b04 100644 --- a/test/e2e.test.js +++ b/test/e2e.test.js @@ -1,66 +1,41 @@ require('./env') -// const WHY = require('why-is-node-running') -const path = require('path') const { EventEmitter } = require('events') const deepEqual = require('deep-equal') const test = require('tape') -const memdown = require('memdown') const async = require('async') const collect = require('stream-collector') const Cache = require('lru-cache') -const Wallet = require('@tradle/simple-wallet') -const testHelpers = require('@tradle/test-helpers') -// const kiki = require('@tradle/kiki') const protocol = require('@tradle/protocol') const { - PREVLINK, - PERMALINK, - AUTHOR, SEQ, - SIG, - TYPE, - TYPES, + TYPE } = require('@tradle/constants') const defaults = require('../lib/defaults') const utils = require('../lib/utils') const helpers = require('./helpers') const contexts = require('./contexts') -const Node = require('../lib/node') const createSealer = require('../lib/sealer') const createSender = require('../lib/sender') const createMsgMetaDB = require('../lib/dbs/msgMeta') -const constants = require('../lib/constants') const Partial = require('../lib/partial') const Errors = require('../lib/errors') const users = require('./fixtures/users') -const MESSAGE_TYPE = TYPES.MESSAGE const retrystream = require('../lib/retrystream') const SHORT_BACKOFF_OPTS = { initialDelay: 10, maxDelay: 1000 } -const LONG_BACKOFF_OPTS = { - initialDelay: 60 * 1000 * 1000, // foreverish - maxDelay: 60 * 1000 * 1000 * 1000 -} - -const { blocktime } = helpers - retrystream.DEFAULT_BACKOFF_OPTS = createSender.DEFAULT_BACKOFF_OPTS = createSealer.DEFAULT_BACKOFF_OPTS = SHORT_BACKOFF_OPTS -const names = helpers.names -const noop = () => {} -let INSTANCE_COUNT = 0 - test('self in address book', function (t) { // TODO: should be stricter // self should be in addressBook immediately - t.timeoutAfter(2000) + t.timeoutAfter(5000) let alice = contexts.nUsers(1)[0] alice.actions.once('addcontact', function () { @@ -95,7 +70,7 @@ test('restart node', function (t) { }) test('`createObject`', function (t) { - t.timeoutAfter(1000) + t.timeoutAfter(5000) const alice = contexts.nUsers(1)[0] const object = { @@ -117,12 +92,6 @@ test('`createObject`', function (t) { t.end() }) }) - - // alice.createObject({ object: utils.clone(object) }, err => { - // t.ok(err) - // t.equal(err.type, 'saving') - // // t.equal(err.type, 'exists') - // }) }) test('`saveObject`', function (t) { @@ -142,16 +111,11 @@ test('`saveObject`', function (t) { t.equal(result.author, alice.permalink) t.end() friends.forEach(friend => friend.destroy()) - // t.equal(err.type, 'exists') }) }) }) }) -// test('unchained self', function (t) { - -// }) - test('basic send/receive', function (t) { contexts.twoFriends(function (err, friends) { if (err) throw err @@ -174,12 +138,6 @@ test('basic send/receive', function (t) { }) } - // setTimeout(function () { - // alice.addressBook.createReadStream() - // .on('data', console.log) - // // .on('end', console.log) - // }, 200) - const obj = { [TYPE]: 'thang', a: 1, @@ -211,7 +169,7 @@ test('basic send/receive', function (t) { }) test('get unsent to recipient', function (t) { - t.timeoutAfter(1000) + t.timeoutAfter(5000) contexts.nFriends(3, function (err, friends) { if (err) throw err @@ -277,7 +235,6 @@ test('do receive messages carrying already known objects', function (t) { }) test('watch txId', function (t) { - // t.timeoutAfter(blocktime * 10) contexts.twoFriendsSentReceived(function (err, context) { if (err) throw err @@ -288,9 +245,6 @@ test('watch txId', function (t) { basePubKey: sealer.chainPubKey }, rethrow) - // alice.seal(result.sent, rethrow) - // bob.seal(result.message, rethrow) - sealer.once('wroteseal', seal => { watcher.watchSeal({ chain: { @@ -316,7 +270,6 @@ test('watch txId', function (t) { }) test('sender seals', function (t) { - // t.timeoutAfter(blocktime * 10) contexts.twoFriendsSentReceivedSealed({ sealer: 'sender' }, function (err, context) { if (err) throw err @@ -336,7 +289,6 @@ test('sender seals', function (t) { }) test('receiver seals', function (t) { - // t.timeoutAfter(blocktime * 10) contexts.twoFriendsSentReceivedSealed({ sealer: 'receiver' }, function (err, context) { if (err) throw err @@ -356,9 +308,7 @@ test('receiver seals', function (t) { }) test('`readseal` emitted once', function (t) { - // t.timeoutAfter(5000) contexts.twoFriendsSentReceivedSealed({ sealer: 'sender' }, function (err, context) { - const dude = context.sender context.friends.forEach(node => node.on('readseal', t.fail)) async.each(context.friends, function iterator (node, done) { node.sync(function () { @@ -376,7 +326,6 @@ test('`readseal` emitted once', function (t) { if (helpers.network.blockchain !== 'ethereum') { test('detect next version', function (t) { - // t.timeoutAfter(1000) let v1 = { [TYPE]: 'blah', a: 1 @@ -396,7 +345,6 @@ if (helpers.network.blockchain !== 'ethereum') { if (err) throw err v2 = result.object // signed - // utils.logify(utils, 'pubKeyToAddress', true) let seal newSealer.seal({ object: v2 }, rethrow) newSealer.on('wroteseal', _seal => seal = _seal) @@ -493,7 +441,7 @@ test('delete watch after X confirmed', function (t) { contexts.twoFriendsSentReceivedSealed({ sealer: 'receiver' }, function (err, context) { if (err) throw err - const { sender, receiver, friends } = context + const { sender, friends } = context async.parallel(friends.map(node => { return function (cb) { @@ -726,7 +674,7 @@ test('messagesWithObject', function (t) { taskCB => alice.send({ object, to: bob._recipientOpts }, taskCB), taskCB => bob.send({ object, to: carol._recipientOpts }, taskCB), taskCB => carol.send({ object, to: alice._recipientOpts }, taskCB) - ], function (err, results) { + ], function (err) { if (err) throw err // send same object @@ -735,7 +683,7 @@ test('messagesWithObject', function (t) { }) let togo = 2 - bob.on('message', msg => { + bob.on('message', () => { if (--togo) return async.parallel([ @@ -802,7 +750,7 @@ test('custom merkle', function (t) { const defaultMerkleOpts = protocol.DEFAULT_MERKLE_OPTS protocol.DEFAULT_MERKLE_OPTS = { leaf: function (a) { - return new Buffer(a.data) + return Buffer.from(a.data) }, parent: function (a, b) { return Buffer.concat([a.hash, b.hash]) @@ -834,20 +782,6 @@ test('custom merkle', function (t) { }) }) -// test.only('keeper missing file', function (t) { -// contexts.twoFriendsSentReceived(function (err, context) { -// if (err) throw err - -// context.sender.keeper.del(context.message.link, err => { -// context.sender.objects.lastMessage({ to: context.receiver.permalink }, err => { -// t.ok(err) -// t.end() -// context.destroy() -// }) -// }) -// }) -// }) - test('versioning can only be done by previous author', function (t) { contexts.twoFriendsSentReceivedSealed({ sealer: 'sender' }, function (err, context) { if (err) throw err @@ -1109,12 +1043,12 @@ test('pause per recipient', function (t) { function goodReceiver () { t.pass() - t.end() // wait a bit to see if we get any duplicates bob.on('message', badReceiver) setTimeout(function () { t.pass() friends.forEach(friend => friend.destroy()) + t.end() }, 1000) } }) diff --git a/test/ethereum-helpers.js b/test/ethereum-helpers.js index 4d22ea3..0afeab9 100644 --- a/test/ethereum-helpers.js +++ b/test/ethereum-helpers.js @@ -1,7 +1,5 @@ - -const once = require('once') const networkName = 'rinkeby' -const Wallet = require('ethereumjs-wallet') +const Wallet = require('@tradle/ethereumjs-wallet') const constants = require('@tradle/ethereum-adapter/networks')[networkName] const port = 28532 const Network = require('@tradle/ethereum-adapter') @@ -17,6 +15,7 @@ const network = Network.createNetwork({ module.exports = { network, + networkName, constants, port, transactor: createTransactor, @@ -24,7 +23,7 @@ module.exports = { } function createTransactor ({ privateKey }) { - privateKey = new Buffer(privateKey.priv, 'hex') + privateKey = Buffer.from(privateKey.priv, 'hex') const wallet = Wallet.fromPrivateKey(privateKey) const engine = Network.createEngine({ privateKey, diff --git a/test/etherrpc.js b/test/etherrpc.js old mode 100644 new mode 100755 index 0357def..a6d1dd1 --- a/test/etherrpc.js +++ b/test/etherrpc.js @@ -1,19 +1,53 @@ -const TestRPC = require('ethereumjs-testrpc') -const users = require('./fixtures/users') -const { blocktime } = require('./constants') -const { network, constants, port } = require('./ethereum-helpers') -const server = TestRPC.server({ - network_id: constants.chainId, - blocktime: blocktime / 1000, - accounts: users.map(user => { - const key = user.keys.find(key => key.networkName === network.name && key.purpose === 'messaging') - return { - secretKey: new Buffer(key.priv, 'hex'), - balance: '0x0000000000000056bc75e2d63100000' - } +#!/usr/bin/env node +const cp = require('child_process') +if (process.argv[2] === 'child') { + startServer() +} else { + startBgProcess() +} + +function startBgProcess () { + const p = cp.fork(__filename, ['child'], { + stdio: 'pipe' + }) + p.stdout.on('data', data => { + process.stdout.write(data) + p.unref() + process.exit() + }) + p.stderr.on('data', err => { + process.stderr.write(err) + process.exit(1) }) -}) +} -server.listen(port, function (err) { - if (err) throw err -}) +function startServer () { + const npid = require('npid') + const pid = npid.create(`${__dirname}/etherrpc.js.pid`) + pid.removeOnExit() + const TestRPC = require('ganache') + const users = require('./fixtures/users') + const { blocktime } = require('./constants') + const { network, constants, port, networkName } = require('./ethereum-helpers') + const server = TestRPC.server({ + chain: { + chainId: constants.chainId + }, + fork: { + network: networkName + }, + blocktime: blocktime / 1000, + accounts: users.map(user => { + const key = user.keys.find(key => key.networkName === network.name && key.purpose === 'messaging') + return { + secretKey: Buffer.from(key.priv, 'hex'), + balance: '0x0000000000000056bc75e2d63100000' + } + }) + }) + + server.listen(port, function (err) { + console.log(`Listening ganache server for chainId=${constants.chainId} at http://localhost:${port} with pid ${process.pid}`) + if (err) throw err + }) +} diff --git a/test/genUsers.js b/test/genUsers.js index c44a01f..1c09e13 100755 --- a/test/genUsers.js +++ b/test/genUsers.js @@ -2,10 +2,8 @@ const fs = require('fs') const path = require('path') -const typeforce = require('typeforce') -const utils = require('../lib/utils') +const typeforce = require('@tradle/typeforce') const { genUsers } = require('./helpers') -// const NONCE = constants.NONCE const argv = require('minimist')(process.argv.slice(2), { alias: { f: 'file', @@ -14,12 +12,13 @@ const argv = require('minimist')(process.argv.slice(2), { }) writeUsersFile(argv) +const writeUsersFileOpts = typeforce.compile({ + file: 'String', + number: 'Number' +}) function writeUsersFile (opts) { - typeforce({ - file: 'String', - number: 'Number' - }, opts) + writeUsersFileOpts.assert(opts) const { number, file } = opts genUsers(number, function (err, results) { diff --git a/test/helpers.js b/test/helpers.js index ecc6b55..59a9066 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -1,17 +1,12 @@ -const crypto = require('crypto') const deepEqual = require('deep-equal') const LEVELDOWN = require('memdown') -const changesFeed = require('changes-feed') +const changesFeed = require('@tradle/changes-feed') const async = require('async') const randomName = require('random-name') -// const network = require('@tradle/bitcoin-adapter').testnet -// const kiki = require('@tradle/kiki') -// const nkey = require('nkey-ec') const utils = require('../lib/utils') const constants = require('../lib/constants') const Node = require('../lib/node') -// const { testnet } = require('../lib/networks/bitcoin') const names = [ 'alice', 'bob', 'carol', 'david', 'eve', 'falstaff', @@ -28,7 +23,7 @@ const networkHelpers = BLOCKCHAIN === 'bitcoin' : require('./ethereum-helpers') const { blocktime } = require('./constants') -const { network } = networkHelpers +const { network, transactor, createAPI } = networkHelpers const helpers = exports const noop = function () {} let dbCounter = 0 @@ -85,19 +80,6 @@ exports.connect = function connect (nodes) { }) } -// exports.connect = function connect (people) { -// helpers.eachOther(people, function receiveOnSend (a, b) { -// var aInfo = { link: a.identityInfo.link } -// a._send = function (msg, recipient, cb) { -// b.receive(msg, aInfo, function (err) { -// if (err) throw err - -// cb.apply(null, arguments) -// }) -// } -// }) -// } - exports.meet = function meet (people, cb) { helpers.eachOther(people, function meet (a, b, done) { a.addContact(b.identity, done) @@ -122,23 +104,26 @@ exports.userToOpts = function userToOpts (user, name) { } exports.transactor = function ({ keys }) { - let privateKey - keys.some(key => { + const privateKey = keys.find(key => { const json = key.toJSON ? key.toJSON(true) : key - if (json.purpose === 'messaging' && - json.type === network.blockchain && - json.networkName === network.name) { - return privateKey = json + if (json.purpose !== 'messaging') { + return false + } + if (json.type !== network.blockchain) { + return false + } + if (json.networkName !== network.name) { + return false } + return true }) - return networkHelpers.transactor({ privateKey }) + return transactor({ privateKey }) } -exports.createAPI = networkHelpers.createAPI -exports.network = networkHelpers.network +exports.createAPI = createAPI +exports.network = network exports.blocktime = blocktime -// exports.mintBlocks = networkHelpers.mintBlocks exports.createNode = function createNode (opts) { let { @@ -149,7 +134,6 @@ exports.createNode = function createNode (opts) { const blockchainAdapter = opts.network || network const keeper = opts.keeper || helpers.keeper() - const privateKey = utils.chainKey(opts.keys, blockchainAdapter).privKeyString const transactor = opts.transactor || helpers.transactor({ keys }) const dir = opts.dir || helpers.nextDir() opts = utils.extend(opts, { diff --git a/test/integration.test.js b/test/integration.test.js index 8a99e5a..861a3e3 100644 --- a/test/integration.test.js +++ b/test/integration.test.js @@ -1,6 +1,5 @@ require('./env') -// const WHY = require('why-is-node-running') const test = require('tape') const Sendy = require('sendy') const SendyWS = require('sendy-ws') @@ -9,9 +8,6 @@ const AxolotlClient = require('sendy-axolotl') const memdown = require('memdown') const WebSocketClient = SendyWS.Client const createSwitchboard = SendyWS.Switchboard -// const OTRClient = require('sendy-otr') -// const nkey = require('nkey') -// const nkeyEC = require('nkey-ec') const createKeeper = require('@tradle/keeper') const constants = require('../lib/constants') const TYPE = constants.TYPE @@ -20,7 +16,6 @@ const helpers = require('./helpers') const contexts = require('./contexts') const SENDY_OPTS = { resendInterval: 1000, autoConnect: true } -// const newOTRSwitchboard = require('sendy-otr-ws').Switchboard test('sendy', function (t) { t.timeoutAfter(60000) @@ -64,7 +59,7 @@ test('sendy', function (t) { publicKey: tlsKey.pub }, client: sendy, - theirPubKey: new Buffer(recipient, 'hex') + theirPubKey: Buffer.from(recipient, 'hex') }) } }) @@ -73,13 +68,7 @@ test('sendy', function (t) { throw new Error('recipient not found') }) - transport.on('message', function (msg, from) { - // const pubKey = { - // type: 'ec', - // curve: 'curve25519', - // pub: new Buffer(from, 'hex') - // } - + transport.on('message', function (msg) { node.receive(JSON.parse(msg), { permalink: other.permalink }, rethrow) }) diff --git a/test/objectdb.test.js b/test/objectdb.test.js index f7c7ae1..4adca64 100644 --- a/test/objectdb.test.js +++ b/test/objectdb.test.js @@ -1,32 +1,18 @@ require('./env') const test = require('tape') -const async = require('async') -const extend = require('xtend') -const leveldown = require('memdown') const collect = require('stream-collector') const protocol = require('@tradle/protocol') const Actions = require('../lib/actions') const constants = require('../lib/constants') const createObjectDB = require('../lib/dbs/objects') -const createSender = require('../lib/sender') -const users = require('./fixtures/users') const utils = require('../lib/utils') -const topics = require('../lib/topics') -const statuses = require('../lib/status') const { TYPE, SIG, - PERMALINK, - PREVLINK, - LINK, AUTHOR, - VERSION, - TIMESTAMP, - TYPES, } = constants -const IDENTITY_TYPE = TYPES.IDENTITY const helpers = require('./helpers') test('list objects', function (t) { diff --git a/test/sealwatch.test.js b/test/sealwatch.test.js index 83804a4..316e015 100644 --- a/test/sealwatch.test.js +++ b/test/sealwatch.test.js @@ -3,21 +3,11 @@ require('./env') const test = require('tape') const async = require('async') const protocol = require('@tradle/protocol') -// const network = require('@tradle/bitcoin-adapter').testnet -// const createChainTracker = require('chain-tracker') const constants = require('../lib/constants') const watchTypes = constants.watchType -const PERMALINK = constants.PERMALINK -const PREVLINK = constants.PREVLINK -const LINK = constants.LINK const TYPE = constants.TYPE -const MESSAGE_TYPE = constants.TYPES.MESSAGE -const SIG = constants.SIG const createSealWatch = require('../lib/sealwatch') const createWatchDB = require('../lib/dbs/watches') -const topics = require('../lib/topics') -const statuses = require('../lib/status') -const createSealer = require('../lib/sealer') const utils = require('../lib/utils') const Actions = require('../lib/actions') const helpers = require('./helpers') @@ -25,17 +15,13 @@ const { network, blocktime } = helpers const users = require('./fixtures/users') test('watch', function (t) { - t.plan(3) + t.plan(2) const obj = { [TYPE]: 'something', prop: 'val' } - // protocol.sign({ object: obj, }, function (err, obj) { - - // }) - const permalink = 'a1' const link = permalink const headerHash = 'b1' @@ -47,14 +33,9 @@ test('watch', function (t) { const batch = utils.mapToBatch(keyToVal) keeper.batch(batch) - const alice = 'alice' - const authorLink = 'bob' - // const networkName = 'testnet' const changes = helpers.nextFeed() const actions = Actions({ changes }) - // const bob = helpers.dummyIdentity(authorLink) - // const bobKey = protocol.genECKey() const bob = users[0] const transactor = helpers.transactor({ keys: bob.keys }) @@ -66,7 +47,6 @@ test('watch', function (t) { const sealwatch = createSealWatch({ actions, - // chaintracker: chaintracker, getBlockchainAdapter: () => network, db: helpers.nextDB(), watches: watchDB, @@ -92,7 +72,6 @@ test('watch', function (t) { watchType: watchTypes.thisVersion }) - // const sealPrevPubKey = protocol.genECKey() transactor.send({ to: [ { @@ -109,8 +88,10 @@ test('watch', function (t) { // give time for duplicates to arrive if there are any setTimeout(function () { - t.ok(createdActions.newwatch) - t.ok(createdActions.readseal) + t.deepEquals(createdActions, { + newwatch: true, + readseal: true + }) sealwatch.stop() if (network.api.close) network.api.close() @@ -138,32 +119,23 @@ test('batch', function (t) { } }) - // protocol.sign({ object: obj, }, function (err, obj) { - - // }) - const keeper = helpers.nextDB() const batch = utils.mapToBatch(keyToVal) keeper.batch(batch) - const alice = 'alice' - const authorLink = 'bob' const bob = users[0] - // const bob = helpers.dummyIdentity(authorLink) - // const bobKey = protocol.genECKey() const changes = helpers.nextFeed() - const actions = Actions({ changes: changes }) + const actions = Actions({ changes }) const transactor = helpers.transactor(bob) const watchDB = createWatchDB({ - changes: changes, + changes, db: helpers.nextDB(), keeper: keeper }) const sealwatch = createSealWatch({ actions, - // chaintracker: chaintracker, getBlockchainAdapter: () => network, db: helpers.nextDB(), watches: watchDB, @@ -178,7 +150,6 @@ test('batch', function (t) { sealwatch.start() const { api } = network - const txs = api.addresses.transactions let total = 0 api.addresses.transactions = function (txs, cb) { t.ok(txs.length <= 5) @@ -208,7 +179,6 @@ test('batch', function (t) { watchType: watchTypes.thisVersion }, rethrow) - // const sealPrevPubKey = protocol.genECKey() transactor.send({ to: [ { diff --git a/test/sender.test.js b/test/sender.test.js index a8ae254..e3b1568 100644 --- a/test/sender.test.js +++ b/test/sender.test.js @@ -2,13 +2,9 @@ require('./env') const test = require('tape') const async = require('async') -const createBackoff = require('backoff') const protocol = require('@tradle/protocol') const constants = require('../lib/constants') const { - PERMALINK, - PREVLINK, - LINK, TYPE, SIG, SEQ, @@ -18,20 +14,16 @@ const { TIMESTAMP, } = constants const MESSAGE_TYPE = TYPES.MESSAGE -const topics = require('../lib/topics') const statuses = require('../lib/status') const createObjectDB = require('../lib/dbs/objects') const createSender = require('../lib/sender') const utils = require('../lib/utils') const createActions = require('../lib/actions') const helpers = require('./helpers') -const users = require('./fixtures/users') test('try again', function (t) { t.plan(13) - const aliceKey = protocol.genECKey() - const alicePubKey = utils.omit(aliceKey, 'priv') const bobKey = protocol.genECKey() const bobPubKey = utils.omit(bobKey, 'priv') const authorLink = 'bbbb' @@ -100,7 +92,6 @@ test('try again', function (t) { let unsent = [] async.each(objs, create, start) - // const unsent = batch.map(row => row.value).filter(val => val[TYPE] === MESSAGE_TYPE) let failuresToGo = 3 const sender = createSender({ name: 'sender', @@ -198,7 +189,3 @@ test('try again', function (t) { }) } }) - -function rethrow (err) { - if (err) throw err -} diff --git a/test/unit.test.js b/test/unit.test.js index 5a52062..7b8124f 100644 --- a/test/unit.test.js +++ b/test/unit.test.js @@ -2,9 +2,6 @@ require('./env') const test = require('tape') const backoff = require('backoff') -const memdown = require('memdown') -const levelup = require('levelup') -const subdown = require('subleveldown') const Readable = require('readable-stream').Readable const collect = require('stream-collector') const protocol = require('@tradle/protocol') @@ -13,13 +10,10 @@ const createRetryStream = require('../lib/retrystream') const utils = require('../lib/utils') const network = require('@tradle/bitcoin-adapter').testnet const Partial = require('../lib/partial') -const users = require('./fixtures/users') const { TYPE, SIG, - AUTHOR, - VERSION, - TIMESTAMP + AUTHOR } = require('../lib/constants') test('merge streams', function (t) { @@ -50,67 +44,11 @@ test('merge streams', function (t) { }) test('pub key to address', function (t) { - const pub = new Buffer('030135adc7e0be8429fc903511f2f72ea481b25f9177d9f2f3d2ecfcd81d1b02b4', 'hex') + const pub = Buffer.from('030135adc7e0be8429fc903511f2f72ea481b25f9177d9f2f3d2ecfcd81d1b02b4', 'hex') t.equal(network.pubKeyToAddress(pub), 'muZH3FNp1836Eyxc966NnfWwe79TnUhuFi') t.end() }) -// test('codecs', function (t) { -// const top = levelup('top', { -// db: memdown, -// valueEncoding: 'json' -// }) - -// const utf8 = subdown(top, 'a', { -// valueEncoding: 'utf8' -// }) - -// const binary = subdown(top, 'b', { -// valueEncoding: 'binary' -// }) - -// const custom = subdown(top, 'c', { -// valueEncoding: { -// encode: function (value) { -// return 'blah' -// }, -// decode: function (value) { -// return 'habla' -// } -// } -// }) - -// const rawBatch = [ -// { -// type: 'put', -// key: 'top', -// value: 'json' -// }, -// { -// type: 'del', -// key: 'utf8', -// value: 'utf8', -// db: utf8 -// }, -// { -// type: 'put', -// key: 'binary', -// value: 'binary', -// db: binary -// }, -// { -// type: 'put', -// key: 'custom', -// value: 'custom', -// db: custom -// } -// ]; - -// const encoded = utils.encodeBatch(rawBatch) -// console.log(encoded) -// t.end() -// }) - test('queue', function (t) { let jobsRunning = 0 const jobs = [ @@ -170,20 +108,6 @@ test('queue', function (t) { // test duplicates jobs.forEach(job => input.push(job)) } - - // jobs.forEach(function (job, idx) { - // // each job may be queued multiple times - // // but shouldn't be executed multiple times - // for (var i = 0; i < timesQueued; i++) { - // (function () { - // q.push(job.id, job.data, function (err, val) { - // t.equal(val, job.data) - // t.equal(job.data.tries, 0) - // t.equal(job.data.timesExecuted, 1) - // }) - // })() - // } - // }) }) test('pause queue', function (t) { @@ -257,6 +181,7 @@ test('lockify', function (t) { }) obj.b('b', function (err, val) { + t.error(err) --running t.ok(done.a) t.equal(val, 'yay') @@ -269,65 +194,129 @@ test('lockify', function (t) { }) }) +function last (arr) { + const l = arr.length + if (l === 0) { + return null + } + return arr[l - 1] +} test('controls', function (t) { - let started - let paused - - const c = controls({ - start: function () { - t.notOk(started) - started = true - return function () { + t.test('basic function', function (t) { + let started = false + let paused = false + const events = [] + + const c = controls({ + start (arg) { + t.notOk(started) + t.notOk(paused) + t.equals(this, c) + t.equals(arg, 'arg-start') + const lastEvent = last(events) + t.ok(lastEvent === null || lastEvent === 'stop') + t.notEquals(last(events), 'start') + started = true + return function stop (stopArg) { + t.equals(c, this) // eslint-disable-line no-invalid-this + t.ok(started) + t.equals(stopArg, 'arg-end') + started = false + } + }, + pause (arg) { t.ok(started) - started = false + t.notOk(paused) + t.equals(this, c) + t.equals(last(events), 'start') + t.equals(arg, 'arg-pause') + paused = true + return function resume (resumeArg) { + t.equals(this, c) // eslint-disable-line no-invalid-this + t.equals(resumeArg, undefined) // eslint-disable-line no-undefined + t.ok(started) + t.ok(paused) + t.equals(last(events), 'pause') + paused = false + } } - }, - pause: function () { - t.notOk(paused) - paused = true - return function () { - t.ok(paused) - paused = false + }) + .on('start', () => events.push('start')) + .on('pause', () => events.push('pause')) + .on('resume', () => events.push('resume')) + .on('stop', () => events.push('stop')) + + t.notOk(c.isRunning()) + t.throws(() => c.pause()) + t.throws(() => c.resume()) + + c.start('arg-start') + t.deepEquals(events, ['start']) + t.ok(c.isRunning()) + c.pause('arg-pause') + t.deepEquals(events, ['start', 'pause']) + c.pause() + t.deepEquals(events, ['start', 'pause']) + t.notOk(c.isRunning()) + c.stop('arg-end') + t.deepEquals(events, ['start', 'pause', 'resume', 'stop']) + t.notOk(c.isRunning()) + t.throws(() => c.resume()) + + c.start('arg-start') + t.ok(c.isRunning()) + c.pause('arg-pause') + c.resume('arg-resume') + t.deepEquals(events, ['start', 'pause', 'resume', 'stop', 'start', 'pause', 'resume']) + c.stop('arg-end') + + t.end() + }) + + t.test('without pause', function (t) { + const c = controls({ + start () { + return () => {} } - } + }) + c.start() + t.throws(() => c.pause()) + t.end() }) - - t.notOk(c.isRunning()) - t.throws(function () { + + t.test('extending another instance', function (t) { + const base = controls({ + start () { + t.equals(this, c) + return function stop () { + t.equals(this, c) // eslint-disable-line no-invalid-this + } + }, + pause () { + t.equals(this, c) + return function resume () { + t.equals(this, c) // eslint-disable-line no-invalid-this + } + } + }) + const events = [] + const c = Object.assign({ + test: true, + emit (event) { + events.push(event) + } + }, base) + t.ok(c.test) + c.start() + t.deepEquals(events, ['start']) c.pause() + t.deepEquals(events, ['start', 'pause']) + c.stop() + t.deepEquals(events, ['start', 'pause', 'resume', 'stop']) + t.end() }) - - c.start() - t.ok(c.isRunning()) - c.pause() - t.notOk(c.isRunning()) - c.stop() - t.notOk(c.isRunning()) - t.throws(function () { - c.resume() - }) - - c.start() - t.ok(c.isRunning()) - - t.end() }) -// test('identity serialization', function (t) { -// users.slice(0, 1).forEach(u => { -// const identity = u.identity -// identity.pubkeys.forEach(function (p) { -// const deserialized = utils.deserializePubKey(utils.serializePubKey(p)) -// t.same(deserialized, p) -// }) - -// const deserialized = utils.deserializeIdentity(utils.serializeIdentity(identity)) -// t.same(deserialized, identity) -// }) - -// t.end() -// }) - test('partials', function (t) { const obj = protocol.object({ object: { @@ -368,65 +357,3 @@ test('partials', function (t) { t.end() }) - -// test('queue', function (t) { -// let jobsRunning = 0 -// const jobs = [ -// { tries: 2 }, -// { tries: 5 }, -// { tries: 1 }, -// { tries: 4 } -// ].map(function (data, i) { -// data.timesExecuted = 0 -// return { -// id: i, -// data: data -// } -// }) - -// const total = jobs.reduce(function (sum, job) { -// return sum + job.data.tries -// }, 0) - -// let timesQueued = 3 -// t.plan(total + jobs.length * 3 * timesQueued) - -// const worker = function (data, cb) { -// t.equal(jobsRunning++, 0) -// setTimeout(function () { -// jobsRunning-- -// data.tries-- -// if (data.tries < 0) throw new Error('too many tries') - -// if (data.tries === 0) { -// data.timesExecuted++ -// cb(null, data) -// } -// else { -// cb(new Error('boo')) -// } -// }, 10) -// } - -// const q = createRetryStream({ -// worker: worker, -// backoff: backoff.exponential({ -// initialDelay: 10, -// maxDelay: 100 -// }) -// }) - -// jobs.forEach(function (job, idx) { -// // each job may be queued multiple times -// // but shouldn't be executed multiple times -// for (var i = 0; i < timesQueued; i++) { -// (function () { -// q.push(job.id, job.data, function (err, val) { -// t.equal(val, job.data) -// t.equal(job.data.tries, 0) -// t.equal(job.data.timesExecuted, 1) -// }) -// })() -// } -// }) -// }) diff --git a/test/validator.test.js b/test/validator.test.js index 4fba369..4f6fe16 100644 --- a/test/validator.test.js +++ b/test/validator.test.js @@ -1,7 +1,6 @@ require('./env') const test = require('tape') -const levelErrors = require('level-errors') const validator = require('../lib/validator') const utils = require('../lib/utils') const constants = require('../lib/constants') @@ -14,7 +13,6 @@ test('validator', function (t) { if (err) throw err const sender = context.sender - const receiver = context.receiver const validate = validator(sender).validate const object = context.object const wrapper = context.sent @@ -46,28 +44,4 @@ test('validator', function (t) { }) }) }) - - // const existingObjectLink = 'abc' - // const node = { - // addressBook: { - // byLink: function (link, cb) { - // process.nextTick(function () { - // if (link === existingObjectLink) { - // cb(null, { - // object: existingObject - // }) - // } else { - // cb(new utils.notFoundErr()) - // } - // }) - // } - // }, - // objects: { - // get: function (link, cb) { - // process.nextTick(function () { - // }) - // } - // } - // } - // }) }) diff --git a/test/wallet.js b/test/wallet.js index 73a1374..6f40017 100644 --- a/test/wallet.js +++ b/test/wallet.js @@ -1,21 +1,18 @@ const crypto = require('crypto') const Wallet = require('@tradle/simple-wallet') const bitcoin = require('@tradle/bitcoinjs-lib') -const typeforce = require('typeforce') -const utils = require('@tradle/utils') -const { testnet } = require('@tradle/bitcoin-adapter') +const typeforce = require('@tradle/typeforce') + +const walletOpts = typeforce.object({ + unspents: 'Array', + network: 'Object' +}) module.exports = function (options) { - typeforce({ - unspents: 'Array', - network: 'Object' - }, options) + walletOpts.assert(options) const { network } = options const walletUnspents = options.unspents - const total = walletUnspents.reduce(function (sum, n) { - return sum + n - }, 0) let { priv } = options if (typeof priv === 'string') { @@ -131,16 +128,7 @@ function createFakeChain ({ network, unspents }) { process.nextTick(function () { cb(null, unspents) }) - }, - // summary: function (addrs, cb) { - // process.nextTick(function () { - // cb(null, addrs.map(function (a) { - // return { - // balance: total - // } - // })) - // }) - // } + } }, transactions: { get: function (txIds, cb) {