From d1758866da3fd1873d85d344f515d597062ac3e0 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 14:51:45 +0100 Subject: [PATCH 01/25] Fix bug in light.js, dependsOn and frequency --- packages/light.js/src/rpc/utils/createRpc.ts | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/light.js/src/rpc/utils/createRpc.ts b/packages/light.js/src/rpc/utils/createRpc.ts index 82777b0c..0f25a5b8 100644 --- a/packages/light.js/src/rpc/utils/createRpc.ts +++ b/packages/light.js/src/rpc/utils/createRpc.ts @@ -10,7 +10,11 @@ import { merge, Observable, OperatorFunction } from 'rxjs'; import { createApiFromProvider, getApi } from '../../api'; import { distinctReplayRefCount } from '../../utils/operators'; -import { Metadata, RpcObservableOptions } from '../../types'; +import { + FrequencyObservable, + Metadata, + RpcObservableOptions +} from '../../types'; /** * Add metadata to an RpcObservable, and transform it into a ReplaySubject(1). @@ -25,12 +29,24 @@ import { Metadata, RpcObservableOptions } from '../../types'; */ const createRpcWithApi = memoizeeWeak( (api: any, metadata: Metadata, ...args: any[]) => { + if (!metadata.dependsOn && !metadata.frequency) { + throw new Error( + `Rpc$ '${ + metadata.name + }' needs either a 'dependsOn' or a 'frequency' field.` + ); + } + // The source Observable can either be another RpcObservable (in the // `dependsOn` field), or anObservable built by merging all the // FrequencyObservables const source$ = metadata.dependsOn ? metadata.dependsOn(...args, { provider: api.provider }) - : merge(...metadata.frequency.map(f => f({ provider: api.provider }))); + : merge( + ...(metadata.frequency as FrequencyObservable[]).map(f => + f({ provider: api.provider }) + ) + ); // The pipes to add const pipes: OperatorFunction[] = []; From 3cfe5469b88ed65184c4b98311d88ea21af13fdb Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 15:11:36 +0100 Subject: [PATCH 02/25] Name is optional in input --- packages/abi/src/spec/event/decodedLogParam.ts | 4 ++-- packages/abi/src/spec/event/eventParam.ts | 4 ++-- packages/abi/src/spec/param.ts | 4 ++-- packages/abi/src/types.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/abi/src/spec/event/decodedLogParam.ts b/packages/abi/src/spec/event/decodedLogParam.ts index 5628aee9..e9f4e844 100644 --- a/packages/abi/src/spec/event/decodedLogParam.ts +++ b/packages/abi/src/spec/event/decodedLogParam.ts @@ -9,10 +9,10 @@ import Token from '../../token'; class DecodedLogParam { private _kind: ParamType; - private _name: string; + private _name: string | undefined; private _token: Token; - constructor (name: string, kind: ParamType, token: Token) { + constructor (name: string | undefined, kind: ParamType, token: Token) { if (!isInstanceOf(kind, ParamType)) { throw new Error('kind not instanceof ParamType'); } else if (!isInstanceOf(token, Token)) { diff --git a/packages/abi/src/spec/event/eventParam.ts b/packages/abi/src/spec/event/eventParam.ts index c822f7c4..dbe8e049 100644 --- a/packages/abi/src/spec/event/eventParam.ts +++ b/packages/abi/src/spec/event/eventParam.ts @@ -11,7 +11,7 @@ import { toParamType } from '../paramType/format'; class EventParam { private _indexed: boolean; private _kind: ParamType; - private _name: string; + private _name: string | undefined; static toEventParams (params: (Param | AbiInput)[]) { return params.map( @@ -26,7 +26,7 @@ class EventParam { ); } - constructor (name: string, type: TokenTypeEnum, indexed = false) { + constructor (name: string | undefined, type: TokenTypeEnum, indexed = false) { this._name = name; this._indexed = indexed; this._kind = toParamType(type, indexed); diff --git a/packages/abi/src/spec/param.ts b/packages/abi/src/spec/param.ts index aef311d2..05cbce70 100644 --- a/packages/abi/src/spec/param.ts +++ b/packages/abi/src/spec/param.ts @@ -9,9 +9,9 @@ import { toParamType } from './paramType/format'; class Param { private _kind: ParamType; - private _name: string; + private _name: string | undefined; - constructor (name: string, type: string) { + constructor (name: string | undefined, type: string) { this._name = name; this._kind = toParamType(type); } diff --git a/packages/abi/src/types.ts b/packages/abi/src/types.ts index af69c482..05ae52dd 100644 --- a/packages/abi/src/types.ts +++ b/packages/abi/src/types.ts @@ -9,7 +9,7 @@ import Token from './token'; export interface AbiInput { indexed?: boolean; - name: string; + name?: string; type: TokenTypeEnum; } @@ -100,7 +100,7 @@ export type TokenValue = export interface AbiItem { anonymous?: boolean; constant?: boolean; - inputs?: AbiInput[]; + inputs: AbiInput[]; name?: string; payable?: boolean; outputs?: AbiInput[]; From becd6fb51c08114ce77812b26388b857682f46c1 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 15:26:57 +0100 Subject: [PATCH 03/25] Make some args optional --- packages/abi/src/decoder/decoder.ts | 2 +- packages/abi/src/spec/function.ts | 4 ++-- packages/abi/src/types.ts | 2 +- packages/abi/src/util/slice.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/abi/src/decoder/decoder.ts b/packages/abi/src/decoder/decoder.ts index b3534ce0..32d47a17 100644 --- a/packages/abi/src/decoder/decoder.ts +++ b/packages/abi/src/decoder/decoder.ts @@ -17,7 +17,7 @@ import { Slices } from '../types'; const NULL = '0000000000000000000000000000000000000000000000000000000000000000'; class Decoder { - static decode (params: ParamType[] | undefined, data: string) { + static decode (params: ParamType[] | undefined, data?: string) { if (!isArray(params)) { throw new Error('Parameters should be array of ParamType'); } diff --git a/packages/abi/src/spec/function.ts b/packages/abi/src/spec/function.ts index b046c802..450438e2 100644 --- a/packages/abi/src/spec/function.ts +++ b/packages/abi/src/spec/function.ts @@ -77,11 +77,11 @@ class Func { return this._signature; } - decodeInput (data: string) { + decodeInput (data?: string) { return Decoder.decode(this.inputParamTypes(), data); } - decodeOutput (data: string) { + decodeOutput (data?: string) { return Decoder.decode(this.outputParamTypes(), data); } diff --git a/packages/abi/src/types.ts b/packages/abi/src/types.ts index 05ae52dd..059bdb0b 100644 --- a/packages/abi/src/types.ts +++ b/packages/abi/src/types.ts @@ -100,7 +100,7 @@ export type TokenValue = export interface AbiItem { anonymous?: boolean; constant?: boolean; - inputs: AbiInput[]; + inputs?: AbiInput[]; name?: string; payable?: boolean; outputs?: AbiInput[]; diff --git a/packages/abi/src/util/slice.ts b/packages/abi/src/util/slice.ts index 7ab3f743..1cfba5c0 100644 --- a/packages/abi/src/util/slice.ts +++ b/packages/abi/src/util/slice.ts @@ -10,7 +10,7 @@ import { padAddress } from './pad'; * * @param data - Data to slice. */ -export const sliceData = (data: string): string[] | null => { +export const sliceData = (data?: string): string[] | null => { if (!data || !data.length) { return []; } From a231256053355c14b38005e12e9a1ec0eaee69e3 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 15:34:06 +0100 Subject: [PATCH 04/25] Event and function with no name --- packages/abi/src/spec/event/event.ts | 10 +--------- packages/abi/src/spec/function.ts | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/packages/abi/src/spec/event/event.ts b/packages/abi/src/spec/event/event.ts index b178fc8b..f93f52f9 100644 --- a/packages/abi/src/spec/event/event.ts +++ b/packages/abi/src/spec/event/event.ts @@ -16,7 +16,7 @@ class Event { private _anonymous: boolean; private _id: string; private _inputs: EventParam[]; - private _name: string; + private _name: string | undefined; private _signature: string; constructor (abi: AbiItem) { @@ -28,14 +28,6 @@ class Event { this.inputParamTypes() ); - if (!name) { - throw new Error( - `Event constructor: abi item does not have a name: ${JSON.stringify( - abi - )}` - ); - } - this._id = id; this._name = name; this._signature = signature; diff --git a/packages/abi/src/spec/function.ts b/packages/abi/src/spec/function.ts index 450438e2..f0010e3a 100644 --- a/packages/abi/src/spec/function.ts +++ b/packages/abi/src/spec/function.ts @@ -15,7 +15,7 @@ class Func { private _constant: boolean; private _id: string; private _inputs: Param[]; - private _name: string; + private _name: string | undefined; private _outputs: Param[]; private _payable: boolean; private _signature: string; @@ -32,14 +32,6 @@ class Func { this.inputParamTypes() ); - if (!name) { - throw new Error( - `Event constructor: abi item does not have a name: ${JSON.stringify( - abi - )}` - ); - } - this._id = id; this._name = name; this._signature = signature; From 6945475cd707f3712c8484b1bf7cc871afdcf58a Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 15:34:33 +0100 Subject: [PATCH 05/25] Fix util --- jest.config.js | 3 +-- packages/api/src/format/input.ts | 26 +++++++++++++++----------- packages/api/src/util/decode.spec.ts | 4 ++-- packages/api/src/util/decode.ts | 14 ++++++++------ packages/api/src/util/encode.spec.ts | 2 +- packages/api/src/util/encode.ts | 21 ++++++++++++++++----- packages/api/src/util/format.ts | 6 +++--- packages/api/src/util/types.ts | 3 +-- 8 files changed, 47 insertions(+), 32 deletions(-) diff --git a/jest.config.js b/jest.config.js index 17fd727b..bb0e51d8 100644 --- a/jest.config.js +++ b/jest.config.js @@ -10,6 +10,5 @@ module.exports = { transform: { '^.+\\.tsx?$': 'ts-jest' }, - // testRegex: 'spec\\.(ts|tsx)$' // TODO Skip api/ tests for now, as it's still WIP - testRegex: `packages/(abi|contracts|electron|light\.js|light\.js-react)/.*spec\\.(ts|tsx)$` + testRegex: 'spec\\.(ts|tsx)$' // TODO Skip api/ tests for now, as it's still WIP }; diff --git a/packages/api/src/format/input.ts b/packages/api/src/format/input.ts index 6eadb488..fd1123de 100644 --- a/packages/api/src/format/input.ts +++ b/packages/api/src/format/input.ts @@ -9,6 +9,8 @@ import { BlockNumber } from '../types'; import { isArray, isHex, isInstanceOf, isString } from '../util/types'; import { padLeft, toHex } from '../util/format'; +type Topic = string | undefined; + /** * Validate input address. * @@ -56,18 +58,20 @@ export const inHash = (hash: string) => { return inHex(hash); }; -export const inTopics = topics => { - return (topics || []).filter(topic => topic === null || topic).map(topic => { - if (topic === null) { - return null; - } +export const inTopics = (topics: Topic[]): Topic[] => { + return (topics || []) + .filter(topic => topic === null || topic) + .map(topic => { + if (topic === null) { + return null; + } - if (Array.isArray(topic)) { - return inTopics(topic); - } + if (Array.isArray(topic)) { + return inTopics(topic); + } - return padLeft(topic, 32); - }); + return padLeft(topic, 32); + }); }; export const inFilter = options => { @@ -112,7 +116,7 @@ export const inNumber10 = (n: BlockNumber) => { export const inNumber16 = (n: BlockNumber) => { const bn = isInstanceOf(n, BigNumber) - ? n as BigNumber + ? (n as BigNumber) : new BigNumber(n || 0); if (!bn.isInteger()) { diff --git a/packages/api/src/util/decode.spec.ts b/packages/api/src/util/decode.spec.ts index 54450f21..ba272843 100644 --- a/packages/api/src/util/decode.spec.ts +++ b/packages/api/src/util/decode.spec.ts @@ -39,7 +39,7 @@ describe('util/decode', () => { describe('decodeMethodInput', () => { it('expects a valid ABI', () => { - expect(() => decodeMethodInput(null, null)).toThrow( + expect(() => decodeMethodInput(null as any, null as any)).toThrow( /should receive valid method/ ); }); @@ -51,7 +51,7 @@ describe('util/decode', () => { }); it('correct decodes null inputs', () => { - expect(decodeMethodInput({}, null)).toEqual([]); + expect(decodeMethodInput({})).toEqual([]); }); it('correct decodes empty inputs', () => { diff --git a/packages/api/src/util/decode.ts b/packages/api/src/util/decode.ts index fc067694..c1ce8a72 100644 --- a/packages/api/src/util/decode.ts +++ b/packages/api/src/util/decode.ts @@ -51,7 +51,7 @@ export const decodeCallData = ( */ export const decodeMethodInput = ( methodAbi: AbiItem, - paramdata: string + paramdata?: string ): TokenValue[] => { if (!methodAbi) { throw new Error( @@ -71,7 +71,7 @@ export const decodeMethodInput = ( return new Func(methodAbi) .decodeInput(paramdata) - .map(decoded => decoded.value); + .map(decoded => decoded.value) as TokenValue[]; }; /** @@ -102,11 +102,13 @@ export const methodToAbi = (method: string) => { const types = method .substr(typesStart + 1, length - (typesStart + 1) - 1) .split(','); - const inputs = types.filter(_type => _type.length).map(_type => { - const type = fromParamType(toParamType(_type)); + const inputs = types + .filter(_type => _type.length) + .map(_type => { + const type = fromParamType(toParamType(_type)); - return { type }; - }); + return { type }; + }); return { type: 'function', name, inputs }; }; diff --git a/packages/api/src/util/encode.spec.ts b/packages/api/src/util/encode.spec.ts index 65805a35..fb318b37 100644 --- a/packages/api/src/util/encode.spec.ts +++ b/packages/api/src/util/encode.spec.ts @@ -58,7 +58,7 @@ describe('util/encode', () => { }); it('encodes only the data with null name', () => { - expect(abiEncode(null, ['uint256', 'bool'], [0x123, true])).toEqual( + expect(abiEncode(undefined, ['uint256', 'bool'], [0x123, true])).toEqual( `0x${RESULT.substr(8)}` ); }); diff --git a/packages/api/src/util/encode.ts b/packages/api/src/util/encode.ts index 4586ca58..ae4ddb24 100644 --- a/packages/api/src/util/encode.ts +++ b/packages/api/src/util/encode.ts @@ -22,7 +22,7 @@ import { sha3 } from './sha3'; * @param values - The values that are passed to this method. */ export const encodeMethodCallAbi = ( - methodAbi: AbiItem = {}, + methodAbi: AbiItem, values: TokenValue[] = [] ) => { const func = new Func(methodAbi); @@ -40,7 +40,7 @@ export const encodeMethodCallAbi = ( * @param data - The data that is passed to this method. */ export const abiEncode = ( - methodName: string, + methodName: string | undefined, inputTypes: TokenTypeEnum[], data: TokenValue[] ) => { @@ -69,6 +69,7 @@ export const abiUnencode = (abi: AbiObject, data: string) => { const op = abi.find(field => { return ( field.type === 'function' && + !!field.inputs && abiSignature(field.name, field.inputs.map(input => input.type)).substr( 2, 8 @@ -76,7 +77,7 @@ export const abiUnencode = (abi: AbiObject, data: string) => { ); }); - if (!op) { + if (!op || !op.inputs) { console.warn(`Unknown function ID: ${callsig}`); return null; } @@ -84,9 +85,19 @@ export const abiUnencode = (abi: AbiObject, data: string) => { const argsByIndex = abiDecode( op.inputs.map(field => field.type), '0x' + data.substr(10) - ).map((value, index) => cleanupValue(value as string, op.inputs[index].type)); + ).map( + (value, index) => + cleanupValue(value as string, (op.inputs as any)[index].type) // TODO Remove `as any` here + ); const argsByName = op.inputs.reduce( (result, field, index) => { + if (!field.name) { + throw new Error( + `abiUnencode: input at index ${index} with type ${ + field.type + } doesn't have a name.` + ); + } result[field.name] = argsByIndex[index]; return result; @@ -103,6 +114,6 @@ export const abiUnencode = (abi: AbiObject, data: string) => { * @param name - The name of the method. * @param inputs - The inputs' types of this method. */ -export const abiSignature = (name: string, inputs: string[]) => { +export const abiSignature = (name: string | undefined, inputs: string[]) => { return sha3(`${name}(${inputs.join()})`); }; diff --git a/packages/api/src/util/format.ts b/packages/api/src/util/format.ts index 9c603519..f7e800bf 100644 --- a/packages/api/src/util/format.ts +++ b/packages/api/src/util/format.ts @@ -28,7 +28,7 @@ export const cleanupValue = (value: string | number | Bytes, type: string) => { // TODO: make work with arbitrary depth arrays if (value instanceof Array && type.match(/bytes[0-9]+/)) { // figure out if it's an ASCII string hiding in there: - let ascii = ''; + let ascii: string | null = ''; let ended = false; for (let index = 0; index < value.length && ascii !== null; ++index) { @@ -131,7 +131,7 @@ export const padRight = (input: string, length: number) => { * @param input - The input string to pad. * @param length - The number of zeros to pad. */ -export const padLeft = (input: string, length: number) => { +export const padLeft = (input: string | undefined, length: number) => { const hexLength = length * 2; const value = toHex(input).substr(2, hexLength); @@ -149,7 +149,7 @@ export const padLeft = (input: string, length: number) => { * * @param str - The string to convert. */ -export const toHex = (str: string) => { +export const toHex = (str?: string) => { if (str && str.toString) { // TODO string has no toString(16) // @ts-ignore diff --git a/packages/api/src/util/types.ts b/packages/api/src/util/types.ts index 81f3f0a5..46615966 100644 --- a/packages/api/src/util/types.ts +++ b/packages/api/src/util/types.ts @@ -3,5 +3,4 @@ // // SPDX-License-Identifier: MIT -// TODO '@parity/abi/lib/util/types' doesn't pass tests -export * from '@parity/abi/src/util/types'; +export * from '@parity/abi/lib/util/types'; From 20a0e64d85241938ca9518f6c066efd740524242 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 16:53:15 +0100 Subject: [PATCH 06/25] Use function instead of const --- packages/abi/src/util/types.ts | 32 ++++++++++++++++++++------------ packages/api/src/types.d.ts | 3 ++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/abi/src/util/types.ts b/packages/abi/src/util/types.ts index 011f7fdf..501380ac 100644 --- a/packages/abi/src/util/types.ts +++ b/packages/abi/src/util/types.ts @@ -22,15 +22,19 @@ const HEXDIGITS = [ 'f' ]; -export const isArray = (input: any): input is Array => - Array.isArray(input); +export function isArray (input: any): input is Array { + return Array.isArray(input); +} -export const isError = (input: any): input is Error => input instanceof Error; +export function isError (input: any): input is Error { + return input instanceof Error; +} -export const isFunction = (input: any): input is Function => - typeof input === 'function'; +export function isFunction (input: any): input is Function { + return typeof input === 'function'; +} -export const isHex = (input: any): boolean => { +export function isHex (input: any): boolean { if (!isString(input)) { return false; } @@ -47,11 +51,15 @@ export const isHex = (input: any): boolean => { } return hex; -}; -export const isObject = (input: any): input is object => - Object.prototype.toString.call(input) === '[object Object]'; +} +export function isObject (input: any): input is object { + return Object.prototype.toString.call(input) === '[object Object]'; +} -export const isString = (input: any): input is string => - typeof input === 'string'; +export function isString (input: any): input is string { + return typeof input === 'string'; +} -export const isInstanceOf = (input: any, clazz: any) => input instanceof clazz; +export function isInstanceOf (input: any, clazz: any) { + return input instanceof clazz; +} diff --git a/packages/api/src/types.d.ts b/packages/api/src/types.d.ts index 5c2241f8..9151be60 100644 --- a/packages/api/src/types.d.ts +++ b/packages/api/src/types.d.ts @@ -12,7 +12,8 @@ export type BlockNumber = | 'latest' | 'pending' | number - | BigNumber; + | BigNumber + | string; export type EtherDenomination = | 'wei' From 795a62537ff0a21df0da0329c519e98b3ec154d6 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 16:53:31 +0100 Subject: [PATCH 07/25] Remove useless files --- packages/api/src/provider/ipc.js | 173 ---------------- packages/api/src/provider/ipc.spec.js | 29 --- packages/api/src/provider/postMessage.js | 186 ------------------ packages/api/src/provider/postMessage.spec.js | 134 ------------- 4 files changed, 522 deletions(-) delete mode 100644 packages/api/src/provider/ipc.js delete mode 100644 packages/api/src/provider/ipc.spec.js delete mode 100644 packages/api/src/provider/postMessage.js delete mode 100644 packages/api/src/provider/postMessage.spec.js diff --git a/packages/api/src/provider/ipc.js b/packages/api/src/provider/ipc.js deleted file mode 100644 index b43c1d4d..00000000 --- a/packages/api/src/provider/ipc.js +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const EventEmitter = require('eventemitter3'); - -// https://github.com/electron/electron/issues/2288 -const IS_ELECTRON = !!(typeof window !== 'undefined' && window && window.process && window.process.type); - -let ipcRenderer; - -if (IS_ELECTRON) { - ipcRenderer = window.require('electron').ipcRenderer; -} - -const METHOD_REQUEST_TOKEN = 'shell_requestNewToken'; - -class Ipc extends EventEmitter { - constructor (appId) { - super(); - this._appId = appId; - - this.id = 0; - this._messages = {}; - this._queued = []; - - if (!IS_ELECTRON) { - throw new Error('IpcProvider must be used in Electron environment.'); - } - - ipcRenderer.on('PARITY_SHELL_IPC_CHANNEL', this.receiveMessage.bind(this)); - } - - _constructMessage (id, data) { - return Object.assign({}, data, { - id, - to: 'shell', - from: this._appId, - token: this._token - }); - } - - receiveMessage (_, { id, error, from, to, token, result }) { - const isTokenValid = token ? token === this._token : true; - - if (from !== 'shell' || to !== this._appId || !isTokenValid) { - return; - } - - if (this._messages[id].subscription) { - this._messages[id].initial - ? this._messages[id].resolve(result) - : this._messages[id].callback(error && new Error(error), result); - this._messages[id].initial = false; - } else { - this._messages[id].callback(error && new Error(error), result); - this._messages[id] = null; - } - } - - requestNewToken () { - return new Promise((resolve, reject) => { - // Webview is ready when receivin the ping - ipcRenderer.once('ping', () => { - this.send(METHOD_REQUEST_TOKEN, [], (error, token) => { - if (error) { - reject(error); - } else { - this.setToken(token); - resolve(token); - } - }); - }); - }); - } - - _send (message) { - if (!this._token && message.data.method !== METHOD_REQUEST_TOKEN) { - this._queued.push(message); - - return; - } - - const id = ++this.id; - const postMessage = this._constructMessage(id, message.data); - - this._messages[id] = Object.assign({}, postMessage, message.options); - - ipcRenderer.sendToHost('parity', { data: postMessage }); - } - - send (method, params, callback) { - this._send({ - data: { - method, - params - }, - options: { - callback - } - }); - } - - _sendQueued () { - if (!this._token) { - return; - } - - this._queued.forEach(this._send.bind(this)); - this._queued = []; - } - - setToken (token) { - if (token) { - this._connected = true; - this._token = token; - this.emit('connected'); - this._sendQueued(); - } - } - - subscribe (api, callback, params) { - return new Promise((resolve, reject) => { - this._send({ - data: { - api, - params - }, - options: { - callback, - resolve, - reject, - subscription: true, - initial: true - } - }); - }); - } - - // FIXME: Should return callback, not promise - unsubscribe (subId) { - return new Promise((resolve, reject) => { - this._send({ - data: { - subId - }, - options: { - callback: (error, result) => { - error ? reject(error) : resolve(result); - } - } - }); - }); - } - - unsubscribeAll () { - return this.unsubscribe('*'); - } -} - -module.exports = Ipc; diff --git a/packages/api/src/provider/ipc.spec.js b/packages/api/src/provider/ipc.spec.js deleted file mode 100644 index 3cfde4ea..00000000 --- a/packages/api/src/provider/ipc.spec.js +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -/* eslint-disable no-unused-expressions */ - -const IpcProvider = require('./ipc'); - -function createProvider () { - return new IpcProvider('ipc://test.com', '123', false); -} - -describe('provider/IpcProvider', () => { - it('throws error if not Electron', () => { - expect(createProvider).to.throw('IpcProvider must be used in Electron environment.'); - }); -}); diff --git a/packages/api/src/provider/postMessage.js b/packages/api/src/provider/postMessage.js deleted file mode 100644 index 26b2bf94..00000000 --- a/packages/api/src/provider/postMessage.js +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const EventEmitter = require('eventemitter3'); - -const METHOD_REQUEST_TOKEN = 'shell_requestNewToken'; - -class PostMessage extends EventEmitter { - constructor (appId, destination, source) { - super(); - - this._appId = appId; - this._destination = destination || window.parent; - - this.id = 0; - this._connected = false; - this._messages = {}; - this._queued = []; - - this._receiveMessage = this._receiveMessage.bind(this); - this._send = this._send.bind(this); - this.send = this.send.bind(this); - this.subscribe = this.subscribe.bind(this); - this.unsubscribe = this.unsubscribe.bind(this); - - (source || window).addEventListener('message', this._receiveMessage, false); - } - - get isConnected () { - return this._connected; - } - - get isParity () { - return true; - } - - get queuedCount () { - return this._queued.length; - } - - setToken (token) { - if (token) { - this._connected = true; - this._token = token; - this.emit('connected'); - this._sendQueued(); - } - } - - addMiddleware () { - } - - requestNewToken () { - return new Promise((resolve, reject) => { - this.send(METHOD_REQUEST_TOKEN, [], (error, token) => { - if (error) { - reject(error); - } else { - this.setToken(token); - resolve(token); - } - }); - }); - } - - _constructMessage (id, data) { - return Object.assign({}, data, { - id, - to: 'shell', - from: this._appId, - token: this._token - }); - } - - _send (message) { - if (!this._token && message.data.method !== METHOD_REQUEST_TOKEN) { - this._queued.push(message); - - return; - } - - const id = ++this.id; - const postMessage = this._constructMessage(id, message.data); - - this._messages[id] = Object.assign({}, postMessage, message.options); - this._destination.postMessage(postMessage, '*'); - } - - send (method, params, callback) { - this._send({ - data: { - method, - params - }, - options: { - callback - } - }); - } - - _sendQueued () { - if (!this._token) { - return; - } - - this._queued.forEach(this._send); - this._queued = []; - } - - subscribe (api, callback, params) { - // console.log('paritySubscribe', JSON.stringify(params), api, callback); - return new Promise((resolve, reject) => { - this._send({ - data: { - api, - params - }, - options: { - callback, - resolve, - reject, - subscription: true, - initial: true - } - }); - }); - } - - // FIXME: Should return callback, not promise - unsubscribe (subId) { - return new Promise((resolve, reject) => { - this._send({ - data: { - subId - }, - options: { - callback: (error, result) => { - error - ? reject(error) - : resolve(result); - } - } - }); - }); - } - - unsubscribeAll () { - return this.unsubscribe('*'); - } - - _receiveMessage ({ data: { id, error, from, to, token, result }, origin, source }) { - const isTokenValid = token - ? token === this._token - : true; - - if (from !== 'shell' || to !== this._appId || !isTokenValid) { - return; - } - - if (this._messages[id].subscription) { - // console.log('subscription', result, 'initial?', this._messages[id].initial); - this._messages[id].initial - ? this._messages[id].resolve(result) - : this._messages[id].callback(error && new Error(error), result); - this._messages[id].initial = false; - } else { - this._messages[id].callback(error && new Error(error), result); - this._messages[id] = null; - } - } -} - -module.exports = PostMessage; diff --git a/packages/api/src/provider/postMessage.spec.js b/packages/api/src/provider/postMessage.spec.js deleted file mode 100644 index e41f6f74..00000000 --- a/packages/api/src/provider/postMessage.spec.js +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -/* eslint-disable no-unused-expressions */ - -const sinon = require('sinon'); - -const PostMessage = require('./postMessage'); - -const APP_ID = 'xyz'; - -let destination; -let provider; -let source; - -function createDestination () { - destination = { - postMessage: sinon.stub() - }; - - return destination; -} - -function createSource () { - source = { - addEventListener: sinon.stub() - }; - - return source; -} - -function createProvider () { - provider = new PostMessage(APP_ID, createDestination(), createSource()); - - return provider; -} - -describe('provider/PostMessage', () => { - beforeEach(() => { - createProvider(); - }); - - describe('constructor', () => { - it('adds an event listener for message', () => { - expect(source.addEventListener).to.have.been.calledWith('message', provider._receiveMessage); - }); - }); - - describe('getters', () => { - describe('isParity', () => { - it('returns true', () => { - expect(provider.isParity).toBe.true; - }); - }); - - describe('isConnected', () => { - it('returns the internal connected status', () => { - provider._connected = 'connected'; - - expect(provider.isConnected).toEqual('connected'); - }); - }); - }); - - describe('setToken', () => { - beforeEach(() => { - sinon.spy(provider, '_sendQueued'); - }); - - afterEach(() => { - provider._sendQueued.restore(); - }); - - it('sets the connected status', () => { - expect(provider.isConnected).toBe.false; - - provider.setToken('123'); - - expect(provider.isConnected).toBe.true; - }); - - it('sends all queued messages', () => { - expect(provider._sendQueued).not.to.have.beenCalled; - - provider.setToken('123'); - - expect(provider._sendQueued).to.have.been.called; - }); - - it('emits a connected message', (done) => { - provider.on('connected', done); - provider.setToken('123'); - }); - }); - - describe('send', () => { - it('queues messages before token is available', () => { - expect(provider.queuedCount).toEqual(0); - - provider.send('method', 'params', () => {}); - - expect(destination.postMessage).not.to.have.been.called; - expect(provider.queuedCount).toEqual(1); - }); - - it('sends queued messages as token is available', () => { - expect(provider.queuedCount).toEqual(0); - - provider.send('method', 'params', () => {}); - provider.setToken('123'); - - expect(destination.postMessage).to.have.been.calledWith( - provider._constructMessage(1, { - method: 'method', - params: 'params' - }), '*' - ); - expect(provider.queuedCount).toEqual(0); - }); - }); -}); From e6aa6135e75c70a1572db28a651f9ad227ee3f83 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 16:53:47 +0100 Subject: [PATCH 08/25] Fix inputs --- .../format/{input.spec.js => input.spec.ts} | 139 ++++++++------ packages/api/src/format/input.ts | 175 +++++++++++++----- packages/api/test/types.js | 50 ----- 3 files changed, 213 insertions(+), 151 deletions(-) rename packages/api/src/format/{input.spec.js => input.spec.ts} (79%) delete mode 100644 packages/api/test/types.js diff --git a/packages/api/src/format/input.spec.js b/packages/api/src/format/input.spec.ts similarity index 79% rename from packages/api/src/format/input.spec.js rename to packages/api/src/format/input.spec.ts index 3fd84727..ab0fc19b 100644 --- a/packages/api/src/format/input.spec.js +++ b/packages/api/src/format/input.spec.ts @@ -14,12 +14,27 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -/* eslint-disable no-unused-expressions */ - -const BigNumber = require('bignumber.js'); - -const { inAddress, inAddresses, inBlockNumber, inData, inFilter, inHash, inHex, inNumber10, inNumber16, inOptions, inTraceType, inDeriveHash, inDeriveIndex, inTopics } = require('./input'); -const { isAddress } = require('../../test/types'); +import BigNumber from 'bignumber.js'; +import { isAddress } from '@parity/abi/lib/util/address'; + +import { + FilterOptions, + Options, + inAddress, + inAddresses, + inBlockNumber, + inData, + inFilter, + inHash, + inHex, + inNumber10, + inNumber16, + inOptions, + inTraceType, + inDeriveHash, + inDeriveIndex, + inTopics +} from './input'; describe('format/input', () => { const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; @@ -52,10 +67,7 @@ describe('format/input', () => { it('handles mapping of all addresses in array', () => { const address = '63cf90d3f0410092fc0fca41846f596223979195'; - expect(inAddresses([null, address])).toEqual([ - '0x', - `0x${address}` - ]); + expect(inAddresses([undefined, address])).toEqual(['0x', `0x${address}`]); }); }); @@ -125,21 +137,21 @@ describe('format/input', () => { }); describe('inFilter', () => { - ['address'].forEach((input) => { + ['address' as keyof FilterOptions].forEach(input => { it(`formats ${input} address as address`, () => { - const block = {}; + const block: FilterOptions = {}; block[input] = address; const formatted = inFilter(block)[input]; - expect(isAddress(formatted)).toBe.true; + expect(isAddress(formatted as string)).toBe(true); expect(formatted).toEqual(address); }); }); - ['fromBlock', 'toBlock'].forEach((input) => { + (['fromBlock', 'toBlock'] as (keyof FilterOptions)[]).forEach(input => { it(`formats ${input} number as blockNumber`, () => { - const block = {}; + const block: FilterOptions = {}; block[input] = 0x123; const formatted = inFilter(block)[input]; @@ -149,7 +161,9 @@ describe('format/input', () => { }); it('ignores and passes through unknown keys', () => { - expect(inFilter({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); + expect(inFilter({ someRandom: 'someRandom' } as any)).toEqual({ + someRandom: 'someRandom' + }); }); it('formats an filter options object with relevant entries converted', () => { @@ -208,9 +222,9 @@ describe('format/input', () => { }); describe('inOptions', () => { - ['data'].forEach((input) => { + ['data' as keyof Options].forEach(input => { it(`converts ${input} to hex data`, () => { - const block = {}; + const block: Options = {}; block[input] = '1234'; const formatted = inData(block[input]); @@ -219,14 +233,14 @@ describe('format/input', () => { }); }); - ['from', 'to'].forEach((input) => { + (['from', 'to'] as (keyof Options)[]).forEach(input => { it(`formats ${input} address as address`, () => { - const block = {}; + const block: Options = {}; block[input] = address; - const formatted = inOptions(block)[input]; + const formatted = inOptions(block)[input] as string; - expect(isAddress(formatted)).toBe.true; + expect(isAddress(formatted)).toBe(true); expect(formatted).toEqual(address); }); }); @@ -235,26 +249,30 @@ describe('format/input', () => { const options = { to: '' }; const formatted = inOptions(options); - expect(formatted.to).toEqual(''); + expect(formatted.to).toEqual(undefined); }); - ['gas', 'gasPrice', 'value', 'nonce'].forEach((input) => { - it(`formats ${input} number as hexnumber`, () => { - const block = {}; + (['gas', 'gasPrice', 'value', 'nonce'] as (keyof Options)[]).forEach( + input => { + it(`formats ${input} number as hexnumber`, () => { + const block: Options = {}; - block[input] = 0x123; - const formatted = inOptions(block)[input]; + block[input] = 0x123; + const formatted = inOptions(block)[input]; - expect(formatted).toEqual('0x123'); - }); - }); + expect(formatted).toEqual('0x123'); + }); + } + ); it('passes condition as null when specified as such', () => { expect(inOptions({ condition: null })).toEqual({ condition: null }); }); it('ignores and passes through unknown keys', () => { - expect(inOptions({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); + expect(inOptions({ someRandom: 'someRandom' } as any)).toEqual({ + someRandom: 'someRandom' + }); }); it('formats an options object with relevant entries converted', () => { @@ -308,17 +326,21 @@ describe('format/input', () => { type: 'soft' }); - expect(inDeriveHash({ - hash: 5 - })).toEqual({ + expect( + inDeriveHash({ + hash: 5 + }) + ).toEqual({ hash: '0x5', type: 'soft' }); - expect(inDeriveHash({ - hash: 5, - type: 'hard' - })).toEqual({ + expect( + inDeriveHash({ + hash: 5, + type: 'hard' + }) + ).toEqual({ hash: '0x5', type: 'hard' }); @@ -330,22 +352,33 @@ describe('format/input', () => { expect(inDeriveIndex(null)).toEqual([]); expect(inDeriveIndex([])).toEqual([]); - expect(inDeriveIndex([1])).toEqual([{ - index: 1, - type: 'soft' - }]); + expect(inDeriveIndex([1])).toEqual([ + { + index: 1, + type: 'soft' + } + ]); - expect(inDeriveIndex({ - index: 1 - })).toEqual([{ - index: 1, - type: 'soft' - }]); + expect( + inDeriveIndex({ + index: 1 + }) + ).toEqual([ + { + index: 1, + type: 'soft' + } + ]); - expect(inDeriveIndex([{ - index: 1, - type: 'hard' - }, 5])).toEqual([ + expect( + inDeriveIndex([ + { + index: 1, + type: 'hard' + }, + 5 + ]) + ).toEqual([ { index: 1, type: 'hard' diff --git a/packages/api/src/format/input.ts b/packages/api/src/format/input.ts index fd1123de..4787a65d 100644 --- a/packages/api/src/format/input.ts +++ b/packages/api/src/format/input.ts @@ -9,14 +9,49 @@ import { BlockNumber } from '../types'; import { isArray, isHex, isInstanceOf, isString } from '../util/types'; import { padLeft, toHex } from '../util/format'; -type Topic = string | undefined; +export type Condition = { + block?: BlockNumber; + time?: Date; +} | null; +export interface DeriveObject { + hash?: number; + index?: number; + type?: string; +} +export type Derive = number | string | DeriveObject | null; +export interface FilterObject { + fromAddress?: string; + fromBlock?: BlockNumber; + toAddress?: string; + toBlock?: BlockNumber; +} +export interface FilterOptions { + address?: string | string[]; + extraData?: string; + fromBlock?: BlockNumber; + limit?: BlockNumber; + toBlock?: BlockNumber; + topics?: Topic[]; +} +export interface Options { + extraData?: string; + from?: string; + condition?: Condition; + gas?: BlockNumber; + gasPrice?: BlockNumber; + value?: BlockNumber; + nonce?: BlockNumber; + to?: string; + data?: any; +} +export type Topic = string | null; /** * Validate input address. * * @param address - Input address to validate. */ -export const inAddress = (address: string) => { +export const inAddress = (address?: string) => { // TODO: address validation if we have upper-lower addresses return inHex(address); }; @@ -26,11 +61,11 @@ export const inAddress = (address: string) => { * * @param addresses - Input addresses to validate. */ -export const inAddresses = (addresses: string[]) => { +export const inAddresses = (addresses?: (string | undefined)[]) => { return (addresses || []).map(inAddress); }; -export const inBlockNumber = (blockNumber: BlockNumber) => { +export const inBlockNumber = (blockNumber?: BlockNumber) => { if (isString(blockNumber)) { switch (blockNumber) { case 'earliest': @@ -58,10 +93,16 @@ export const inHash = (hash: string) => { return inHex(hash); }; -export const inTopics = (topics: Topic[]): Topic[] => { - return (topics || []) - .filter(topic => topic === null || topic) - .map(topic => { +export const inTopics = (topics?: (Topic | Topic[])[]): (string | null)[] => { + if (!topics) { + return [] as string[]; + } + + // @ts-ignore I don't want to deal with resursive nested arrays + // TODO https://stackoverflow.com/questions/52638149/recursive-nested-array-type-can-it-be-done + return topics + .filter((topic: Topic | Topic[]) => topic === null || topic) + .map((topic: Topic | Topic[]) => { if (topic === null) { return null; } @@ -74,39 +115,48 @@ export const inTopics = (topics: Topic[]): Topic[] => { }); }; -export const inFilter = options => { +export const inFilter = (options: FilterOptions) => { + const result: { + [key in keyof FilterOptions]: number | string | string[] | Topic[] + } = {}; + if (options) { Object.keys(options).forEach(key => { switch (key) { case 'address': if (isArray(options[key])) { - options[key] = options[key].map(inAddress); + result[key] = (options[key] as string[]).map(inAddress); } else { - options[key] = inAddress(options[key]); + result[key] = inAddress(options[key] as string); } break; case 'fromBlock': case 'toBlock': - options[key] = inBlockNumber(options[key]); + result[key] = inBlockNumber(options[key]); break; case 'limit': - options[key] = inNumber10(options[key]); + result[key] = inNumber10(options[key]); break; case 'topics': - options[key] = inTopics(options[key]); + result[key] = inTopics(options[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = options[key]; } }); } - return options; + return result; }; -export const inHex = (str: string) => toHex(str); +export const inHex = (str?: string) => toHex(str); -export const inNumber10 = (n: BlockNumber) => { +export const inNumber10 = (n?: BlockNumber) => { if (isInstanceOf(n, BigNumber)) { return (n as BigNumber).toNumber(); } @@ -114,7 +164,7 @@ export const inNumber10 = (n: BlockNumber) => { return new BigNumber(n || 0).toNumber(); }; -export const inNumber16 = (n: BlockNumber) => { +export const inNumber16 = (n?: BlockNumber) => { const bn = isInstanceOf(n, BigNumber) ? (n as BigNumber) : new BigNumber(n || 0); @@ -128,10 +178,7 @@ export const inNumber16 = (n: BlockNumber) => { return inHex(bn.toString(16)); }; -export const inOptionsCondition = (condition: { - block?: BlockNumber; - time?: Date; -}) => { +export const inOptionsCondition = (condition?: Condition) => { if (condition) { return { block: condition.block ? inNumber10(condition.block) : null, @@ -144,69 +191,96 @@ export const inOptionsCondition = (condition: { return null; }; -export const inOptions = (_options = {}) => { +export const inOptions = (_options: Options = {}) => { const options = Object.assign({}, _options); + const result: { + extraData?: string; + to?: string; + from?: string; + condition?: { + block?: number | null; + time?: number | null; + } | null; + gas?: string; + gasPrice?: string; + value?: string; + nonce?: string; + data?: string; + } = {}; + Object.keys(options).forEach(key => { switch (key) { case 'to': // Don't encode the `to` option if it's empty // (eg. contract deployments) if (options[key]) { - options.to = inAddress(options[key]); + result.to = inAddress(options[key]); } break; case 'from': - options[key] = inAddress(options[key]); + result[key] = inAddress(options[key]); break; case 'condition': - options[key] = inOptionsCondition(options[key]); + result[key] = inOptionsCondition(options[key]); break; case 'gas': case 'gasPrice': - options[key] = inNumber16(new BigNumber(options[key]).round()); + result[key] = inNumber16( + new BigNumber(options[key] as BigNumber) // TODO Round number + ); break; case 'value': case 'nonce': - options[key] = inNumber16(options[key]); + result[key] = inNumber16(options[key]); break; case 'data': - options[key] = inData(options[key]); + result[key] = inData(options[key]); break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = options[key]; } }); - return options; + return result; }; -export const inTraceFilter = filterObject => { +export const inTraceFilter = (filterObject: FilterObject) => { + const result: { [key in keyof FilterObject]: string | string[] } = {}; + if (filterObject) { Object.keys(filterObject).forEach(key => { switch (key) { case 'fromAddress': case 'toAddress': - filterObject[key] = [] - .concat(filterObject[key]) + result[key] = ([] as string[]) + .concat(filterObject[key] as string) .map(address => inAddress(address)); break; case 'toBlock': case 'fromBlock': - filterObject[key] = inBlockNumber(filterObject[key]); + result[key] = inBlockNumber(filterObject[key]); break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = options[key]; } }); } - return filterObject; + return result; }; -export const inTraceType = whatTrace => { +export const inTraceType = (whatTrace: string | string[]) => { if (isString(whatTrace)) { return [whatTrace]; } @@ -214,31 +288,36 @@ export const inTraceType = whatTrace => { return whatTrace; }; -export const inDeriveType = derive => { - return derive && derive.type === 'hard' ? 'hard' : 'soft'; +export const inDeriveType = (derive?: Derive) => { + return derive && (derive as DeriveObject).type === 'hard' ? 'hard' : 'soft'; }; -export const inDeriveHash = derive => { - const hash = derive && derive.hash ? derive.hash : derive; - const type = inDeriveType(derive); +export const inDeriveHash = (derive?: Derive | string) => { + const hash = + derive && (derive as DeriveObject).hash + ? (derive as DeriveObject).hash + : (derive as string); + const type = inDeriveType(derive as Derive); return { - hash: inHex(hash), + hash: inHex(hash as string), type }; }; -export const inDeriveIndex = derive => { +export const inDeriveIndex = (derive: Derive | Derive[]) => { if (!derive) { return []; } - if (!isArray(derive)) { - derive = [derive]; - } + const deriveAsArray: Derive[] = isArray(derive) ? derive : [derive]; - return derive.map(item => { - const index = inNumber10(item && item.index ? item.index : item); + return deriveAsArray.map(item => { + const index = inNumber10( + item && (item as DeriveObject).index + ? (item as DeriveObject).index + : (item as number) + ); return { index, diff --git a/packages/api/test/types.js b/packages/api/test/types.js deleted file mode 100644 index 2dbcbeb0..00000000 --- a/packages/api/test/types.js +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const BigNumber = require('bignumber.js'); - -const { isFunction, isInstanceOf } = require('../src/util/types'); -const { isAddress } = require('../src/util/address'); - -const ZEROS = '000000000000000000000000000000000000000000000000000000000000'; - -function isBigNumber (test) { - return isInstanceOf(test, BigNumber); -} - -function isBoolean (test) { - return Object.prototype.toString.call(test) === '[object Boolean]'; -} - -function isHexNumber (_test) { - if (_test.substr(0, 2) !== '0x') { - return false; - } - - const test = _test.substr(2); - const hex = `${ZEROS}${(new BigNumber(_test, 16)).toString(16)}`.slice(-1 * test.length); - - return hex === test; -} - -module.exports = { - isAddress, - isBigNumber, - isBoolean, - isFunction, - isHexNumber, - isInstanceOf -}; From 5ceb14371771992f834b83214984140dbf4e98d4 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 22 Nov 2018 18:50:10 +0100 Subject: [PATCH 09/25] First step in converting output to TS --- packages/abi/src/util/address.ts | 2 +- packages/abi/src/util/types.ts | 12 +- packages/api/src/format/input.spec.ts | 3 +- packages/api/src/format/input.ts | 68 +-- packages/api/src/format/output.js | 463 --------------- .../format/{output.spec.js => output.spec.ts} | 307 ++++++---- packages/api/src/format/output.ts | 534 ++++++++++++++++++ packages/api/src/format/types.serialized.ts | 161 ++++++ packages/api/src/types.d.ts | 29 - packages/api/src/types.ts | 248 ++++++++ 10 files changed, 1157 insertions(+), 670 deletions(-) delete mode 100644 packages/api/src/format/output.js rename packages/api/src/format/{output.spec.js => output.spec.ts} (65%) create mode 100644 packages/api/src/format/output.ts create mode 100644 packages/api/src/format/types.serialized.ts delete mode 100644 packages/api/src/types.d.ts create mode 100644 packages/api/src/types.ts diff --git a/packages/abi/src/util/address.ts b/packages/abi/src/util/address.ts index b36b9c9b..a6bf84d1 100644 --- a/packages/abi/src/util/address.ts +++ b/packages/abi/src/util/address.ts @@ -33,7 +33,7 @@ export const isChecksumValid = (address: string) => { * * @param address - The address to verify. */ -export const isAddress = (address: string) => { +export const isAddress = (address?: string) => { if (address && address.length === 42) { if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { return false; diff --git a/packages/abi/src/util/types.ts b/packages/abi/src/util/types.ts index 501380ac..066b61a1 100644 --- a/packages/abi/src/util/types.ts +++ b/packages/abi/src/util/types.ts @@ -22,19 +22,19 @@ const HEXDIGITS = [ 'f' ]; -export function isArray (input: any): input is Array { +export function isArray (input?: any): input is Array { return Array.isArray(input); } -export function isError (input: any): input is Error { +export function isError (input?: any): input is Error { return input instanceof Error; } -export function isFunction (input: any): input is Function { +export function isFunction (input?: any): input is Function { return typeof input === 'function'; } -export function isHex (input: any): boolean { +export function isHex (input?: any): boolean { if (!isString(input)) { return false; } @@ -52,11 +52,11 @@ export function isHex (input: any): boolean { return hex; } -export function isObject (input: any): input is object { +export function isObject (input?: any): input is object { return Object.prototype.toString.call(input) === '[object Object]'; } -export function isString (input: any): input is string { +export function isString (input?: any): input is string { return typeof input === 'string'; } diff --git a/packages/api/src/format/input.spec.ts b/packages/api/src/format/input.spec.ts index ab0fc19b..c1e1be76 100644 --- a/packages/api/src/format/input.spec.ts +++ b/packages/api/src/format/input.spec.ts @@ -17,9 +17,8 @@ import BigNumber from 'bignumber.js'; import { isAddress } from '@parity/abi/lib/util/address'; +import { FilterOptions, Options } from '../types'; import { - FilterOptions, - Options, inAddress, inAddresses, inBlockNumber, diff --git a/packages/api/src/format/input.ts b/packages/api/src/format/input.ts index 4787a65d..972c7f65 100644 --- a/packages/api/src/format/input.ts +++ b/packages/api/src/format/input.ts @@ -5,46 +5,19 @@ import BigNumber from 'bignumber.js'; -import { BlockNumber } from '../types'; +import { + BlockNumber, + Condition, + DeriveObject, + Derive, + FilterObject, + FilterOptions, + Options, + Topic +} from '../types'; import { isArray, isHex, isInstanceOf, isString } from '../util/types'; import { padLeft, toHex } from '../util/format'; - -export type Condition = { - block?: BlockNumber; - time?: Date; -} | null; -export interface DeriveObject { - hash?: number; - index?: number; - type?: string; -} -export type Derive = number | string | DeriveObject | null; -export interface FilterObject { - fromAddress?: string; - fromBlock?: BlockNumber; - toAddress?: string; - toBlock?: BlockNumber; -} -export interface FilterOptions { - address?: string | string[]; - extraData?: string; - fromBlock?: BlockNumber; - limit?: BlockNumber; - toBlock?: BlockNumber; - topics?: Topic[]; -} -export interface Options { - extraData?: string; - from?: string; - condition?: Condition; - gas?: BlockNumber; - gasPrice?: BlockNumber; - value?: BlockNumber; - nonce?: BlockNumber; - to?: string; - data?: any; -} -export type Topic = string | null; +import { SerializedCondition, SerializedTransaction } from './types.serialized'; /** * Validate input address. @@ -178,14 +151,14 @@ export const inNumber16 = (n?: BlockNumber) => { return inHex(bn.toString(16)); }; -export const inOptionsCondition = (condition?: Condition) => { +export const inOptionsCondition = (condition?: Condition | null) => { if (condition) { return { block: condition.block ? inNumber10(condition.block) : null, time: condition.time ? inNumber10(Math.floor(condition.time.getTime() / 1000)) : null - }; + } as SerializedCondition; } return null; @@ -194,20 +167,7 @@ export const inOptionsCondition = (condition?: Condition) => { export const inOptions = (_options: Options = {}) => { const options = Object.assign({}, _options); - const result: { - extraData?: string; - to?: string; - from?: string; - condition?: { - block?: number | null; - time?: number | null; - } | null; - gas?: string; - gasPrice?: string; - value?: string; - nonce?: string; - data?: string; - } = {}; + const result: SerializedTransaction = {}; Object.keys(options).forEach(key => { switch (key) { diff --git a/packages/api/src/format/output.js b/packages/api/src/format/output.js deleted file mode 100644 index 4c050d0c..00000000 --- a/packages/api/src/format/output.js +++ /dev/null @@ -1,463 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const BigNumber = require('bignumber.js'); - -const { toChecksumAddress } = require('@parity/abi/lib/util/address'); - -const { isString } = require('../util/types'); - -function outAccountInfo (infos) { - return Object - .keys(infos) - .reduce((ret, _address) => { - const info = infos[_address]; - const address = outAddress(_address); - - ret[address] = { - name: info.name - }; - - if (info.meta) { - ret[address].uuid = info.uuid; - try { - ret[address].meta = JSON.parse(info.meta); - } catch (e) { - console.error(`Couldn't parse meta field of JSON key file ${info.uuid}`); - } - } - - return ret; - }, {}); -} - -function outAddress (address) { - return toChecksumAddress(address); -} - -function outAddresses (addresses) { - return (addresses || []).map(outAddress); -} - -function outBlock (block) { - if (block) { - Object.keys(block).forEach((key) => { - switch (key) { - case 'author': - case 'miner': - block[key] = outAddress(block[key]); - break; - - case 'difficulty': - case 'gasLimit': - case 'gasUsed': - case 'nonce': - case 'number': - case 'totalDifficulty': - block[key] = outNumber(block[key]); - break; - - case 'timestamp': - block[key] = outDate(block[key]); - break; - } - }); - } - - return block; -} - -function outChainStatus (status) { - if (status) { - Object.keys(status).forEach((key) => { - switch (key) { - case 'blockGap': - status[key] = status[key] - ? status[key].map(outNumber) - : status[key]; - break; - } - }); - } - - return status; -} - -function outDate (date) { - if (typeof date.toISOString === 'function') { - return date; - } - - try { - if (typeof date === 'string' && (new Date(date)).toISOString() === date) { - return new Date(date); - } - } catch (error) {} - - return new Date(outNumber(date).toNumber() * 1000); -} - -function outHistogram (histogram) { - if (histogram) { - Object.keys(histogram).forEach((key) => { - switch (key) { - case 'bucketBounds': - case 'counts': - histogram[key] = histogram[key].map(outNumber); - break; - } - }); - } - - return histogram; -} - -function outLog (log) { - Object.keys(log).forEach((key) => { - switch (key) { - case 'blockNumber': - case 'logIndex': - case 'transactionIndex': - log[key] = outNumber(log[key]); - break; - - case 'address': - log[key] = outAddress(log[key]); - break; - } - }); - - return log; -} - -function outHwAccountInfo (infos) { - return Object - .keys(infos) - .reduce((ret, _address) => { - const address = outAddress(_address); - - ret[address] = infos[_address]; - - return ret; - }, {}); -} - -function outNodeKind (info) { - return info; -} - -function outNumber (number) { - return new BigNumber(number || 0); -} - -function outPeer (peer) { - const protocols = Object.keys(peer.protocols) - .reduce((obj, key) => { - if (peer.protocols[key]) { - obj[key] = Object.assign({}, peer.protocols[key], { - difficulty: outNumber(peer.protocols[key].difficulty) - }); - } - - return obj; - }, {}); - - return Object.assign({}, peer, { - protocols - }); -} - -function outPeers (peers) { - return { - active: outNumber(peers.active), - connected: outNumber(peers.connected), - max: outNumber(peers.max), - peers: peers.peers.map((peer) => outPeer(peer)) - }; -} - -function outPrivateReceipt (receipt) { - if (receipt) { - Object.keys(receipt).forEach((key) => { - switch (key) { - case 'status': - receipt[key] = outNumber(receipt[key]); - break; - - case 'contractAddress': - receipt[key] = outAddress(receipt[key]); - break; - } - }); - } - - return receipt; -} - -function outReceipt (receipt) { - if (receipt) { - Object.keys(receipt).forEach((key) => { - switch (key) { - case 'blockNumber': - case 'cumulativeGasUsed': - case 'gasUsed': - case 'transactionIndex': - receipt[key] = outNumber(receipt[key]); - break; - - case 'contractAddress': - receipt[key] = outAddress(receipt[key]); - break; - } - }); - } - - return receipt; -} - -function outRecentDapps (recentDapps) { - if (recentDapps) { - Object.keys(recentDapps).forEach((url) => { - recentDapps[url] = outDate(recentDapps[url]); - }); - } - - return recentDapps; -} - -function outSignerRequest (request) { - if (request) { - Object.keys(request).forEach((key) => { - switch (key) { - case 'id': - request[key] = outNumber(request[key]); - break; - - case 'payload': - request[key].decrypt = outSigningPayload(request[key].decrypt); - request[key].sign = outSigningPayload(request[key].sign); - request[key].signTransaction = outTransaction(request[key].signTransaction); - request[key].sendTransaction = outTransaction(request[key].sendTransaction); - break; - - case 'origin': - const type = Object.keys(request[key])[0]; - const details = request[key][type]; - - request[key] = { type, details }; - break; - } - }); - } - - return request; -} - -function outSyncing (syncing) { - if (syncing && syncing !== 'false') { - Object.keys(syncing).forEach((key) => { - switch (key) { - case 'currentBlock': - case 'highestBlock': - case 'startingBlock': - case 'warpChunksAmount': - case 'warpChunksProcessed': - syncing[key] = outNumber(syncing[key]); - break; - - case 'blockGap': - syncing[key] = syncing[key] ? syncing[key].map(outNumber) : syncing[key]; - break; - } - }); - } - - return syncing; -} - -function outTransactionCondition (condition) { - if (condition) { - if (condition.block) { - condition.block = outNumber(condition.block); - } else if (condition.time) { - condition.time = outDate(condition.time); - } - } - - return condition; -} - -function outTransaction (tx) { - if (tx) { - Object.keys(tx).forEach((key) => { - switch (key) { - case 'blockNumber': - case 'gasPrice': - case 'gas': - case 'nonce': - case 'transactionIndex': - case 'value': - tx[key] = outNumber(tx[key]); - break; - - case 'condition': - tx[key] = outTransactionCondition(tx[key]); - break; - - case 'creates': - case 'from': - case 'to': - tx[key] = outAddress(tx[key]); - break; - } - }); - } - - return tx; -} - -function outSigningPayload (payload) { - if (payload) { - Object.keys(payload).forEach((key) => { - switch (key) { - case 'address': - payload[key] = outAddress(payload[key]); - break; - } - }); - } - - return payload; -} - -function outTrace (trace) { - if (trace) { - if (trace.action) { - Object.keys(trace.action).forEach(key => { - switch (key) { - case 'gas': - case 'value': - case 'balance': - trace.action[key] = outNumber(trace.action[key]); - break; - - case 'from': - case 'to': - case 'address': - case 'refundAddress': - trace.action[key] = outAddress(trace.action[key]); - break; - } - }); - } - - if (trace.result) { - Object.keys(trace.result).forEach(key => { - switch (key) { - case 'gasUsed': - trace.result[key] = outNumber(trace.result[key]); - break; - - case 'address': - trace.action[key] = outAddress(trace.action[key]); - break; - } - }); - } - - if (trace.traceAddress) { - trace.traceAddress.forEach((address, index) => { - trace.traceAddress[index] = outNumber(address); - }); - } - - Object.keys(trace).forEach((key) => { - switch (key) { - case 'subtraces': - case 'transactionPosition': - case 'blockNumber': - trace[key] = outNumber(trace[key]); - break; - } - }); - } - - return trace; -} - -function outTraces (traces) { - if (traces) { - return traces.map(outTrace); - } - - return traces; -} - -function outTraceReplay (trace) { - if (trace) { - Object.keys(trace).forEach((key) => { - switch (key) { - case 'trace': - trace[key] = outTraces(trace[key]); - break; - } - }); - } - - return trace; -} - -function outVaultMeta (meta) { - if (isString(meta)) { - try { - const obj = JSON.parse(meta); - - return obj; - } catch (error) { - return {}; - } - } - - return meta || {}; -} - -module.exports = { - outAccountInfo, - outAddress, - outAddresses, - outBlock, - outChainStatus, - outDate, - outHistogram, - outLog, - outHwAccountInfo, - outNodeKind, - outNumber, - outPeer, - outPeers, - outPrivateReceipt, - outReceipt, - outRecentDapps, - outSignerRequest, - outSyncing, - outTransactionCondition, - outTransaction, - outSigningPayload, - outTrace, - outTraces, - outTraceReplay, - outVaultMeta -}; diff --git a/packages/api/src/format/output.spec.js b/packages/api/src/format/output.spec.ts similarity index 65% rename from packages/api/src/format/output.spec.js rename to packages/api/src/format/output.spec.ts index e10416ad..27b89816 100644 --- a/packages/api/src/format/output.spec.js +++ b/packages/api/src/format/output.spec.ts @@ -14,12 +14,29 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -/* eslint-disable no-unused-expressions */ - -const BigNumber = require('bignumber.js'); - -const { outBlock, outAccountInfo, outAddress, outChainStatus, outDate, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeer, outPeers, outReceipt, outRecentDapps, outSyncing, outTransaction, outTrace, outVaultMeta } = require('./output'); -const { isAddress, isBigNumber, isInstanceOf } = require('../../test/types'); +import BigNumber from 'bignumber.js'; +import { isAddress } from '@parity/abi/lib/util/address'; +import { isInstanceOf } from '@parity/abi/lib/util/types'; + +import { + outBlock, + outAccountInfo, + outAddress, + outChainStatus, + outDate, + outHistogram, + outHwAccountInfo, + outNodeKind, + outNumber, + outPeer, + outPeers, + outReceipt, + outSyncing, + outTransaction, + outTrace, + outVaultMeta +} from './output'; +import { SerializedBlock } from './types.serialized'; describe('format/output', () => { const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; @@ -27,21 +44,29 @@ describe('format/output', () => { describe('outAccountInfo', () => { it('returns meta objects parsed', () => { - expect(outAccountInfo( - { '0x63cf90d3f0410092fc0fca41846f596223979195': { - name: 'name', uuid: 'uuid', meta: '{"name":"456"}' } - } - )).toEqual({ + expect( + outAccountInfo({ + '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', + uuid: 'uuid', + meta: '{"name":"456"}' + } + }) + ).toEqual({ '0x63Cf90D3f0410092FC0fca41846f596223979195': { - name: 'name', uuid: 'uuid', meta: { name: '456' } + name: 'name', + uuid: 'uuid', + meta: { name: '456' } } }); }); it('returns objects without meta & uuid as required', () => { - expect(outAccountInfo( - { '0x63cf90d3f0410092fc0fca41846f596223979195': { name: 'name' } } - )).toEqual({ + expect( + outAccountInfo({ + '0x63cf90d3f0410092fc0fca41846f596223979195': { name: 'name' } + }) + ).toEqual({ '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name' } }); }); @@ -58,44 +83,53 @@ describe('format/output', () => { }); describe('outBlock', () => { - ['author', 'miner'].forEach((input) => { + ['author', 'miner'].forEach(input => { it(`formats ${input} address as address`, () => { - const block = {}; + const block: SerializedBlock = {}; - block[input] = address; - const formatted = outBlock(block)[input]; + block[input as keyof SerializedBlock] = address; + const formatted = outBlock(block)[input as keyof SerializedBlock]; - expect(isAddress(formatted)).toBe.true; + expect(isAddress(formatted)).toBe(true); expect(formatted).toEqual(checksum); }); }); - ['difficulty', 'gasLimit', 'gasUsed', 'number', 'nonce', 'totalDifficulty'].forEach((input) => { + [ + 'difficulty', + 'gasLimit', + 'gasUsed', + 'number', + 'nonce', + 'totalDifficulty' + ].forEach(input => { it(`formats ${input} number as hexnumber`, () => { - const block = {}; + const block: SerializedBlock = {}; - block[input] = 0x123; - const formatted = outBlock(block)[input]; + block[input as keyof SerializedBlock] = 0x123; + const formatted = outBlock(block)[input as keyof SerializedBlock]; - expect(isInstanceOf(formatted, BigNumber)).toBe.true; + expect(isInstanceOf(formatted, BigNumber)).toBe(true); expect(formatted.toString(16)).toEqual('123'); }); }); - ['timestamp'].forEach((input) => { + ['timestamp'].forEach(input => { it(`formats ${input} number as Date`, () => { - const block = {}; + const block: SerializedBlock = {}; - block[input] = 0x57513668; - const formatted = outBlock(block)[input]; + block[input as keyof SerializedBlock] = 0x57513668; + const formatted = outBlock(block)[input as keyof SerializedBlock]; - expect(isInstanceOf(formatted, Date)).toBe.true; + expect(isInstanceOf(formatted, Date)).toBe(true); expect(formatted.getTime()).toEqual(1464940136000); }); }); it('ignores and passes through unknown keys', () => { - expect(outBlock({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); + expect(outBlock({ someRandom: 'someRandom' } as any)).toEqual({ + someRandom: 'someRandom' + }); }); it('formats a block with all the info converted', () => { @@ -154,12 +188,14 @@ describe('format/output', () => { }); describe('outHistogram', () => { - ['bucketBounds', 'counts'].forEach((type) => { + ['bucketBounds', 'counts'].forEach(type => { it(`formats ${type} as number arrays`, () => { - expect( - outHistogram({ [type]: [0x123, 0x456, 0x789] }) - ).toEqual({ - [type]: [new BigNumber(0x123), new BigNumber(0x456), new BigNumber(0x789)] + expect(outHistogram({ [type]: [0x123, 0x456, 0x789] })).toEqual({ + [type]: [ + new BigNumber(0x123), + new BigNumber(0x456), + new BigNumber(0x789) + ] }); }); }); @@ -167,10 +203,18 @@ describe('format/output', () => { describe('outHwAccountInfo', () => { it('returns objects with formatted addresses', () => { - expect(outHwAccountInfo( - { '0x63cf90d3f0410092fc0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } } - )).toEqual({ - '0x63Cf90D3f0410092FC0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } + expect( + outHwAccountInfo({ + '0x63cf90d3f0410092fc0fca41846f596223979195': { + manufacturer: 'mfg', + name: 'type' + } + }) + ).toEqual({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + manufacturer: 'mfg', + name: 'type' + } }); }); }); @@ -187,33 +231,35 @@ describe('format/output', () => { it('returns a BigNumber equalling the value', () => { const bn = outNumber('0x123456'); - expect(isBigNumber(bn)).toBe.true; - expect(bn.eq(0x123456)).toBe.true; + expect(isBigNumber(bn)).toBe(true); + expect(bn.eq(0x123456)).toBe(true); }); it('assumes 0 when ivalid input', () => { - expect(outNumber().eq(0)).toBe.true; + expect(outNumber().eq(0)).toBe(true); }); }); describe('outPeer', () => { it('converts all internal numbers to BigNumbers', () => { - expect(outPeer({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: '0x0f', - head: '0x02', - version: 63 + expect( + outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + } } - } - })).toEqual({ + }) + ).toEqual({ caps: ['par/1'], id: '0x01', name: 'Parity', @@ -232,18 +278,20 @@ describe('format/output', () => { }); it('does not output null protocols', () => { - expect(outPeer({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - les: null - } - })).toEqual({ + expect( + outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + les: null + } + }) + ).toEqual({ caps: ['par/1'], id: '0x01', name: 'Parity', @@ -258,30 +306,32 @@ describe('format/output', () => { describe('outPeers', () => { it('converts all internal numbers to BigNumbers', () => { - expect(outPeers({ - active: 789, - connected: '456', - max: 0x7b, - peers: [ - { - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: '0x0f', - head: '0x02', - version: 63 + expect( + outPeers({ + active: 789, + connected: '456', + max: 0x7b, + peers: [ + { + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' }, - les: null + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + }, + les: null + } } - } - ] - })).toEqual({ + ] + }) + ).toEqual({ active: new BigNumber(789), connected: new BigNumber(456), max: new BigNumber(123), @@ -308,32 +358,40 @@ describe('format/output', () => { }); describe('outReceipt', () => { - ['contractAddress'].forEach((input) => { + ['contractAddress'].forEach(input => { it(`formats ${input} address as address`, () => { - const block = {}; + const block: SerializedBlock = {}; block[input] = address; const formatted = outReceipt(block)[input]; - expect(isAddress(formatted)).toBe.true; + expect(isAddress(formatted)).toBe(true); expect(formatted).toEqual(checksum); }); }); - ['blockNumber', 'cumulativeGasUsed', 'cumulativeGasUsed', 'gasUsed', 'transactionIndex'].forEach((input) => { + [ + 'blockNumber', + 'cumulativeGasUsed', + 'cumulativeGasUsed', + 'gasUsed', + 'transactionIndex' + ].forEach(input => { it(`formats ${input} number as hexnumber`, () => { - const block = {}; + const block: SerializedBlock = {}; block[input] = 0x123; const formatted = outReceipt(block)[input]; - expect(isInstanceOf(formatted, BigNumber)).toBe.true; + expect(isInstanceOf(formatted, BigNumber)).toBe(true); expect(formatted.toString(16)).toEqual('123'); }); }); it('ignores and passes through unknown keys', () => { - expect(outReceipt({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); + expect(outReceipt({ someRandom: 'someRandom' })).toEqual({ + someRandom: 'someRandom' + }); }); it('formats a receipt with all the info converted', () => { @@ -366,7 +424,13 @@ describe('format/output', () => { }); describe('outSyncing', () => { - ['currentBlock', 'highestBlock', 'startingBlock', 'warpChunksAmount', 'warpChunksProcessed'].forEach((input) => { + [ + 'currentBlock', + 'highestBlock', + 'startingBlock', + 'warpChunksAmount', + 'warpChunksProcessed' + ].forEach(input => { it(`formats ${input} numbers as a number`, () => { expect(outSyncing({ [input]: '0x123' })).toEqual({ [input]: new BigNumber('0x123') @@ -382,26 +446,33 @@ describe('format/output', () => { }); describe('outTransaction', () => { - ['from', 'to'].forEach((input) => { + ['from', 'to'].forEach(input => { it(`formats ${input} address as address`, () => { - const block = {}; + const block: SerializedBlock = {}; block[input] = address; const formatted = outTransaction(block)[input]; - expect(isAddress(formatted)).toBe.true; + expect(isAddress(formatted)).toBe(true); expect(formatted).toEqual(checksum); }); }); - ['blockNumber', 'gasPrice', 'gas', 'nonce', 'transactionIndex', 'value'].forEach((input) => { + [ + 'blockNumber', + 'gasPrice', + 'gas', + 'nonce', + 'transactionIndex', + 'value' + ].forEach(input => { it(`formats ${input} number as hexnumber`, () => { - const block = {}; + const block: SerializedBlock = {}; block[input] = 0x123; const formatted = outTransaction(block)[input]; - expect(isInstanceOf(formatted, BigNumber)).toBe.true; + expect(isInstanceOf(formatted, BigNumber)).toBe(true); expect(formatted.toString(16)).toEqual('123'); }); }); @@ -411,7 +482,9 @@ describe('format/output', () => { }); it('ignores and passes through unknown keys', () => { - expect(outTransaction({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); + expect(outTransaction({ someRandom: 'someRandom' })).toEqual({ + someRandom: 'someRandom' + }); }); it('formats a transaction with all the info converted', () => { @@ -443,7 +516,9 @@ describe('format/output', () => { describe('outTrace', () => { it('ignores and passes through unknown keys', () => { - expect(outTrace({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); + expect(outTrace({ someRandom: 'someRandom' })).toEqual({ + someRandom: 'someRandom' + }); }); it('formats a trace with all the info converted', () => { @@ -461,25 +536,27 @@ describe('format/output', () => { gasUsed: '0x08', output: '0x5678' }, - traceAddress: [ '0x2' ], + traceAddress: ['0x2'], subtraces: 3, transactionPosition: '0xb', - transactionHash: '0x000000000000000000000000000000000000000000000000000000000000000c', + transactionHash: + '0x000000000000000000000000000000000000000000000000000000000000000c', blockNumber: '0x0d', - blockHash: '0x000000000000000000000000000000000000000000000000000000000000000e' + blockHash: + '0x000000000000000000000000000000000000000000000000000000000000000e' }); - expect(isBigNumber(formatted.action.gas)).toBe.true; + expect(isBigNumber(formatted.action.gas)).toBe(true); expect(formatted.action.gas.toNumber()).toEqual(7); - expect(isBigNumber(formatted.action.value)).toBe.true; + expect(isBigNumber(formatted.action.value)).toBe(true); expect(formatted.action.value.toNumber()).toEqual(6); expect(formatted.action.from).toEqual(checksum); expect(formatted.action.to).toEqual(checksum); - expect(isBigNumber(formatted.blockNumber)).toBe.true; + expect(isBigNumber(formatted.blockNumber)).toBe(true); expect(formatted.blockNumber.toNumber()).toEqual(13); - expect(isBigNumber(formatted.transactionPosition)).toBe.true; + expect(isBigNumber(formatted.transactionPosition)).toBe(true); expect(formatted.transactionPosition.toNumber()).toEqual(11); }); }); diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts new file mode 100644 index 00000000..8cb3c63f --- /dev/null +++ b/packages/api/src/format/output.ts @@ -0,0 +1,534 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { isString } from '@parity/abi/lib/util/types'; +import { toChecksumAddress } from '@parity/abi/lib/util/address'; + +import { + AccountInfo, + Block, + ChainStatus, + Condition, + Histogram, + HwAccountInfo, + Log, + NodeKind, + Peer, + Peers, + Receipt, + SignerRequest, + SigningPayload, + Syncing, + Trace, + TraceReplay, + Transaction, + VaultMeta +} from '../types'; +import { + SerializedAccountInfo, + SerializedBlock, + SerializedChainStatus, + SerializedCondition, + SerializedHistogram, + SerializedHwAccountInfo, + SerializedLog, + SerializedPeer, + SerializedPeers, + SerializedReceipt, + SerializedSignerRequest, + SerializedSigningPayload, + SerializedSyncing, + SerializedTrace, + SerializedTraceReplay, + SerializedTransaction, + SerializedVaultMeta +} from './types.serialized'; + +export function outAccountInfo (infos: SerializedAccountInfo) { + return Object.keys(infos).reduce( + (ret, _address) => { + const info = infos[_address]; + const address = outAddress(_address); + + ret[address] = { + name: info.name + }; + + if (info.meta) { + ret[address].uuid = info.uuid; + try { + ret[address].meta = JSON.parse(info.meta); + } catch (e) { + console.error( + `Couldn't parse meta field of JSON key file ${info.uuid}` + ); + } + } + + return ret; + }, + {} as AccountInfo + ); +} + +export function outAddress (address?: string) { + return toChecksumAddress(address); +} + +export function outAddresses (addresses: string[]) { + return (addresses || []).map(outAddress); +} + +export function outBlock (block: SerializedBlock) { + const result: Block = {}; + + if (block) { + Object.keys(block).forEach(key => { + switch (key) { + case 'author': + case 'miner': + result[key] = outAddress(block[key]); + break; + + case 'difficulty': + case 'gasLimit': + case 'gasUsed': + case 'nonce': + case 'number': + case 'totalDifficulty': + result[key] = outNumber(block[key]); + break; + + case 'timestamp': + result[key] = outDate(block[key]); + break; + } + }); + } + + return result; +} + +export function outChainStatus (status?: SerializedChainStatus) { + const result: ChainStatus = {}; + if (status) { + Object.keys(status).forEach(key => { + switch (key) { + case 'blockGap': + result[key] = status[key] + ? (status[key] as number[]).map(outNumber) + : undefined; + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = status[key]; + } + }); + } + + return result; +} + +export function outDate (date?: number | string | Date) { + if (date instanceof Date && typeof date.toISOString === 'function') { + return date; + } + + try { + if (typeof date === 'string' && new Date(date).toISOString() === date) { + return new Date(date); + } + } catch (error) { + /* Do nothing */ + } + + return new Date(outNumber(date as number).toNumber() * 1000); +} + +export function outHistogram (histogram: SerializedHistogram) { + const result: Histogram = {}; + if (histogram) { + Object.keys(histogram).forEach(key => { + switch (key) { + case 'bucketBounds': + case 'counts': + result[key] = histogram[key].map(outNumber); + break; + } + }); + } + + return result; +} + +export function outLog (log: SerializedLog) { + const result: Log = {}; + Object.keys(log).forEach(key => { + switch (key) { + case 'blockNumber': + case 'logIndex': + case 'transactionIndex': + result[key] = outNumber(log[key]); + break; + + case 'address': + result[key] = outAddress(log[key]); + break; + } + }); + + return result; +} + +export function outHwAccountInfo (infos: SerializedHwAccountInfo) { + return Object.keys(infos).reduce( + (ret, _address) => { + const address = outAddress(_address); + + ret[address] = infos[_address]; + + return ret; + }, + {} as HwAccountInfo + ); +} + +export function outNodeKind (info: NodeKind) { + return info; +} + +export function outNumber (n?: string | number) { + return new BigNumber(n || 0); +} + +export function outPeer (peer: SerializedPeer) { + const protocols = Object.keys(peer.protocols).reduce( + (obj, key) => { + if (peer.protocols[key]) { + obj[key] = Object.assign({}, peer.protocols[key], { + difficulty: outNumber(peer.protocols[key].difficulty) + }); + } + + return obj; + }, + {} as Peer + ); + + return Object.assign({}, peer, { + protocols + }); +} + +export function outPeers (peers: SerializedPeers) { + return { + active: outNumber(peers.active), + connected: outNumber(peers.connected), + max: outNumber(peers.max), + peers: peers.peers.map(peer => outPeer(peer)) + } as Peers; +} + +export function outPrivateReceipt (receipt: SerializedReceipt) { + const result: Receipt = {}; + if (receipt) { + Object.keys(receipt).forEach(key => { + switch (key) { + case 'status': + result[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + result[key] = outAddress(receipt[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = log[key]; + } + }); + } + + return result; +} + +export function outReceipt (receipt: SerializedReceipt) { + const result: Receipt = {}; + if (receipt) { + Object.keys(receipt).forEach(key => { + switch (key) { + case 'blockNumber': + case 'cumulativeGasUsed': + case 'gasUsed': + case 'transactionIndex': + result[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + result[key] = outAddress(receipt[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = log[key]; + } + }); + } + + return result; +} + +export function outSignerRequest (request: SerializedSignerRequest) { + const result: SignerRequest = {}; + + if (request) { + Object.keys(request).forEach(key => { + switch (key) { + case 'id': + result[key] = outNumber(request[key]); + break; + + case 'payload': + result[key] = {}; + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].decrypt = outSigningPayload(request[key].decrypt); + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].sign = outSigningPayload(request[key].sign); + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].signTransaction = outTransaction( + // @ts-ignore "Object is possibly 'undefined'." No it's not. + request[key].signTransaction + ); + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].sendTransaction = outTransaction( + // @ts-ignore "Object is possibly 'undefined'." No it's not. + request[key].sendTransaction + ); + break; + + case 'origin': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + const type = Object.keys(result[key])[0]; + // @ts-ignore "Object is possibly 'undefined'." No it's not. + const details = result[key][type]; + + request[key] = { type, details }; + break; + } + }); + } + + return result; +} + +export function outSyncing (syncing: SerializedSyncing) { + const result: Syncing = {}; + + if (syncing && syncing !== 'false') { + Object.keys(syncing).forEach(key => { + switch (key) { + case 'currentBlock': + case 'highestBlock': + case 'startingBlock': + case 'warpChunksAmount': + case 'warpChunksProcessed': + result[key] = outNumber(syncing[key]); + break; + + case 'blockGap': + result[key] = syncing[key] + ? (syncing[key] as number[]).map(outNumber) + : undefined; + break; + } + }); + } + + return syncing; +} + +export function outTransactionCondition ( + condition?: SerializedCondition | null +) { + const result: Condition = {}; + if (condition) { + if (condition.block) { + result.block = outNumber(condition.block); + } else if (condition.time) { + result.time = outDate(condition.time); + } + } + + return result; +} + +export function outTransaction (tx: SerializedTransaction) { + const result: Transaction = {}; + + if (tx) { + Object.keys(tx).forEach(key => { + switch (key) { + case 'blockNumber': + case 'gasPrice': + case 'gas': + case 'nonce': + case 'transactionIndex': + case 'value': + result[key] = outNumber(tx[key]); + break; + + case 'condition': + result[key] = outTransactionCondition(tx[key]); + break; + + case 'creates': + case 'from': + case 'to': + result[key] = outAddress(tx[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = log[key]; + } + }); + } + + return result; +} + +export function outSigningPayload (payload: SerializedSigningPayload) { + const result: SigningPayload = {}; + if (payload) { + Object.keys(payload).forEach(key => { + switch (key) { + case 'address': + result[key] = outAddress(payload[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = log[key]; + } + }); + } + + return payload; +} + +export function outTrace (trace: SerializedTrace) { + const result: Trace = {}; + if (trace) { + if (trace.action) { + result.action = {}; + Object.keys(trace.action).forEach(key => { + switch (key) { + case 'gas': + case 'value': + case 'balance': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.action[key] = outNumber(trace.action[key]); + break; + + case 'from': + case 'to': + case 'address': + case 'refundAddress': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.action[key] = outAddress(trace.action[key]); + break; + } + }); + } + + if (trace.result) { + result.result = {}; + Object.keys(trace.result).forEach(key => { + switch (key) { + case 'gasUsed': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.result[key] = outNumber(trace.result[key]); + break; + + case 'address': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.action[key] = outAddress(trace.action[key]); + break; + } + }); + } + + if (trace.traceAddress) { + result.traceAddress = []; + trace.traceAddress.forEach((address, index) => { + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.traceAddress[index] = outNumber(address); + }); + } + + Object.keys(trace).forEach(key => { + switch (key) { + case 'subtraces': + case 'transactionPosition': + case 'blockNumber': + result[key] = outNumber(trace[key]); + break; + } + }); + } + + return result; +} + +export function outTraces (traces?: SerializedTrace[]) { + if (traces) { + return traces.map(outTrace); + } + + return traces; +} + +export function outTraceReplay (trace: SerializedTraceReplay) { + const result: TraceReplay = {}; + + if (trace) { + Object.keys(trace).forEach(key => { + switch (key) { + case 'trace': + result[key] = outTraces(trace[key]); + break; + } + }); + } + + return result; +} + +export function outVaultMeta (meta: SerializedVaultMeta) { + if (isString(meta)) { + try { + const obj = JSON.parse(meta); + + return obj as VaultMeta; + } catch (error) { + return {}; + } + } + + return meta || {}; +} diff --git a/packages/api/src/format/types.serialized.ts b/packages/api/src/format/types.serialized.ts new file mode 100644 index 00000000..df00b673 --- /dev/null +++ b/packages/api/src/format/types.serialized.ts @@ -0,0 +1,161 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +export interface SerializedAccountInfo { + [address: string]: { meta?: string; name: string; uuid?: string }; +} + +export interface SerializedBlock { + author?: string; + miner?: string; + difficulty?: string; + extraData: string; + gasLimit?: string; + gasUsed?: string; + nonce?: string; + number?: string; + totalDifficulty?: string; + timestamp?: number | string; +} + +export type SerializedBlockGap = (string | number)[]; + +export interface SerializedChainStatus { + blockGap?: SerializedBlockGap | null; +} + +export type SerializedCondition = { + block?: number; + time?: number; +}; + +export interface SerializedHistogram { + bucketBounds: number[]; + counts: number[]; +} + +export interface SerializedHwAccountInfo { + [address: string]: { [key: string]: any }; +} + +export interface SerializedLog { + address: string; + blockNumber: number; + logIndex: number; + transactionIndex: number; +} + +export interface SerializedPeer { + caps: string[]; + id: number; + name: string; + network: { + localAddress: string; + remoteAddress: string; + }; + protocols: { + par: { + difficulty: number; + head: number; + version: number; + }; + }; +} + +export interface SerializedPeers { + active: number; + connected: number; + max: number; + peers: SerializedPeer[]; +} + +export interface SerializedReceipt { + contractAddress?: string; + blockNumber: number; + cumulativeGasUsed: number; + gasUsed: number; + transactionIndex: number; + status: number; +} + +export interface SerializedSignerRequest { + id?: number; + origin?: { + [index: string]: string; + }; + payload?: { + decrypt?: SerializedSigningPayload; + sign?: SerializedSigningPayload; + signTransaction?: SerializedTransaction; + sendTransaction?: SerializedTransaction; + }; +} + +export interface SerializedSigningPayload { + address?: string; +} + +export interface SerializedTrace { + action?: { + gas?: number; + value?: number; + balance?: number; + from?: string; + to?: string; + address?: string; + refundAddress?: string; + }; + result?: { + address?: string; + gasUsed?: number; + }; + traceAddress?: number[]; + subtraces?: number; + transactionPosition?: number; + blockNumber?: number; +} + +export interface SerializedTraceReplay { + trace?: SerializedTrace[]; +} + +export interface SerializedTransaction { + blockNumber?: number; + creates?: string; + extraData?: string; + to?: string; + from?: string; + condition?: SerializedCondition | null; + gas?: string; + gasPrice?: string; + transactionIndex?: number; + value?: string; + nonce?: string; + data?: string; +} + +export interface SerializedSyncing { + currentBlock?: number; + highestBlock?: number; + startingBlock?: number; + warpChunksAmount?: number; + warpChunksProcessed?: number; + blockGap?: SerializedBlockGap | null; +} + +export type SerializedVaultMeta = string; diff --git a/packages/api/src/types.d.ts b/packages/api/src/types.d.ts deleted file mode 100644 index 9151be60..00000000 --- a/packages/api/src/types.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import BigNumber from 'bignumber.js'; - -export type Bytes = number[]; - -export type BlockNumber = - | 'earliest' - | 'latest' - | 'pending' - | number - | BigNumber - | string; - -export type EtherDenomination = - | 'wei' - | 'ada' - | 'babbage' - | 'shannon' - | 'szabo' - | 'finney' - | 'ether' - | 'kether' - | 'mether' - | 'gether' - | 'tether'; diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts new file mode 100644 index 00000000..e5172a65 --- /dev/null +++ b/packages/api/src/types.ts @@ -0,0 +1,248 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import BigNumber from 'bignumber.js'; + +export interface AccountInfo { + [address: string]: { + meta?: { [index: string]: any }; + name: string; + uuid?: string; + }; +} + +export type Bytes = number[]; + +export interface Block { + author?: string; + miner?: string; + difficulty?: BigNumber; + gasLimit?: BigNumber; + gasUsed?: BigNumber; + nonce?: BigNumber; + number?: BigNumber; + totalDifficulty?: BigNumber; + timestamp?: Date; +} + +export type BlockGap = BigNumber[]; + +export type BlockNumber = + | 'earliest' + | 'latest' + | 'pending' + | number + | BigNumber + | string; + +export type ChainStatus = { + blockGap?: BlockGap | null; +}; + +export type Condition = { + block?: BlockNumber; + time?: Date; +}; + +export interface DeriveObject { + hash?: number; + index?: number; + type?: string; +} +export type Derive = number | string | DeriveObject | null; + +export type EtherDenomination = + | 'wei' + | 'ada' + | 'babbage' + | 'shannon' + | 'szabo' + | 'finney' + | 'ether' + | 'kether' + | 'mether' + | 'gether' + | 'tether'; + +export interface FilterObject { + fromAddress?: string; + fromBlock?: BlockNumber; + toAddress?: string; + toBlock?: BlockNumber; +} + +export interface FilterOptions { + address?: string | string[]; + extraData?: string; + fromBlock?: BlockNumber; + limit?: BlockNumber; + toBlock?: BlockNumber; + topics?: Topic[]; +} + +export interface Histogram { + bucketBounds?: BigNumber[]; + counts?: BigNumber[]; +} + +export interface HwAccountInfo { + [address: string]: { [key: string]: any }; +} + +export interface Log { + address?: string; + blockNumber?: BigNumber; + logIndex?: BigNumber; + transactionIndex?: BigNumber; +} + +export interface NodeKind { + availability: string; + capability: string; +} + +export interface Options { + extraData?: string; + from?: string; + condition?: Condition | null; + gas?: BlockNumber; + gasPrice?: BlockNumber; + value?: BlockNumber; + nonce?: BlockNumber; + to?: string; + data?: any; +} + +export interface Peer { + caps: string[]; + id: BigNumber; + name: string; + network: { + localAddress: string; + remoteAddress: string; + }; + protocols: { + par: { + difficulty: BigNumber; + head: BigNumber; + version: BigNumber; + }; + }; +} + +export interface Peers { + active: BigNumber; + connected: BigNumber; + max: BigNumber; + peers: Peer[]; +} + +export interface Receipt { + contractAddress?: string; + blockNumber?: BigNumber; + cumulativeGasUsed?: BigNumber; + gasUsed?: BigNumber; + transactionIndex?: BigNumber; + status?: BigNumber; +} + +export interface SignerRequest { + id?: BigNumber; + origin?: { + [index: string]: string; + }; + payload?: { + decrypt?: SigningPayload; + sign?: SigningPayload; + signTransaction?: Transaction; + sendTransaction?: Transaction; + }; +} + +export interface SigningPayload { + address?: string; +} + +export interface Syncing { + currentBlock?: BigNumber; + highestBlock?: BigNumber; + startingBlock?: BigNumber; + warpChunksAmount?: BigNumber; + warpChunksProcessed?: BigNumber; + blockGap?: BlockGap | null; +} + +export interface Trace { + action?: { + gas?: BigNumber; + value?: BigNumber; + balance?: BigNumber; + from?: string; + to?: string; + address?: string; + refundAddress?: string; + }; + result?: { + address?: string; + gasUsed?: BigNumber; + }; + traceAddress?: BigNumber[]; + subtraces?: BigNumber; + transactionPosition?: BigNumber; + blockNumber?: BigNumber; +} + +export interface TraceReplay { + trace?: Trace[]; +} + +export interface Transaction { + blockNumber?: BigNumber; + creates?: string; + extraData?: string; + to?: string; + from?: string; + condition?: Condition | null; + gas?: BigNumber; + gasPrice?: BigNumber; + transactionIndex?: BigNumber; + value?: BigNumber; + nonce?: BigNumber; + data?: string; +} + +export type Topic = string | null; + +export interface VaultMeta { + [index: string]: any; +} + +export type AnyType = + | AccountInfo + | Block + | BlockGap + | BlockNumber + | ChainStatus + | Condition + | DeriveObject + | Derive + | FilterObject + | FilterOptions + | Histogram + | HwAccountInfo + | Log + | NodeKind + | Options + | Peer + | Peers + | Receipt + | SignerRequest + | SigningPayload + | Syncing + | Trace + | TraceReplay + | Transaction + | Topic + | VaultMeta; From b02bd793b4468a1fa6ed902b544bafd427cc8333 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 12:13:47 +0100 Subject: [PATCH 10/25] Fix tests --- packages/api/src/format/output.spec.ts | 85 +++++++++++------- packages/api/src/format/output.ts | 78 +++++++++++----- packages/api/src/format/types.serialized.ts | 98 ++++++++++++--------- packages/api/src/types.ts | 19 ++-- 4 files changed, 173 insertions(+), 107 deletions(-) diff --git a/packages/api/src/format/output.spec.ts b/packages/api/src/format/output.spec.ts index 27b89816..b89f86b6 100644 --- a/packages/api/src/format/output.spec.ts +++ b/packages/api/src/format/output.spec.ts @@ -18,6 +18,7 @@ import BigNumber from 'bignumber.js'; import { isAddress } from '@parity/abi/lib/util/address'; import { isInstanceOf } from '@parity/abi/lib/util/types'; +import { Block, Receipt } from '../types'; import { outBlock, outAccountInfo, @@ -36,7 +37,11 @@ import { outTrace, outVaultMeta } from './output'; -import { SerializedBlock } from './types.serialized'; +import { + SerializedBlock, + SerializedReceipt, + SerializedTransaction +} from './types.serialized'; describe('format/output', () => { const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; @@ -88,9 +93,9 @@ describe('format/output', () => { const block: SerializedBlock = {}; block[input as keyof SerializedBlock] = address; - const formatted = outBlock(block)[input as keyof SerializedBlock]; + const formatted = outBlock(block)[input as keyof Block]; - expect(isAddress(formatted)).toBe(true); + expect(isAddress(formatted as string)).toBe(true); expect(formatted).toEqual(checksum); }); }); @@ -107,9 +112,10 @@ describe('format/output', () => { const block: SerializedBlock = {}; block[input as keyof SerializedBlock] = 0x123; - const formatted = outBlock(block)[input as keyof SerializedBlock]; + const formatted = outBlock(block)[input as keyof Block]; expect(isInstanceOf(formatted, BigNumber)).toBe(true); + // @ts-ignore expect(formatted.toString(16)).toEqual('123'); }); }); @@ -119,10 +125,10 @@ describe('format/output', () => { const block: SerializedBlock = {}; block[input as keyof SerializedBlock] = 0x57513668; - const formatted = outBlock(block)[input as keyof SerializedBlock]; + const formatted = outBlock(block)[input as keyof Block]; expect(isInstanceOf(formatted, Date)).toBe(true); - expect(formatted.getTime()).toEqual(1464940136000); + expect((formatted as Date).getTime()).toEqual(1464940136000); }); }); @@ -174,7 +180,7 @@ describe('format/output', () => { it('handles null blockGap values', () => { const status = { - blockGap: null + blockGap: undefined }; expect(outChainStatus(status)).toEqual(status); @@ -231,7 +237,7 @@ describe('format/output', () => { it('returns a BigNumber equalling the value', () => { const bn = outNumber('0x123456'); - expect(isBigNumber(bn)).toBe(true); + expect(isInstanceOf(bn, BigNumber)).toBe(true); expect(bn.eq(0x123456)).toBe(true); }); @@ -360,12 +366,12 @@ describe('format/output', () => { describe('outReceipt', () => { ['contractAddress'].forEach(input => { it(`formats ${input} address as address`, () => { - const block: SerializedBlock = {}; + const block: SerializedReceipt = {}; - block[input] = address; - const formatted = outReceipt(block)[input]; + block[input as keyof SerializedReceipt] = address; + const formatted = outReceipt(block)[input as keyof Receipt]; - expect(isAddress(formatted)).toBe(true); + expect(isAddress(formatted as string)).toBe(true); expect(formatted).toEqual(checksum); }); }); @@ -378,17 +384,19 @@ describe('format/output', () => { 'transactionIndex' ].forEach(input => { it(`formats ${input} number as hexnumber`, () => { - const block: SerializedBlock = {}; + const block: SerializedReceipt = {}; - block[input] = 0x123; - const formatted = outReceipt(block)[input]; + block[input as keyof SerializedReceipt] = 0x123; + const formatted = outReceipt(block)[input as keyof Receipt]; expect(isInstanceOf(formatted, BigNumber)).toBe(true); + // @ts-ignore expect(formatted.toString(16)).toEqual('123'); }); }); it('ignores and passes through unknown keys', () => { + // @ts-ignore expect(outReceipt({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); @@ -415,14 +423,6 @@ describe('format/output', () => { }); }); - describe('outRecentDapps', () => { - it('formats the URLs with timestamps', () => { - expect(outRecentDapps({ testing: 0x57513668 })).toEqual({ - testing: new Date('2016-06-03T07:48:56.000Z') - }); - }); - }); - describe('outSyncing', () => { [ 'currentBlock', @@ -448,12 +448,14 @@ describe('format/output', () => { describe('outTransaction', () => { ['from', 'to'].forEach(input => { it(`formats ${input} address as address`, () => { - const block: SerializedBlock = {}; + const block: SerializedTransaction = {}; - block[input] = address; - const formatted = outTransaction(block)[input]; + block[input as keyof SerializedTransaction] = address; + const formatted = outTransaction(block)[ + input as keyof SerializedTransaction + ]; - expect(isAddress(formatted)).toBe(true); + expect(isAddress(formatted as string)).toBe(true); expect(formatted).toEqual(checksum); }); }); @@ -467,12 +469,15 @@ describe('format/output', () => { 'value' ].forEach(input => { it(`formats ${input} number as hexnumber`, () => { - const block: SerializedBlock = {}; + const block: SerializedTransaction = {}; - block[input] = 0x123; - const formatted = outTransaction(block)[input]; + block[input as keyof SerializedTransaction] = 0x123; + const formatted = outTransaction(block)[ + input as keyof SerializedTransaction + ]; expect(isInstanceOf(formatted, BigNumber)).toBe(true); + // @ts-ignore expect(formatted.toString(16)).toEqual('123'); }); }); @@ -482,6 +487,7 @@ describe('format/output', () => { }); it('ignores and passes through unknown keys', () => { + // @ts-ignore expect(outTransaction({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); @@ -516,6 +522,7 @@ describe('format/output', () => { describe('outTrace', () => { it('ignores and passes through unknown keys', () => { + // @ts-ignore expect(outTrace({ someRandom: 'someRandom' })).toEqual({ someRandom: 'someRandom' }); @@ -546,17 +553,27 @@ describe('format/output', () => { '0x000000000000000000000000000000000000000000000000000000000000000e' }); - expect(isBigNumber(formatted.action.gas)).toBe(true); + // @ts-ignore + expect(isInstanceOf(formatted.action.gas, BigNumber)).toBe(true); + // @ts-ignore expect(formatted.action.gas.toNumber()).toEqual(7); - expect(isBigNumber(formatted.action.value)).toBe(true); + // @ts-ignore + expect(isInstanceOf(formatted.action.value, BigNumber)).toBe(true); + // @ts-ignore expect(formatted.action.value.toNumber()).toEqual(6); + // @ts-ignore expect(formatted.action.from).toEqual(checksum); + // @ts-ignore expect(formatted.action.to).toEqual(checksum); - expect(isBigNumber(formatted.blockNumber)).toBe(true); + // @ts-ignore + expect(isInstanceOf(formatted.blockNumber, BigNumber)).toBe(true); + // @ts-ignore expect(formatted.blockNumber.toNumber()).toEqual(13); - expect(isBigNumber(formatted.transactionPosition)).toBe(true); + // @ts-ignore + expect(isInstanceOf(formatted.transactionPosition, BigNumber)).toBe(true); + // @ts-ignore expect(formatted.transactionPosition.toNumber()).toEqual(11); }); }); diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts index 8cb3c63f..db95575a 100644 --- a/packages/api/src/format/output.ts +++ b/packages/api/src/format/output.ts @@ -28,6 +28,8 @@ import { Log, NodeKind, Peer, + PeerProtocolItem, + PeerProtocol, Peers, Receipt, SignerRequest, @@ -55,7 +57,8 @@ import { SerializedTrace, SerializedTraceReplay, SerializedTransaction, - SerializedVaultMeta + SerializedVaultMeta, + SerializedNumber } from './types.serialized'; export function outAccountInfo (infos: SerializedAccountInfo) { @@ -116,6 +119,10 @@ export function outBlock (block: SerializedBlock) { case 'timestamp': result[key] = outDate(block[key]); break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = block[key]; } }); } @@ -167,6 +174,7 @@ export function outHistogram (histogram: SerializedHistogram) { switch (key) { case 'bucketBounds': case 'counts': + // @ts-ignore "Object is possibly 'undefined'." No it's not. result[key] = histogram[key].map(outNumber); break; } @@ -212,27 +220,39 @@ export function outNodeKind (info: NodeKind) { return info; } -export function outNumber (n?: string | number) { +export function outNumber (n?: SerializedNumber) { return new BigNumber(n || 0); } export function outPeer (peer: SerializedPeer) { const protocols = Object.keys(peer.protocols).reduce( (obj, key) => { - if (peer.protocols[key]) { - obj[key] = Object.assign({}, peer.protocols[key], { - difficulty: outNumber(peer.protocols[key].difficulty) - }); + if (peer.protocols[key as PeerProtocol]) { + // @ts-ignore + obj[key as PeerProtocol] = Object.assign( + {}, + peer.protocols[key as PeerProtocol], + { + difficulty: outNumber( + // @ts-ignore "Object is possibly 'undefined'." No it's not. + peer.protocols[key as PeerProtocol].difficulty + ) + } + ); } return obj; }, - {} as Peer + {} as { les?: PeerProtocolItem; par?: PeerProtocolItem } ); - return Object.assign({}, peer, { + return { + caps: peer.caps, + id: peer.id, + name: peer.name, + network: peer.network, protocols - }); + } as Peer; } export function outPeers (peers: SerializedPeers) { @@ -259,7 +279,7 @@ export function outPrivateReceipt (receipt: SerializedReceipt) { default: // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = log[key]; + result[key] = receipt[key]; } }); } @@ -285,7 +305,7 @@ export function outReceipt (receipt: SerializedReceipt) { default: // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = log[key]; + result[key] = receipt[key]; } }); } @@ -404,7 +424,7 @@ export function outTransaction (tx: SerializedTransaction) { default: // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = log[key]; + result[key] = tx[key]; } }); } @@ -423,7 +443,7 @@ export function outSigningPayload (payload: SerializedSigningPayload) { default: // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = log[key]; + result[key] = payload[key]; } }); } @@ -434,6 +454,20 @@ export function outSigningPayload (payload: SerializedSigningPayload) { export function outTrace (trace: SerializedTrace) { const result: Trace = {}; if (trace) { + Object.keys(trace).forEach(key => { + switch (key) { + case 'subtraces': + case 'transactionPosition': + case 'blockNumber': + result[key] = outNumber(trace[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = trace[key]; + } + }); + if (trace.action) { result.action = {}; Object.keys(trace.action).forEach(key => { @@ -452,6 +486,10 @@ export function outTrace (trace: SerializedTrace) { // @ts-ignore "Object is possibly 'undefined'." No it's not. result.action[key] = outAddress(trace.action[key]); break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result.action[key] = trace.action[key]; } }); } @@ -469,6 +507,10 @@ export function outTrace (trace: SerializedTrace) { // @ts-ignore "Object is possibly 'undefined'." No it's not. result.action[key] = outAddress(trace.action[key]); break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result.result[key] = trace.result[key]; } }); } @@ -480,16 +522,6 @@ export function outTrace (trace: SerializedTrace) { result.traceAddress[index] = outNumber(address); }); } - - Object.keys(trace).forEach(key => { - switch (key) { - case 'subtraces': - case 'transactionPosition': - case 'blockNumber': - result[key] = outNumber(trace[key]); - break; - } - }); } return result; diff --git a/packages/api/src/format/types.serialized.ts b/packages/api/src/format/types.serialized.ts index df00b673..594d0462 100644 --- a/packages/api/src/format/types.serialized.ts +++ b/packages/api/src/format/types.serialized.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -import BigNumber from 'bignumber.js'; +export type SerializedNumber = number | string; export interface SerializedAccountInfo { [address: string]: { meta?: string; name: string; uuid?: string }; @@ -24,7 +24,7 @@ export interface SerializedBlock { author?: string; miner?: string; difficulty?: string; - extraData: string; + extraData?: string; gasLimit?: string; gasUsed?: string; nonce?: string; @@ -40,13 +40,13 @@ export interface SerializedChainStatus { } export type SerializedCondition = { - block?: number; - time?: number; + block?: SerializedNumber; + time?: SerializedNumber; }; export interface SerializedHistogram { - bucketBounds: number[]; - counts: number[]; + bucketBounds?: number[]; + counts?: number[]; } export interface SerializedHwAccountInfo { @@ -55,46 +55,52 @@ export interface SerializedHwAccountInfo { export interface SerializedLog { address: string; - blockNumber: number; - logIndex: number; - transactionIndex: number; + blockNumber: SerializedNumber; + logIndex: SerializedNumber; + transactionIndex: SerializedNumber; } export interface SerializedPeer { - caps: string[]; - id: number; - name: string; - network: { + caps?: string[]; + id?: string; + name?: string; + network?: { localAddress: string; remoteAddress: string; }; protocols: { - par: { - difficulty: number; - head: number; - version: number; - }; + les?: { + difficulty: SerializedNumber; + head: SerializedNumber; + version: SerializedNumber; + } | null; + par?: { + difficulty: SerializedNumber; + head: SerializedNumber; + version: SerializedNumber; + } | null; }; } export interface SerializedPeers { - active: number; - connected: number; - max: number; + active: SerializedNumber; + connected: SerializedNumber; + max: SerializedNumber; peers: SerializedPeer[]; } export interface SerializedReceipt { + blockNumber?: SerializedNumber; contractAddress?: string; - blockNumber: number; - cumulativeGasUsed: number; - gasUsed: number; - transactionIndex: number; - status: number; + cumulativeGasUsed?: SerializedNumber; + extraData?: string; + gasUsed?: SerializedNumber; + transactionIndex?: SerializedNumber; + status?: SerializedNumber; } export interface SerializedSignerRequest { - id?: number; + id?: SerializedNumber; origin?: { [index: string]: string; }; @@ -112,22 +118,28 @@ export interface SerializedSigningPayload { export interface SerializedTrace { action?: { - gas?: number; - value?: number; - balance?: number; + callType?: string; + gas?: SerializedNumber; + value?: SerializedNumber; + balance?: SerializedNumber; from?: string; + input?: string; to?: string; address?: string; refundAddress?: string; }; + blockHash?: string; + blockNumber?: SerializedNumber; result?: { address?: string; - gasUsed?: number; + gasUsed?: SerializedNumber; + output?: string; }; - traceAddress?: number[]; - subtraces?: number; - transactionPosition?: number; - blockNumber?: number; + traceAddress?: SerializedNumber[]; + subtraces?: SerializedNumber; + transactionHash?: string; + transactionPosition?: SerializedNumber; + type?: string; } export interface SerializedTraceReplay { @@ -135,7 +147,7 @@ export interface SerializedTraceReplay { } export interface SerializedTransaction { - blockNumber?: number; + blockNumber?: SerializedNumber; creates?: string; extraData?: string; to?: string; @@ -143,19 +155,19 @@ export interface SerializedTransaction { condition?: SerializedCondition | null; gas?: string; gasPrice?: string; - transactionIndex?: number; + transactionIndex?: SerializedNumber; value?: string; nonce?: string; data?: string; } export interface SerializedSyncing { - currentBlock?: number; - highestBlock?: number; - startingBlock?: number; - warpChunksAmount?: number; - warpChunksProcessed?: number; + currentBlock?: SerializedNumber; + highestBlock?: SerializedNumber; + startingBlock?: SerializedNumber; + warpChunksAmount?: SerializedNumber; + warpChunksProcessed?: SerializedNumber; blockGap?: SerializedBlockGap | null; } -export type SerializedVaultMeta = string; +export type SerializedVaultMeta = string | { [key: string]: any } | null; diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index e5172a65..f0118453 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -115,20 +115,25 @@ export interface Options { data?: any; } +export type PeerProtocol = 'par' | 'les'; + +export interface PeerProtocolItem { + difficulty: BigNumber; + head: BigNumber; + version: BigNumber; +} + export interface Peer { caps: string[]; - id: BigNumber; + id: string; name: string; network: { localAddress: string; remoteAddress: string; }; - protocols: { - par: { - difficulty: BigNumber; - head: BigNumber; - version: BigNumber; - }; + protocols?: { + les?: PeerProtocolItem | null; + par?: PeerProtocolItem | null; }; } From 10bdf54d4f04903592535447d46e79aa3c538317 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 12:24:15 +0100 Subject: [PATCH 11/25] Fix tests --- packages/api/src/format/output.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts index db95575a..125307a6 100644 --- a/packages/api/src/format/output.ts +++ b/packages/api/src/format/output.ts @@ -379,14 +379,15 @@ export function outSyncing (syncing: SerializedSyncing) { }); } - return syncing; + return result; } export function outTransactionCondition ( condition?: SerializedCondition | null ) { - const result: Condition = {}; + let result: Condition | null = null; if (condition) { + result = {}; if (condition.block) { result.block = outNumber(condition.block); } else if (condition.time) { From d1f35da3b35947e60ca5c921feca5de2188ed0cb Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 12:27:26 +0100 Subject: [PATCH 12/25] Transport Error in js --- .../{TransportError.ts => TransportError.js} | 56 +++++-------------- ...rtError.spec.ts => TransportError.spec.js} | 10 ++-- 2 files changed, 20 insertions(+), 46 deletions(-) rename packages/api/src/transport/{TransportError.ts => TransportError.js} (50%) rename packages/api/src/transport/{TransportError.spec.ts => TransportError.spec.js} (51%) diff --git a/packages/api/src/transport/TransportError.ts b/packages/api/src/transport/TransportError.js similarity index 50% rename from packages/api/src/transport/TransportError.ts rename to packages/api/src/transport/TransportError.js index 9fe840ba..ea34e97b 100644 --- a/packages/api/src/transport/TransportError.ts +++ b/packages/api/src/transport/TransportError.js @@ -3,7 +3,9 @@ // // SPDX-License-Identifier: MIT -const ERROR_CODES: { [index: string]: number } = { +const ExtendableError = require('es6-error'); + +const ERROR_CODES = { UNSUPPORTED_REQUEST: -32000, NO_WORK: -32001, NO_AUTHOR: -32002, @@ -29,28 +31,8 @@ const ERROR_CODES: { [index: string]: number } = { INVALID_PARAMS: -32602 }; -/** - * Class which represents an error that occurs on the transport level. - */ -class TransportError extends Error { - /** - * The error code. - */ - public code: number; - /** - * The RPC method on which this error occured. - */ - public method: string; - /** - * The message of the - */ - public text: string; - /** - * The error type, uniquely associated to the error code. - */ - public type: string; - - constructor (method: string, code: number, message: string) { +class TransportError extends ExtendableError { + constructor (method, code, message) { const m = `${method}: ${code}: ${message}`; super(m); @@ -62,24 +44,16 @@ class TransportError extends Error { this.method = method; this.text = message; } +} - /** - * Mapping between error types and error codes. - */ - static ERROR_CODES = ERROR_CODES; +TransportError.ERROR_CODES = ERROR_CODES; - /** - * Create a `REQUEST_REJECTED` error. - * - * @param method - The method for which we create a `REQUEST_REJECTED` error. - */ - static requestRejected (method: string = null) { - return new TransportError( - method, - ERROR_CODES.REQUEST_REJECTED, - 'Request has been rejected.' - ); - } -} +TransportError.requestRejected = function (method = null) { + return new TransportError( + method, + ERROR_CODES.REQUEST_REJECTED, + 'Request has been rejected.' + ); +}; -export default TransportError; +module.exports = TransportError; diff --git a/packages/api/src/transport/TransportError.spec.ts b/packages/api/src/transport/TransportError.spec.js similarity index 51% rename from packages/api/src/transport/TransportError.spec.ts rename to packages/api/src/transport/TransportError.spec.js index c4c8fee7..7e5695c0 100644 --- a/packages/api/src/transport/TransportError.spec.ts +++ b/packages/api/src/transport/TransportError.spec.js @@ -3,16 +3,16 @@ // // SPDX-License-Identifier: MIT -import TransportError from './TransportError'; +const TransportError = require('./error'); -describe('transport/TransportError', () => { +describe('transport/Error', () => { describe('requestRejected', () => { it('creates a Request Rejected error', () => { const error = TransportError.requestRejected('method'); - expect(error.code).toEqual(TransportError.ERROR_CODES.REQUEST_REJECTED); - expect(error.message).toMatch(/been rejected/); - expect(error.method).toEqual('method'); + expect(error.code).to.equal(TransportError.ERROR_CODES.REQUEST_REJECTED); + expect(error.message).to.match(/been rejected/); + expect(error.method).to.equal('method'); }); }); }); From c7fb71856e4a22b6fadecd6d080f7335541cde3c Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 12:31:40 +0100 Subject: [PATCH 13/25] Change header --- packages/api/src/format/input.spec.ts | 15 ++------------- packages/api/src/format/output.spec.ts | 15 ++------------- packages/api/src/format/output.ts | 15 ++------------- packages/api/src/format/types.serialized.ts | 15 ++------------- 4 files changed, 8 insertions(+), 52 deletions(-) diff --git a/packages/api/src/format/input.spec.ts b/packages/api/src/format/input.spec.ts index c1e1be76..0b9df210 100644 --- a/packages/api/src/format/input.spec.ts +++ b/packages/api/src/format/input.spec.ts @@ -1,18 +1,7 @@ // Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// +// SPDX-License-Identifier: MIT import BigNumber from 'bignumber.js'; import { isAddress } from '@parity/abi/lib/util/address'; diff --git a/packages/api/src/format/output.spec.ts b/packages/api/src/format/output.spec.ts index b89f86b6..119ac5fa 100644 --- a/packages/api/src/format/output.spec.ts +++ b/packages/api/src/format/output.spec.ts @@ -1,18 +1,7 @@ // Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// +// SPDX-License-Identifier: MIT import BigNumber from 'bignumber.js'; import { isAddress } from '@parity/abi/lib/util/address'; diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts index 125307a6..974046bc 100644 --- a/packages/api/src/format/output.ts +++ b/packages/api/src/format/output.ts @@ -1,18 +1,7 @@ // Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// +// SPDX-License-Identifier: MIT import BigNumber from 'bignumber.js'; import { isString } from '@parity/abi/lib/util/types'; diff --git a/packages/api/src/format/types.serialized.ts b/packages/api/src/format/types.serialized.ts index 594d0462..d64cd5f8 100644 --- a/packages/api/src/format/types.serialized.ts +++ b/packages/api/src/format/types.serialized.ts @@ -1,18 +1,7 @@ // Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . +// +// SPDX-License-Identifier: MIT export type SerializedNumber = number | string; From d195eafc69bd9bbd0884ad9ed9e59853af69153f Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 12:48:58 +0100 Subject: [PATCH 14/25] Copy back old api package with working tests --- jest.config.js | 3 +- packages/api/package.json | 58 +- packages/api/src/api.spec.js | 2 +- packages/api/src/contract/contract.spec.js | 90 +- packages/api/src/format/input.js | 259 +++ .../format/{input.spec.ts => input.spec.js} | 245 ++- packages/api/src/format/input.ts | 287 --- packages/api/src/format/output.js | 463 +++++ packages/api/src/format/output.spec.js | 504 +++++ packages/api/src/format/output.spec.ts | 587 ------ packages/api/src/format/output.ts | 556 ------ packages/api/src/format/types.serialized.ts | 162 -- packages/api/src/polyfill.js | 23 + packages/api/src/provider/current.spec.js | 16 +- packages/api/src/provider/http.spec.js | 2 +- packages/api/src/provider/ipc.js | 173 ++ packages/api/src/provider/ipc.spec.js | 29 + packages/api/src/provider/postMessage.js | 171 ++ packages/api/src/provider/postMessage.spec.js | 134 ++ packages/api/src/provider/sendAsync.spec.js | 2 +- packages/api/src/provider/ws.spec.js | 2 +- packages/api/src/pubsub/pubsub.spec.js | 140 +- packages/api/src/rpc/db/db.spec.js | 2 +- packages/api/src/rpc/eth/eth.e2e.js | 48 +- packages/api/src/rpc/eth/eth.js | 308 ++- packages/api/src/rpc/eth/eth.spec.js | 120 +- packages/api/src/rpc/net/net.e2e.js | 6 +- packages/api/src/rpc/net/net.spec.js | 4 +- packages/api/src/rpc/parity/parity.e2e.js | 18 +- packages/api/src/rpc/parity/parity.spec.js | 32 +- packages/api/src/rpc/personal/personal.e2e.js | 10 +- .../api/src/rpc/personal/personal.spec.js | 12 +- packages/api/src/rpc/trace/trace.e2e.js | 6 +- packages/api/src/rpc/trace/trace.spec.js | 4 +- packages/api/src/rpc/web3/web3.e2e.js | 6 +- packages/api/src/rpc/web3/web3.spec.js | 2 +- packages/api/src/subscriptions/eth.spec.js | 12 +- .../api/src/subscriptions/logging.spec.js | 2 +- .../api/src/subscriptions/manager.spec.js | 6 +- .../api/src/subscriptions/personal.spec.js | 20 +- .../api/src/transport/TransportError.spec.js | 18 - .../transport/{TransportError.js => error.js} | 26 +- packages/api/src/transport/error.spec.js | 29 + packages/api/src/transport/http/http.e2e.js | 2 +- packages/api/src/transport/http/http.js | 2 +- packages/api/src/transport/http/http.spec.js | 18 +- packages/api/src/transport/index.js | 2 +- .../api/src/transport/jsonRpcBase.spec.js | 20 +- .../api/src/transport/jsonRpcEncoder.spec.js | 8 +- packages/api/src/transport/middleware.spec.js | 6 +- packages/api/src/transport/ws/ws.e2e.js | 2 +- packages/api/src/transport/ws/ws.js | 2 +- packages/api/src/transport/ws/ws.spec.js | 12 +- packages/api/src/util/address.js | 22 + packages/api/src/util/address.ts | 6 - packages/api/src/util/decode.js | 102 + packages/api/src/util/decode.spec.js | 113 ++ packages/api/src/util/decode.spec.ts | 119 -- packages/api/src/util/decode.ts | 131 -- packages/api/src/util/encode.js | 76 + packages/api/src/util/encode.spec.js | 96 + packages/api/src/util/encode.spec.ts | 96 - packages/api/src/util/encode.ts | 119 -- packages/api/src/util/format.js | 123 ++ packages/api/src/util/format.spec.js | 114 ++ packages/api/src/util/format.spec.ts | 140 -- packages/api/src/util/format.ts | 164 -- packages/api/src/util/identity.js | 34 + packages/api/src/util/index.js | 51 + packages/api/src/util/index.ts | 12 - packages/api/src/util/sha3.js | 40 + packages/api/src/util/sha3.spec.js | 46 + packages/api/src/util/sha3.spec.ts | 54 - packages/api/src/util/sha3.ts | 37 - packages/api/src/util/types.js | 70 + packages/api/src/util/types.spec.js | 120 ++ packages/api/src/util/types.spec.ts | 113 -- packages/api/src/util/types.ts | 6 - packages/api/src/util/wei.js | 43 + packages/api/src/util/wei.spec.js | 57 + packages/api/src/util/wei.spec.ts | 60 - packages/api/src/util/wei.ts | 63 - packages/api/test/types.js | 50 + yarn.lock | 1679 ++++++++++++++++- 84 files changed, 5188 insertions(+), 3441 deletions(-) create mode 100644 packages/api/src/format/input.js rename packages/api/src/format/{input.spec.ts => input.spec.js} (53%) delete mode 100644 packages/api/src/format/input.ts create mode 100644 packages/api/src/format/output.js create mode 100644 packages/api/src/format/output.spec.js delete mode 100644 packages/api/src/format/output.spec.ts delete mode 100644 packages/api/src/format/output.ts delete mode 100644 packages/api/src/format/types.serialized.ts create mode 100644 packages/api/src/polyfill.js create mode 100644 packages/api/src/provider/ipc.js create mode 100644 packages/api/src/provider/ipc.spec.js create mode 100644 packages/api/src/provider/postMessage.js create mode 100644 packages/api/src/provider/postMessage.spec.js delete mode 100644 packages/api/src/transport/TransportError.spec.js rename packages/api/src/transport/{TransportError.js => error.js} (58%) create mode 100644 packages/api/src/transport/error.spec.js create mode 100644 packages/api/src/util/address.js delete mode 100644 packages/api/src/util/address.ts create mode 100644 packages/api/src/util/decode.js create mode 100644 packages/api/src/util/decode.spec.js delete mode 100644 packages/api/src/util/decode.spec.ts delete mode 100644 packages/api/src/util/decode.ts create mode 100644 packages/api/src/util/encode.js create mode 100644 packages/api/src/util/encode.spec.js delete mode 100644 packages/api/src/util/encode.spec.ts delete mode 100644 packages/api/src/util/encode.ts create mode 100644 packages/api/src/util/format.js create mode 100644 packages/api/src/util/format.spec.js delete mode 100644 packages/api/src/util/format.spec.ts delete mode 100644 packages/api/src/util/format.ts create mode 100644 packages/api/src/util/identity.js create mode 100644 packages/api/src/util/index.js delete mode 100644 packages/api/src/util/index.ts create mode 100644 packages/api/src/util/sha3.js create mode 100644 packages/api/src/util/sha3.spec.js delete mode 100644 packages/api/src/util/sha3.spec.ts delete mode 100644 packages/api/src/util/sha3.ts create mode 100644 packages/api/src/util/types.js create mode 100644 packages/api/src/util/types.spec.js delete mode 100644 packages/api/src/util/types.spec.ts delete mode 100644 packages/api/src/util/types.ts create mode 100644 packages/api/src/util/wei.js create mode 100644 packages/api/src/util/wei.spec.js delete mode 100644 packages/api/src/util/wei.spec.ts delete mode 100644 packages/api/src/util/wei.ts create mode 100644 packages/api/test/types.js diff --git a/jest.config.js b/jest.config.js index bb0e51d8..b9bcebdb 100644 --- a/jest.config.js +++ b/jest.config.js @@ -10,5 +10,6 @@ module.exports = { transform: { '^.+\\.tsx?$': 'ts-jest' }, - testRegex: 'spec\\.(ts|tsx)$' // TODO Skip api/ tests for now, as it's still WIP + // testRegex: 'spec\\.(ts|tsx)$' // TODO Skip api/ tests for now, as it's still WIP + testRegex: `packages/(abi|electron|light\.js|light\.js-react)/.*spec\\.(ts|tsx)$` }; diff --git a/packages/api/package.json b/packages/api/package.json index e7a4ff93..c4f85a5d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -17,23 +17,59 @@ "access": "public" }, "scripts": { - "prebuild": "rimraf lib", - "build": "echo Skipped for now.", - "test": "jest" + "build": "rimraf lib && babel src --out-dir lib --ignore *.spec.js", + "ci:makeshift": "makeshift", + "lint": "npm run lint:css && npm run lint:js", + "lint:css": "echo \"WARN: npm run lint:css skipped\"", + "lint:js": "eslint src", + "test": "cross-env NODE_ENV=test mocha 'src/*.spec.js' 'src/**/*.spec.js'", + "test:coverage": "cross-env NODE_ENV=test istanbul cover _mocha 'src/*.spec.js' 'src/**/*.spec.js' && coveralls < coverage/lcov.info" }, "devDependencies": { - "@types/lodash-es": "^4.17.1", - "@types/node": "^10.5.2" + "babel-cli": "^6.26.0", + "babel-core": "^6.26.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "babel-preset-env": "^1.6.1", + "babel-preset-stage-0": "^6.24.1", + "chai": "3.5.0", + "chai-as-promised": "6.0.0", + "coveralls": "^3.0.0", + "cross-env": "^5.1.1", + "eslint": "^4.4.0", + "eslint-config-semistandard": "^11.0.0", + "eslint-config-standard": "^10.2.1", + "eslint-config-standard-react": "^5.0.0", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.1.1", + "eslint-plugin-promise": "^3.5.0", + "eslint-plugin-react": "^7.1.0", + "eslint-plugin-standard": "^3.0.1", + "istanbul": "^0.4.5", + "jsdom": "^11.1.0", + "makeshift": "^1.1.0", + "mocha": "^3.4.2", + "mock-local-storage": "1.0.2", + "mock-socket": "6.0.4", + "nock": "9.0.7", + "rimraf": "^2.6.2", + "sinon": "1.17.7", + "sinon-as-promised": "4.0.2", + "sinon-chai": "2.8.0" }, "dependencies": { - "@parity/abi": "^3.0.0", + "@parity/abi": "~2.1.4", "@parity/jsonrpc": "2.1.x", "@parity/wordlist": "1.1.x", - "bignumber.js": "7.2.1", - "eventemitter3": "^3.1.0", - "js-sha3": "0.7.0", - "lodash": "^4.17.10", + "bignumber.js": "4.1.0", + "blockies": "0.0.2", + "es6-error": "4.0.2", + "es6-promise": "^4.1.1", + "eventemitter3": "^2.0.2", + "isomorphic-fetch": "^2.2.1", + "js-sha3": "0.5.5", + "lodash": "^4.17.4", "store": "^2.0.12", - "websocket": "^1.0.26" + "websocket": "^1.0.25" } } diff --git a/packages/api/src/api.spec.js b/packages/api/src/api.spec.js index fc4bfecc..f6eff335 100644 --- a/packages/api/src/api.spec.js +++ b/packages/api/src/api.spec.js @@ -36,6 +36,6 @@ describe('Api', () => { }); it('exposes util as static property', () => { - expect(Api.util).toEqual(util); + expect(Api.util).to.equal(util); }); }); diff --git a/packages/api/src/contract/contract.spec.js b/packages/api/src/contract/contract.spec.js index c33e334f..8311849f 100644 --- a/packages/api/src/contract/contract.spec.js +++ b/packages/api/src/contract/contract.spec.js @@ -99,22 +99,22 @@ describe('contract/Contract', () => { it('sets EthApi & parsed interface', () => { expect(contract.address).to.not.be.ok; - expect(contract.api).toEqual(eth); - expect(isInstanceOf(contract.abi, Abi)).toBe.ok; + expect(contract.api).to.deep.equal(eth); + expect(isInstanceOf(contract.abi, Abi)).to.be.ok; }); it('attaches functions', () => { - expect(contract.functions.length).toEqual(2); - expect(contract.functions[0].name).toEqual('test'); + expect(contract.functions.length).to.equal(2); + expect(contract.functions[0].name).to.equal('test'); }); it('attaches constructors', () => { - expect(contract.constructors.length).toEqual(1); + expect(contract.constructors.length).to.equal(1); }); it('attaches events', () => { - expect(contract.events.length).toEqual(2); - expect(contract.events[0].name).toEqual('baz'); + expect(contract.events.length).to.equal(2); + expect(contract.events[0].name).to.equal('baz'); }); }); }); @@ -149,14 +149,14 @@ describe('contract/Contract', () => { contract.at('6789'); - expect(Object.keys(contract.instance)).toEqual([ + expect(Object.keys(contract.instance)).to.deep.equal([ 'Drained', /^(?:0x)(.+)$/.exec(sha3('Drained(uint256)'))[1], 'balanceOf', /^(?:0x)(.+)$/.exec(sha3('balanceOf(address)'))[1].substr(0, 8), 'address' ]); - expect(contract.address).toEqual('6789'); + expect(contract.address).to.equal('6789'); }); }); @@ -199,9 +199,9 @@ describe('contract/Contract', () => { }); const log = decoded.logs[0]; - expect(log.event).toEqual('Message'); - expect(log.address).toEqual('0x22bff18ec62281850546a664bb63a5c06ac5f76c'); - expect(log.params).toEqual({ + expect(log.event).to.equal('Message'); + expect(log.address).to.equal('0x22bff18ec62281850546a664bb63a5c06ac5f76c'); + expect(log.params).to.deep.equal({ at: { type: 'uint', value: new BigNumber('1457965151') }, message: { type: 'string', value: 'post(message)' }, messageId: { type: 'uint', value: new BigNumber('281474976731085') }, @@ -238,15 +238,15 @@ describe('contract/Contract', () => { }); it('sends multiple getTransactionReceipt calls', () => { - expect(scope.isDone()).toBe.true; + expect(scope.isDone()).to.be.true; }); it('passes the txhash through', () => { - expect(scope.body.eth_getTransactionReceipt.params[0]).toEqual('0x123'); + expect(scope.body.eth_getTransactionReceipt.params[0]).to.equal('0x123'); }); it('receives the final receipt', () => { - expect(receipt).toEqual(EXPECT); + expect(receipt).to.deep.equal(EXPECT); }); }); @@ -287,7 +287,7 @@ describe('contract/Contract', () => { }); it('passes the options through to postTransaction (incl. gas calculation)', () => { - expect(scope.body.parity_postTransaction.params[0].data).toEqual(CODE); + expect(scope.body.parity_postTransaction.params[0].data).to.equal(CODE); }); }); }); @@ -318,17 +318,17 @@ describe('contract/Contract', () => { }); it('calls estimateGas, postTransaction, checkRequest, getTransactionReceipt & getCode in order', () => { - expect(scope.isDone()).toBe.true; + expect(scope.isDone()).to.be.true; }); it('passes the options through to postTransaction (incl. gas calculation)', () => { - expect(scope.body.parity_postTransaction.params).toEqual([ + expect(scope.body.parity_postTransaction.params).to.deep.equal([ { data: `0x123${CALLDATA}`, gas: '0x4b0' } ]); }); it('sets the address of the contract', () => { - expect(contract.address).toEqual(ADDRESS); + expect(contract.address).to.equal(ADDRESS); }); }); @@ -380,37 +380,37 @@ describe('contract/Contract', () => { describe('_addOptionsTo', () => { it('works on no object specified', () => { - expect(contract._addOptionsTo()).toEqual({ to: ADDR }); + expect(contract._addOptionsTo()).to.deep.equal({ to: ADDR }); }); it('uses the contract address when none specified', () => { - expect(contract._addOptionsTo({ from: 'me' })).toEqual({ to: ADDR, from: 'me' }); + expect(contract._addOptionsTo({ from: 'me' })).to.deep.equal({ to: ADDR, from: 'me' }); }); it('overrides the contract address when specified', () => { - expect(contract._addOptionsTo({ to: 'you', from: 'me' })).toEqual({ to: 'you', from: 'me' }); + expect(contract._addOptionsTo({ to: 'you', from: 'me' })).to.deep.equal({ to: 'you', from: 'me' }); }); }); describe('attachments', () => { it('attaches .call, .postTransaction & .estimateGas to constructors', () => { - expect(isFunction(cons.call)).toBe.true; - expect(isFunction(cons.postTransaction)).toBe.true; - expect(isFunction(cons.estimateGas)).toBe.true; + expect(isFunction(cons.call)).to.be.true; + expect(isFunction(cons.postTransaction)).to.be.true; + expect(isFunction(cons.estimateGas)).to.be.true; }); it('attaches .call, .postTransaction & .estimateGas to functions', () => { - expect(isFunction(func.call)).toBe.true; - expect(isFunction(func.postTransaction)).toBe.true; - expect(isFunction(func.estimateGas)).toBe.true; + expect(isFunction(func.call)).to.be.true; + expect(isFunction(func.postTransaction)).to.be.true; + expect(isFunction(func.estimateGas)).to.be.true; }); it('attaches .call only to constant functions', () => { func = (new Contract(eth, [{ type: 'function', name: 'test', constant: true }])).functions[0]; - expect(isFunction(func.call)).toBe.true; - expect(isFunction(func.postTransaction)).toBe.false; - expect(isFunction(func.estimateGas)).toBe.false; + expect(isFunction(func.call)).to.be.true; + expect(isFunction(func.postTransaction)).to.be.false; + expect(isFunction(func.estimateGas)).to.be.false; }); }); @@ -423,8 +423,8 @@ describe('contract/Contract', () => { return func .postTransaction({ someExtras: 'foo' }, VALUES) .then(() => { - expect(scope.isDone()).toBe.true; - expect(scope.body.parity_postTransaction.params[0]).toEqual({ + expect(scope.isDone()).to.be.true; + expect(scope.body.parity_postTransaction.params[0]).to.deep.equal({ someExtras: 'foo', to: ADDR, data: ENCODED @@ -442,9 +442,9 @@ describe('contract/Contract', () => { return func .estimateGas({ someExtras: 'foo' }, VALUES) .then((amount) => { - expect(scope.isDone()).toBe.true; - expect(amount.toString(16)).toEqual('123'); - expect(scope.body.eth_estimateGas.params).toEqual([{ + expect(scope.isDone()).to.be.true; + expect(amount.toString(16)).to.equal('123'); + expect(scope.body.eth_estimateGas.params).to.deep.equal([{ someExtras: 'foo', to: ADDR, data: ENCODED @@ -460,13 +460,13 @@ describe('contract/Contract', () => { return func .call({ someExtras: 'foo' }, VALUES) .then((result) => { - expect(scope.isDone()).toBe.true; - expect(scope.body.eth_call.params).toEqual([{ + expect(scope.isDone()).to.be.true; + expect(scope.body.eth_call.params).to.deep.equal([{ someExtras: 'foo', to: ADDR, data: ENCODED }, 'latest']); - expect(result.toString(16)).toEqual('123456'); + expect(result.toString(16)).to.equal('123456'); }); }); @@ -476,10 +476,10 @@ describe('contract/Contract', () => { return contract.functions[1] .call({}, []) .then((result) => { - expect(scope.isDone()).toBe.true; - expect(result.length).toEqual(2); - expect(result[0].toString(16)).toEqual('123456'); - expect(result[1].toString(16)).toEqual('456789'); + expect(scope.isDone()).to.be.true; + expect(result.length).to.equal(2); + expect(result[0].toString(16)).to.equal('123456'); + expect(result[1].toString(16)).to.equal('456789'); }); }); }); @@ -576,7 +576,7 @@ describe('contract/Contract', () => { return contract .subscribe('Message', { toBlock: 'pending' }, cbe) .then((subscriptionId) => { - expect(subscriptionId).toEqual(1); + expect(subscriptionId).to.equal(1); }); }); @@ -584,7 +584,7 @@ describe('contract/Contract', () => { return contract .subscribe('Message', { toBlock: 'pending' }, cbe) .then((subscriptionId) => { - expect(scope.isDone()).toBe.true; + expect(scope.isDone()).to.be.true; }); }); diff --git a/packages/api/src/format/input.js b/packages/api/src/format/input.js new file mode 100644 index 00000000..7eafdb36 --- /dev/null +++ b/packages/api/src/format/input.js @@ -0,0 +1,259 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const BigNumber = require('bignumber.js'); + +const { isArray, isHex, isInstanceOf, isString } = require('../util/types'); +const { padLeft, toHex } = require('../util/format'); + +function inAddress (address) { + // TODO: address validation if we have upper-lower addresses + return inHex(address); +} + +function inAddresses (addresses) { + return (addresses || []).map(inAddress); +} + +function inBlockNumber (blockNumber) { + if (isString(blockNumber)) { + switch (blockNumber) { + case 'earliest': + case 'latest': + case 'pending': + return blockNumber; + } + } + + return inNumber16(blockNumber); +} + +function inData (data) { + if (data && data.length && !isHex(data)) { + data = data.split('').map((chr) => { + return `0${chr.charCodeAt(0).toString(16)}`.slice(-2); + }).join(''); + } + + return inHex(data); +} + +function inHash (hash) { + return inHex(hash); +} + +function inTopics (topics) { + return (topics || []) + .filter((topic) => topic === null || topic) + .map((topic) => { + if (topic === null) { + return null; + } + + if (Array.isArray(topic)) { + return inTopics(topic); + } + + return padLeft(topic, 32); + }); +} + +function inFilter (options) { + if (options) { + Object.keys(options).forEach((key) => { + switch (key) { + case 'address': + if (isArray(options[key])) { + options[key] = options[key].map(inAddress); + } else { + options[key] = inAddress(options[key]); + } + break; + + case 'fromBlock': + case 'toBlock': + options[key] = inBlockNumber(options[key]); + break; + + case 'limit': + options[key] = inNumber10(options[key]); + break; + + case 'topics': + options[key] = inTopics(options[key]); + } + }); + } + + return options; +} + +function inHex (str) { + return toHex(str); +} + +function inNumber10 (number) { + if (isInstanceOf(number, BigNumber)) { + return number.toNumber(); + } + + return (new BigNumber(number || 0)).toNumber(); +} + +function inNumber16 (number) { + const bn = isInstanceOf(number, BigNumber) + ? number + : (new BigNumber(number || 0)); + + if (!bn.isInteger()) { + throw new Error(`[format/input::inNumber16] the given number is not an integer: ${bn.toFormat()}`); + } + + return inHex(bn.toString(16)); +} + +function inOptionsCondition (condition) { + if (condition) { + if (condition.block) { + condition.block = condition.block ? inNumber10(condition.block) : null; + } else if (condition.time) { + condition.time = inNumber10(Math.floor(condition.time.getTime() / 1000)); + } + } + + return condition; +} + +function inOptions (_options = {}) { + const options = Object.assign({}, _options); + + Object.keys(options).forEach((key) => { + switch (key) { + case 'to': + // Don't encode the `to` option if it's empty + // (eg. contract deployments) + if (options[key]) { + options.to = inAddress(options[key]); + } + break; + + case 'from': + options[key] = inAddress(options[key]); + break; + + case 'condition': + options[key] = inOptionsCondition(options[key]); + break; + + case 'gas': + case 'gasPrice': + options[key] = inNumber16((new BigNumber(options[key])).round()); + break; + + case 'value': + case 'nonce': + options[key] = inNumber16(options[key]); + break; + + case 'data': + options[key] = inData(options[key]); + break; + } + }); + + return options; +} + +function inTraceFilter (filterObject) { + if (filterObject) { + Object.keys(filterObject).forEach((key) => { + switch (key) { + case 'fromAddress': + case 'toAddress': + filterObject[key] = [].concat(filterObject[key]) + .map(address => inAddress(address)); + break; + + case 'toBlock': + case 'fromBlock': + filterObject[key] = inBlockNumber(filterObject[key]); + break; + } + }); + } + + return filterObject; +} + +function inTraceType (whatTrace) { + if (isString(whatTrace)) { + return [whatTrace]; + } + + return whatTrace; +} + +function inDeriveType (derive) { + return derive && derive.type === 'hard' ? 'hard' : 'soft'; +} + +function inDeriveHash (derive) { + const hash = derive && derive.hash ? derive.hash : derive; + const type = inDeriveType(derive); + + return { + hash: inHex(hash), + type + }; +} + +function inDeriveIndex (derive) { + if (!derive) { + return []; + } + + if (!isArray(derive)) { + derive = [derive]; + } + + return derive.map(item => { + const index = inNumber10(item && item.index ? item.index : item); + + return { + index, + type: inDeriveType(item) + }; + }); +} + +module.exports = { + inAddress, + inAddresses, + inBlockNumber, + inData, + inHash, + inTopics, + inFilter, + inHex, + inNumber10, + inNumber16, + inOptionsCondition, + inOptions, + inTraceFilter, + inTraceType, + inDeriveHash, + inDeriveIndex +}; diff --git a/packages/api/src/format/input.spec.ts b/packages/api/src/format/input.spec.js similarity index 53% rename from packages/api/src/format/input.spec.ts rename to packages/api/src/format/input.spec.js index 0b9df210..16985b56 100644 --- a/packages/api/src/format/input.spec.ts +++ b/packages/api/src/format/input.spec.js @@ -1,28 +1,25 @@ // Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import BigNumber from 'bignumber.js'; -import { isAddress } from '@parity/abi/lib/util/address'; - -import { FilterOptions, Options } from '../types'; -import { - inAddress, - inAddresses, - inBlockNumber, - inData, - inFilter, - inHash, - inHex, - inNumber10, - inNumber16, - inOptions, - inTraceType, - inDeriveHash, - inDeriveIndex, - inTopics -} from './input'; + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/* eslint-disable no-unused-expressions */ + +const BigNumber = require('bignumber.js'); + +const { inAddress, inAddresses, inBlockNumber, inData, inFilter, inHash, inHex, inNumber10, inNumber16, inOptions, inTraceType, inDeriveHash, inDeriveIndex, inTopics } = require('./input'); +const { isAddress } = require('../../test/types'); describe('format/input', () => { const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; @@ -31,127 +28,128 @@ describe('format/input', () => { const address = '63cf90d3f0410092fc0fca41846f596223979195'; it('adds the leading 0x as required', () => { - expect(inAddress(address)).toEqual(`0x${address}`); + expect(inAddress(address)).to.equal(`0x${address}`); }); it('returns verified addresses as-is', () => { - expect(inAddress(`0x${address}`)).toEqual(`0x${address}`); + expect(inAddress(`0x${address}`)).to.equal(`0x${address}`); }); it('returns lowercase equivalents', () => { - expect(inAddress(address.toUpperCase())).toEqual(`0x${address}`); + expect(inAddress(address.toUpperCase())).to.equal(`0x${address}`); }); it('returns 0x on null addresses', () => { - expect(inAddress()).toEqual('0x'); + expect(inAddress()).to.equal('0x'); }); }); describe('inAddresses', () => { it('handles empty values', () => { - expect(inAddresses()).toEqual([]); + expect(inAddresses()).to.deep.equal([]); }); it('handles mapping of all addresses in array', () => { const address = '63cf90d3f0410092fc0fca41846f596223979195'; - expect(inAddresses([undefined, address])).toEqual(['0x', `0x${address}`]); + expect(inAddresses([null, address])).to.deep.equal([ + '0x', + `0x${address}` + ]); }); }); describe('inBlockNumber()', () => { it('returns earliest as-is', () => { - expect(inBlockNumber('earliest')).toEqual('earliest'); + expect(inBlockNumber('earliest')).to.equal('earliest'); }); it('returns latest as-is', () => { - expect(inBlockNumber('latest')).toEqual('latest'); + expect(inBlockNumber('latest')).to.equal('latest'); }); it('returns pending as-is', () => { - expect(inBlockNumber('pending')).toEqual('pending'); + expect(inBlockNumber('pending')).to.equal('pending'); }); it('formats existing BigNumber into hex', () => { - expect(inBlockNumber(new BigNumber(0x123456))).toEqual('0x123456'); + expect(inBlockNumber(new BigNumber(0x123456))).to.equal('0x123456'); }); it('formats hex strings into hex', () => { - expect(inBlockNumber('0x123456')).toEqual('0x123456'); + expect(inBlockNumber('0x123456')).to.equal('0x123456'); }); it('formats numbers into hex', () => { - expect(inBlockNumber(0x123456)).toEqual('0x123456'); + expect(inBlockNumber(0x123456)).to.equal('0x123456'); }); }); describe('inData', () => { it('formats to hex', () => { - expect(inData('123456')).toEqual('0x123456'); + expect(inData('123456')).to.equal('0x123456'); }); it('converts a string to a hex representation', () => { - expect(inData('jaco')).toEqual('0x6a61636f'); + expect(inData('jaco')).to.equal('0x6a61636f'); }); }); describe('inHex', () => { it('leaves leading 0x as-is', () => { - expect(inHex('0x123456')).toEqual('0x123456'); + expect(inHex('0x123456')).to.equal('0x123456'); }); it('adds a leading 0x', () => { - expect(inHex('123456')).toEqual('0x123456'); + expect(inHex('123456')).to.equal('0x123456'); }); it('returns uppercase as lowercase (leading 0x)', () => { - expect(inHex('0xABCDEF')).toEqual('0xabcdef'); + expect(inHex('0xABCDEF')).to.equal('0xabcdef'); }); it('returns uppercase as lowercase (no leading 0x)', () => { - expect(inHex('ABCDEF')).toEqual('0xabcdef'); + expect(inHex('ABCDEF')).to.equal('0xabcdef'); }); it('handles empty & null', () => { - expect(inHex()).toEqual('0x'); - expect(inHex('')).toEqual('0x'); + expect(inHex()).to.equal('0x'); + expect(inHex('')).to.equal('0x'); }); }); describe('inHash', () => { it('leaves leading 0x as-is', () => { - expect(inHash('0x123456')).toEqual('0x123456'); + expect(inHash('0x123456')).to.equal('0x123456'); }); }); describe('inFilter', () => { - ['address' as keyof FilterOptions].forEach(input => { + ['address'].forEach((input) => { it(`formats ${input} address as address`, () => { - const block: FilterOptions = {}; + const block = {}; block[input] = address; const formatted = inFilter(block)[input]; - expect(isAddress(formatted as string)).toBe(true); - expect(formatted).toEqual(address); + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(address); }); }); - (['fromBlock', 'toBlock'] as (keyof FilterOptions)[]).forEach(input => { + ['fromBlock', 'toBlock'].forEach((input) => { it(`formats ${input} number as blockNumber`, () => { - const block: FilterOptions = {}; + const block = {}; block[input] = 0x123; const formatted = inFilter(block)[input]; - expect(formatted).toEqual('0x123'); + expect(formatted).to.equal('0x123'); }); }); it('ignores and passes through unknown keys', () => { - expect(inFilter({ someRandom: 'someRandom' } as any)).toEqual({ - someRandom: 'someRandom' - }); + expect(inFilter({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); }); it('formats an filter options object with relevant entries converted', () => { @@ -163,7 +161,7 @@ describe('format/input', () => { extraData: 'someExtraStuffInHere', limit: 0x32 }) - ).toEqual({ + ).to.deep.equal({ address: address, fromBlock: 'latest', toBlock: '0x101', @@ -175,61 +173,61 @@ describe('format/input', () => { describe('inNumber10()', () => { it('formats existing BigNumber into number', () => { - expect(inNumber10(new BigNumber(123))).toEqual(123); + expect(inNumber10(new BigNumber(123))).to.equal(123); }); it('formats hex strings into decimal', () => { - expect(inNumber10('0x0a')).toEqual(10); + expect(inNumber10('0x0a')).to.equal(10); }); it('formats numbers into number', () => { - expect(inNumber10(123)).toEqual(123); + expect(inNumber10(123)).to.equal(123); }); it('formats undefined into 0', () => { - expect(inNumber10()).toEqual(0); + expect(inNumber10()).to.equal(0); }); }); describe('inNumber16()', () => { it('formats existing BigNumber into hex', () => { - expect(inNumber16(new BigNumber(0x123456))).toEqual('0x123456'); + expect(inNumber16(new BigNumber(0x123456))).to.equal('0x123456'); }); it('formats hex strings into hex', () => { - expect(inNumber16('0x123456')).toEqual('0x123456'); + expect(inNumber16('0x123456')).to.equal('0x123456'); }); it('formats numbers into hex', () => { - expect(inNumber16(0x123456)).toEqual('0x123456'); + expect(inNumber16(0x123456)).to.equal('0x123456'); }); it('formats undefined into 0', () => { - expect(inNumber16()).toEqual('0x0'); + expect(inNumber16()).to.equal('0x0'); }); }); describe('inOptions', () => { - ['data' as keyof Options].forEach(input => { + ['data'].forEach((input) => { it(`converts ${input} to hex data`, () => { - const block: Options = {}; + const block = {}; block[input] = '1234'; const formatted = inData(block[input]); - expect(formatted).toEqual('0x1234'); + expect(formatted).to.equal('0x1234'); }); }); - (['from', 'to'] as (keyof Options)[]).forEach(input => { + ['from', 'to'].forEach((input) => { it(`formats ${input} address as address`, () => { - const block: Options = {}; + const block = {}; block[input] = address; - const formatted = inOptions(block)[input] as string; + const formatted = inOptions(block)[input]; - expect(isAddress(formatted)).toBe(true); - expect(formatted).toEqual(address); + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(address); }); }); @@ -237,30 +235,26 @@ describe('format/input', () => { const options = { to: '' }; const formatted = inOptions(options); - expect(formatted.to).toEqual(undefined); + expect(formatted.to).to.equal(''); }); - (['gas', 'gasPrice', 'value', 'nonce'] as (keyof Options)[]).forEach( - input => { - it(`formats ${input} number as hexnumber`, () => { - const block: Options = {}; + ['gas', 'gasPrice', 'value', 'nonce'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; - block[input] = 0x123; - const formatted = inOptions(block)[input]; + block[input] = 0x123; + const formatted = inOptions(block)[input]; - expect(formatted).toEqual('0x123'); - }); - } - ); + expect(formatted).to.equal('0x123'); + }); + }); it('passes condition as null when specified as such', () => { - expect(inOptions({ condition: null })).toEqual({ condition: null }); + expect(inOptions({ condition: null })).to.deep.equal({ condition: null }); }); it('ignores and passes through unknown keys', () => { - expect(inOptions({ someRandom: 'someRandom' } as any)).toEqual({ - someRandom: 'someRandom' - }); + expect(inOptions({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); }); it('formats an options object with relevant entries converted', () => { @@ -275,7 +269,7 @@ describe('format/input', () => { data: '0123456789', extraData: 'someExtraStuffInHere' }) - ).toEqual({ + ).to.deep.equal({ from: address, to: address, gas: '0x100', @@ -292,43 +286,39 @@ describe('format/input', () => { it('returns array of types as is', () => { const types = ['vmTrace', 'trace', 'stateDiff']; - expect(inTraceType(types)).toEqual(types); + expect(inTraceType(types)).to.deep.equal(types); }); it('formats single string type into array', () => { const type = 'vmTrace'; - expect(inTraceType(type)).toEqual([type]); + expect(inTraceType(type)).to.deep.equal([type]); }); }); describe('inDeriveHash', () => { it('returns derive hash', () => { - expect(inDeriveHash(1)).toEqual({ + expect(inDeriveHash(1)).to.deep.equal({ hash: '0x1', type: 'soft' }); - expect(inDeriveHash(null)).toEqual({ + expect(inDeriveHash(null)).to.deep.equal({ hash: '0x', type: 'soft' }); - expect( - inDeriveHash({ - hash: 5 - }) - ).toEqual({ + expect(inDeriveHash({ + hash: 5 + })).to.deep.equal({ hash: '0x5', type: 'soft' }); - expect( - inDeriveHash({ - hash: 5, - type: 'hard' - }) - ).toEqual({ + expect(inDeriveHash({ + hash: 5, + type: 'hard' + })).to.deep.equal({ hash: '0x5', type: 'hard' }); @@ -337,36 +327,25 @@ describe('format/input', () => { describe('inDeriveIndex', () => { it('returns derive hash', () => { - expect(inDeriveIndex(null)).toEqual([]); - expect(inDeriveIndex([])).toEqual([]); + expect(inDeriveIndex(null)).to.deep.equal([]); + expect(inDeriveIndex([])).to.deep.equal([]); - expect(inDeriveIndex([1])).toEqual([ - { - index: 1, - type: 'soft' - } - ]); + expect(inDeriveIndex([1])).to.deep.equal([{ + index: 1, + type: 'soft' + }]); - expect( - inDeriveIndex({ - index: 1 - }) - ).toEqual([ - { - index: 1, - type: 'soft' - } - ]); + expect(inDeriveIndex({ + index: 1 + })).to.deep.equal([{ + index: 1, + type: 'soft' + }]); - expect( - inDeriveIndex([ - { - index: 1, - type: 'hard' - }, - 5 - ]) - ).toEqual([ + expect(inDeriveIndex([{ + index: 1, + type: 'hard' + }, 5])).to.deep.equal([ { index: 1, type: 'hard' @@ -381,21 +360,21 @@ describe('format/input', () => { describe('inTopics', () => { it('returns empty array when no inputs provided', () => { - expect(inTopics()).toEqual([]); + expect(inTopics()).to.deep.equal([]); }); it('keeps null topic as null', () => { - expect(inTopics([null])).toEqual([null]); + expect(inTopics([null])).to.deep.equal([null]); }); it('pads topics as received', () => { - expect(inTopics(['123'])).toEqual([ + expect(inTopics(['123'])).to.deep.equal([ '0x0000000000000000000000000000000000000000000000000000000000000123' ]); }); it('handles nested arrays', () => { - expect(inTopics([null, '123', ['456', null, '789']])).toEqual([ + expect(inTopics([null, '123', ['456', null, '789']])).to.deep.equal([ null, '0x0000000000000000000000000000000000000000000000000000000000000123', [ diff --git a/packages/api/src/format/input.ts b/packages/api/src/format/input.ts deleted file mode 100644 index 972c7f65..00000000 --- a/packages/api/src/format/input.ts +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import BigNumber from 'bignumber.js'; - -import { - BlockNumber, - Condition, - DeriveObject, - Derive, - FilterObject, - FilterOptions, - Options, - Topic -} from '../types'; -import { isArray, isHex, isInstanceOf, isString } from '../util/types'; -import { padLeft, toHex } from '../util/format'; -import { SerializedCondition, SerializedTransaction } from './types.serialized'; - -/** - * Validate input address. - * - * @param address - Input address to validate. - */ -export const inAddress = (address?: string) => { - // TODO: address validation if we have upper-lower addresses - return inHex(address); -}; - -/** - * Validate input addresses. - * - * @param addresses - Input addresses to validate. - */ -export const inAddresses = (addresses?: (string | undefined)[]) => { - return (addresses || []).map(inAddress); -}; - -export const inBlockNumber = (blockNumber?: BlockNumber) => { - if (isString(blockNumber)) { - switch (blockNumber) { - case 'earliest': - case 'latest': - case 'pending': - return blockNumber; - } - } - - return inNumber16(blockNumber); -}; - -export const inData = (data: string) => { - if (data && data.length && !isHex(data)) { - data = data - .split('') - .map(chr => `0${chr.charCodeAt(0).toString(16)}`.slice(-2)) - .join(''); - } - - return inHex(data); -}; - -export const inHash = (hash: string) => { - return inHex(hash); -}; - -export const inTopics = (topics?: (Topic | Topic[])[]): (string | null)[] => { - if (!topics) { - return [] as string[]; - } - - // @ts-ignore I don't want to deal with resursive nested arrays - // TODO https://stackoverflow.com/questions/52638149/recursive-nested-array-type-can-it-be-done - return topics - .filter((topic: Topic | Topic[]) => topic === null || topic) - .map((topic: Topic | Topic[]) => { - if (topic === null) { - return null; - } - - if (Array.isArray(topic)) { - return inTopics(topic); - } - - return padLeft(topic, 32); - }); -}; - -export const inFilter = (options: FilterOptions) => { - const result: { - [key in keyof FilterOptions]: number | string | string[] | Topic[] - } = {}; - - if (options) { - Object.keys(options).forEach(key => { - switch (key) { - case 'address': - if (isArray(options[key])) { - result[key] = (options[key] as string[]).map(inAddress); - } else { - result[key] = inAddress(options[key] as string); - } - break; - - case 'fromBlock': - case 'toBlock': - result[key] = inBlockNumber(options[key]); - break; - - case 'limit': - result[key] = inNumber10(options[key]); - break; - - case 'topics': - result[key] = inTopics(options[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = options[key]; - } - }); - } - - return result; -}; - -export const inHex = (str?: string) => toHex(str); - -export const inNumber10 = (n?: BlockNumber) => { - if (isInstanceOf(n, BigNumber)) { - return (n as BigNumber).toNumber(); - } - - return new BigNumber(n || 0).toNumber(); -}; - -export const inNumber16 = (n?: BlockNumber) => { - const bn = isInstanceOf(n, BigNumber) - ? (n as BigNumber) - : new BigNumber(n || 0); - - if (!bn.isInteger()) { - throw new Error( - `[format/input::inNumber16] the given number is not an integer: ${bn.toFormat()}` - ); - } - - return inHex(bn.toString(16)); -}; - -export const inOptionsCondition = (condition?: Condition | null) => { - if (condition) { - return { - block: condition.block ? inNumber10(condition.block) : null, - time: condition.time - ? inNumber10(Math.floor(condition.time.getTime() / 1000)) - : null - } as SerializedCondition; - } - - return null; -}; - -export const inOptions = (_options: Options = {}) => { - const options = Object.assign({}, _options); - - const result: SerializedTransaction = {}; - - Object.keys(options).forEach(key => { - switch (key) { - case 'to': - // Don't encode the `to` option if it's empty - // (eg. contract deployments) - if (options[key]) { - result.to = inAddress(options[key]); - } - break; - - case 'from': - result[key] = inAddress(options[key]); - break; - - case 'condition': - result[key] = inOptionsCondition(options[key]); - break; - - case 'gas': - case 'gasPrice': - result[key] = inNumber16( - new BigNumber(options[key] as BigNumber) // TODO Round number - ); - break; - - case 'value': - case 'nonce': - result[key] = inNumber16(options[key]); - break; - - case 'data': - result[key] = inData(options[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = options[key]; - } - }); - - return result; -}; - -export const inTraceFilter = (filterObject: FilterObject) => { - const result: { [key in keyof FilterObject]: string | string[] } = {}; - - if (filterObject) { - Object.keys(filterObject).forEach(key => { - switch (key) { - case 'fromAddress': - case 'toAddress': - result[key] = ([] as string[]) - .concat(filterObject[key] as string) - .map(address => inAddress(address)); - break; - - case 'toBlock': - case 'fromBlock': - result[key] = inBlockNumber(filterObject[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = options[key]; - } - }); - } - - return result; -}; - -export const inTraceType = (whatTrace: string | string[]) => { - if (isString(whatTrace)) { - return [whatTrace]; - } - - return whatTrace; -}; - -export const inDeriveType = (derive?: Derive) => { - return derive && (derive as DeriveObject).type === 'hard' ? 'hard' : 'soft'; -}; - -export const inDeriveHash = (derive?: Derive | string) => { - const hash = - derive && (derive as DeriveObject).hash - ? (derive as DeriveObject).hash - : (derive as string); - const type = inDeriveType(derive as Derive); - - return { - hash: inHex(hash as string), - type - }; -}; - -export const inDeriveIndex = (derive: Derive | Derive[]) => { - if (!derive) { - return []; - } - - const deriveAsArray: Derive[] = isArray(derive) ? derive : [derive]; - - return deriveAsArray.map(item => { - const index = inNumber10( - item && (item as DeriveObject).index - ? (item as DeriveObject).index - : (item as number) - ); - - return { - index, - type: inDeriveType(item) - }; - }); -}; diff --git a/packages/api/src/format/output.js b/packages/api/src/format/output.js new file mode 100644 index 00000000..4c050d0c --- /dev/null +++ b/packages/api/src/format/output.js @@ -0,0 +1,463 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const BigNumber = require('bignumber.js'); + +const { toChecksumAddress } = require('@parity/abi/lib/util/address'); + +const { isString } = require('../util/types'); + +function outAccountInfo (infos) { + return Object + .keys(infos) + .reduce((ret, _address) => { + const info = infos[_address]; + const address = outAddress(_address); + + ret[address] = { + name: info.name + }; + + if (info.meta) { + ret[address].uuid = info.uuid; + try { + ret[address].meta = JSON.parse(info.meta); + } catch (e) { + console.error(`Couldn't parse meta field of JSON key file ${info.uuid}`); + } + } + + return ret; + }, {}); +} + +function outAddress (address) { + return toChecksumAddress(address); +} + +function outAddresses (addresses) { + return (addresses || []).map(outAddress); +} + +function outBlock (block) { + if (block) { + Object.keys(block).forEach((key) => { + switch (key) { + case 'author': + case 'miner': + block[key] = outAddress(block[key]); + break; + + case 'difficulty': + case 'gasLimit': + case 'gasUsed': + case 'nonce': + case 'number': + case 'totalDifficulty': + block[key] = outNumber(block[key]); + break; + + case 'timestamp': + block[key] = outDate(block[key]); + break; + } + }); + } + + return block; +} + +function outChainStatus (status) { + if (status) { + Object.keys(status).forEach((key) => { + switch (key) { + case 'blockGap': + status[key] = status[key] + ? status[key].map(outNumber) + : status[key]; + break; + } + }); + } + + return status; +} + +function outDate (date) { + if (typeof date.toISOString === 'function') { + return date; + } + + try { + if (typeof date === 'string' && (new Date(date)).toISOString() === date) { + return new Date(date); + } + } catch (error) {} + + return new Date(outNumber(date).toNumber() * 1000); +} + +function outHistogram (histogram) { + if (histogram) { + Object.keys(histogram).forEach((key) => { + switch (key) { + case 'bucketBounds': + case 'counts': + histogram[key] = histogram[key].map(outNumber); + break; + } + }); + } + + return histogram; +} + +function outLog (log) { + Object.keys(log).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'logIndex': + case 'transactionIndex': + log[key] = outNumber(log[key]); + break; + + case 'address': + log[key] = outAddress(log[key]); + break; + } + }); + + return log; +} + +function outHwAccountInfo (infos) { + return Object + .keys(infos) + .reduce((ret, _address) => { + const address = outAddress(_address); + + ret[address] = infos[_address]; + + return ret; + }, {}); +} + +function outNodeKind (info) { + return info; +} + +function outNumber (number) { + return new BigNumber(number || 0); +} + +function outPeer (peer) { + const protocols = Object.keys(peer.protocols) + .reduce((obj, key) => { + if (peer.protocols[key]) { + obj[key] = Object.assign({}, peer.protocols[key], { + difficulty: outNumber(peer.protocols[key].difficulty) + }); + } + + return obj; + }, {}); + + return Object.assign({}, peer, { + protocols + }); +} + +function outPeers (peers) { + return { + active: outNumber(peers.active), + connected: outNumber(peers.connected), + max: outNumber(peers.max), + peers: peers.peers.map((peer) => outPeer(peer)) + }; +} + +function outPrivateReceipt (receipt) { + if (receipt) { + Object.keys(receipt).forEach((key) => { + switch (key) { + case 'status': + receipt[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + receipt[key] = outAddress(receipt[key]); + break; + } + }); + } + + return receipt; +} + +function outReceipt (receipt) { + if (receipt) { + Object.keys(receipt).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'cumulativeGasUsed': + case 'gasUsed': + case 'transactionIndex': + receipt[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + receipt[key] = outAddress(receipt[key]); + break; + } + }); + } + + return receipt; +} + +function outRecentDapps (recentDapps) { + if (recentDapps) { + Object.keys(recentDapps).forEach((url) => { + recentDapps[url] = outDate(recentDapps[url]); + }); + } + + return recentDapps; +} + +function outSignerRequest (request) { + if (request) { + Object.keys(request).forEach((key) => { + switch (key) { + case 'id': + request[key] = outNumber(request[key]); + break; + + case 'payload': + request[key].decrypt = outSigningPayload(request[key].decrypt); + request[key].sign = outSigningPayload(request[key].sign); + request[key].signTransaction = outTransaction(request[key].signTransaction); + request[key].sendTransaction = outTransaction(request[key].sendTransaction); + break; + + case 'origin': + const type = Object.keys(request[key])[0]; + const details = request[key][type]; + + request[key] = { type, details }; + break; + } + }); + } + + return request; +} + +function outSyncing (syncing) { + if (syncing && syncing !== 'false') { + Object.keys(syncing).forEach((key) => { + switch (key) { + case 'currentBlock': + case 'highestBlock': + case 'startingBlock': + case 'warpChunksAmount': + case 'warpChunksProcessed': + syncing[key] = outNumber(syncing[key]); + break; + + case 'blockGap': + syncing[key] = syncing[key] ? syncing[key].map(outNumber) : syncing[key]; + break; + } + }); + } + + return syncing; +} + +function outTransactionCondition (condition) { + if (condition) { + if (condition.block) { + condition.block = outNumber(condition.block); + } else if (condition.time) { + condition.time = outDate(condition.time); + } + } + + return condition; +} + +function outTransaction (tx) { + if (tx) { + Object.keys(tx).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'gasPrice': + case 'gas': + case 'nonce': + case 'transactionIndex': + case 'value': + tx[key] = outNumber(tx[key]); + break; + + case 'condition': + tx[key] = outTransactionCondition(tx[key]); + break; + + case 'creates': + case 'from': + case 'to': + tx[key] = outAddress(tx[key]); + break; + } + }); + } + + return tx; +} + +function outSigningPayload (payload) { + if (payload) { + Object.keys(payload).forEach((key) => { + switch (key) { + case 'address': + payload[key] = outAddress(payload[key]); + break; + } + }); + } + + return payload; +} + +function outTrace (trace) { + if (trace) { + if (trace.action) { + Object.keys(trace.action).forEach(key => { + switch (key) { + case 'gas': + case 'value': + case 'balance': + trace.action[key] = outNumber(trace.action[key]); + break; + + case 'from': + case 'to': + case 'address': + case 'refundAddress': + trace.action[key] = outAddress(trace.action[key]); + break; + } + }); + } + + if (trace.result) { + Object.keys(trace.result).forEach(key => { + switch (key) { + case 'gasUsed': + trace.result[key] = outNumber(trace.result[key]); + break; + + case 'address': + trace.action[key] = outAddress(trace.action[key]); + break; + } + }); + } + + if (trace.traceAddress) { + trace.traceAddress.forEach((address, index) => { + trace.traceAddress[index] = outNumber(address); + }); + } + + Object.keys(trace).forEach((key) => { + switch (key) { + case 'subtraces': + case 'transactionPosition': + case 'blockNumber': + trace[key] = outNumber(trace[key]); + break; + } + }); + } + + return trace; +} + +function outTraces (traces) { + if (traces) { + return traces.map(outTrace); + } + + return traces; +} + +function outTraceReplay (trace) { + if (trace) { + Object.keys(trace).forEach((key) => { + switch (key) { + case 'trace': + trace[key] = outTraces(trace[key]); + break; + } + }); + } + + return trace; +} + +function outVaultMeta (meta) { + if (isString(meta)) { + try { + const obj = JSON.parse(meta); + + return obj; + } catch (error) { + return {}; + } + } + + return meta || {}; +} + +module.exports = { + outAccountInfo, + outAddress, + outAddresses, + outBlock, + outChainStatus, + outDate, + outHistogram, + outLog, + outHwAccountInfo, + outNodeKind, + outNumber, + outPeer, + outPeers, + outPrivateReceipt, + outReceipt, + outRecentDapps, + outSignerRequest, + outSyncing, + outTransactionCondition, + outTransaction, + outSigningPayload, + outTrace, + outTraces, + outTraceReplay, + outVaultMeta +}; diff --git a/packages/api/src/format/output.spec.js b/packages/api/src/format/output.spec.js new file mode 100644 index 00000000..ec0bc2af --- /dev/null +++ b/packages/api/src/format/output.spec.js @@ -0,0 +1,504 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/* eslint-disable no-unused-expressions */ + +const BigNumber = require('bignumber.js'); + +const { outBlock, outAccountInfo, outAddress, outChainStatus, outDate, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeer, outPeers, outReceipt, outRecentDapps, outSyncing, outTransaction, outTrace, outVaultMeta } = require('./output'); +const { isAddress, isBigNumber, isInstanceOf } = require('../../test/types'); + +describe('format/output', () => { + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + + describe('outAccountInfo', () => { + it('returns meta objects parsed', () => { + expect(outAccountInfo( + { '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: '{"name":"456"}' } + } + )).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: { name: '456' } + } + }); + }); + + it('returns objects without meta & uuid as required', () => { + expect(outAccountInfo( + { '0x63cf90d3f0410092fc0fca41846f596223979195': { name: 'name' } } + )).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name' } + }); + }); + }); + + describe('outAddress', () => { + it('retuns the address as checksummed', () => { + expect(outAddress(address)).to.equal(checksum); + }); + + it('retuns the checksum as checksummed', () => { + expect(outAddress(checksum)).to.equal(checksum); + }); + }); + + describe('outBlock', () => { + ['author', 'miner'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = outBlock(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['difficulty', 'gasLimit', 'gasUsed', 'number', 'nonce', 'totalDifficulty'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = outBlock(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + ['timestamp'].forEach((input) => { + it(`formats ${input} number as Date`, () => { + const block = {}; + + block[input] = 0x57513668; + const formatted = outBlock(block)[input]; + + expect(isInstanceOf(formatted, Date)).to.be.true; + expect(formatted.getTime()).to.equal(1464940136000); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outBlock({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a block with all the info converted', () => { + expect( + outBlock({ + author: address, + miner: address, + difficulty: '0x100', + gasLimit: '0x101', + gasUsed: '0x102', + number: '0x103', + nonce: '0x104', + totalDifficulty: '0x105', + timestamp: '0x57513668', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + author: checksum, + miner: checksum, + difficulty: new BigNumber('0x100'), + gasLimit: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + number: new BigNumber('0x103'), + nonce: new BigNumber('0x104'), + totalDifficulty: new BigNumber('0x105'), + timestamp: new Date('2016-06-03T07:48:56.000Z'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outChainStatus', () => { + it('formats blockGap values', () => { + const status = { + blockGap: [0x1234, '0x5678'] + }; + + expect(outChainStatus(status)).to.deep.equal({ + blockGap: [new BigNumber(0x1234), new BigNumber(0x5678)] + }); + }); + + it('handles null blockGap values', () => { + const status = { + blockGap: null + }; + + expect(outChainStatus(status)).to.deep.equal(status); + }); + }); + + describe('outDate', () => { + it('converts a second date in unix timestamp', () => { + expect(outDate(0x57513668)).to.deep.equal(new Date('2016-06-03T07:48:56.000Z')); + }); + }); + + describe('outHistogram', () => { + ['bucketBounds', 'counts'].forEach((type) => { + it(`formats ${type} as number arrays`, () => { + expect( + outHistogram({ [type]: [0x123, 0x456, 0x789] }) + ).to.deep.equal({ + [type]: [new BigNumber(0x123), new BigNumber(0x456), new BigNumber(0x789)] + }); + }); + }); + }); + + describe('outHwAccountInfo', () => { + it('returns objects with formatted addresses', () => { + expect(outHwAccountInfo( + { '0x63cf90d3f0410092fc0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } } + )).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } + }); + }); + }); + + describe('outNodeKind', () => { + it('formats the input as received', () => { + const kind = { availability: 'personal', capability: 'full' }; + + expect(outNodeKind(kind)).to.deep.equal(kind); + }); + }); + + describe('outNumber', () => { + it('returns a BigNumber equalling the value', () => { + const bn = outNumber('0x123456'); + + expect(isBigNumber(bn)).to.be.true; + expect(bn.eq(0x123456)).to.be.true; + }); + + it('assumes 0 when ivalid input', () => { + expect(outNumber().eq(0)).to.be.true; + }); + }); + + describe('outPeer', () => { + it('converts all internal numbers to BigNumbers', () => { + expect(outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + } + } + })).to.deep.equal({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: new BigNumber(15), + head: '0x02', + version: 63 + } + } + }); + }); + + it('does not output null protocols', () => { + expect(outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + les: null + } + })).to.deep.equal({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: {} + }); + }); + }); + + describe('outPeers', () => { + it('converts all internal numbers to BigNumbers', () => { + expect(outPeers({ + active: 789, + connected: '456', + max: 0x7b, + peers: [ + { + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + }, + les: null + } + } + ] + })).to.deep.equal({ + active: new BigNumber(789), + connected: new BigNumber(456), + max: new BigNumber(123), + peers: [ + { + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: new BigNumber(15), + head: '0x02', + version: 63 + } + } + } + ] + }); + }); + }); + + describe('outReceipt', () => { + ['contractAddress'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = outReceipt(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['blockNumber', 'cumulativeGasUsed', 'cumulativeGasUsed', 'gasUsed', 'transactionIndex'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = outReceipt(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outReceipt({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a receipt with all the info converted', () => { + expect( + outReceipt({ + contractAddress: address, + blockNumber: '0x100', + cumulativeGasUsed: '0x101', + gasUsed: '0x102', + transactionIndex: '0x103', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + contractAddress: checksum, + blockNumber: new BigNumber('0x100'), + cumulativeGasUsed: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + transactionIndex: new BigNumber('0x103'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outRecentDapps', () => { + it('formats the URLs with timestamps', () => { + expect(outRecentDapps({ testing: 0x57513668 })).to.deep.equal({ + testing: new Date('2016-06-03T07:48:56.000Z') + }); + }); + }); + + describe('outSyncing', () => { + ['currentBlock', 'highestBlock', 'startingBlock', 'warpChunksAmount', 'warpChunksProcessed'].forEach((input) => { + it(`formats ${input} numbers as a number`, () => { + expect(outSyncing({ [input]: '0x123' })).to.deep.equal({ + [input]: new BigNumber('0x123') + }); + }); + }); + + it('formats blockGap properly', () => { + expect(outSyncing({ blockGap: [0x123, 0x456] })).to.deep.equal({ + blockGap: [new BigNumber(0x123), new BigNumber(0x456)] + }); + }); + }); + + describe('outTransaction', () => { + ['from', 'to'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = outTransaction(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['blockNumber', 'gasPrice', 'gas', 'nonce', 'transactionIndex', 'value'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = outTransaction(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + it('passes condition as null when null', () => { + expect(outTransaction({ condition: null })).to.deep.equal({ condition: null }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outTransaction({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a transaction with all the info converted', () => { + expect( + outTransaction({ + from: address, + to: address, + blockNumber: '0x100', + gasPrice: '0x101', + gas: '0x102', + nonce: '0x103', + transactionIndex: '0x104', + value: '0x105', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + from: checksum, + to: checksum, + blockNumber: new BigNumber('0x100'), + gasPrice: new BigNumber('0x101'), + gas: new BigNumber('0x102'), + nonce: new BigNumber('0x103'), + transactionIndex: new BigNumber('0x104'), + value: new BigNumber('0x105'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outTrace', () => { + it('ignores and passes through unknown keys', () => { + expect(outTrace({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a trace with all the info converted', () => { + const formatted = outTrace({ + type: 'call', + action: { + from: address, + to: address, + value: '0x06', + gas: '0x07', + input: '0x1234', + callType: 'call' + }, + result: { + gasUsed: '0x08', + output: '0x5678' + }, + traceAddress: [ '0x2' ], + subtraces: 3, + transactionPosition: '0xb', + transactionHash: '0x000000000000000000000000000000000000000000000000000000000000000c', + blockNumber: '0x0d', + blockHash: '0x000000000000000000000000000000000000000000000000000000000000000e' + }); + + expect(isBigNumber(formatted.action.gas)).to.be.true; + expect(formatted.action.gas.toNumber()).to.equal(7); + expect(isBigNumber(formatted.action.value)).to.be.true; + expect(formatted.action.value.toNumber()).to.equal(6); + + expect(formatted.action.from).to.equal(checksum); + expect(formatted.action.to).to.equal(checksum); + + expect(isBigNumber(formatted.blockNumber)).to.be.true; + expect(formatted.blockNumber.toNumber()).to.equal(13); + expect(isBigNumber(formatted.transactionPosition)).to.be.true; + expect(formatted.transactionPosition.toNumber()).to.equal(11); + }); + }); + + describe('outVaultMeta', () => { + it('returns an exmpt object on null', () => { + expect(outVaultMeta(null)).to.deep.equal({}); + }); + + it('returns the original value if not string', () => { + expect(outVaultMeta({ test: 123 })).to.deep.equal({ test: 123 }); + }); + + it('returns an object from JSON string', () => { + expect(outVaultMeta('{"test":123}')).to.deep.equal({ test: 123 }); + }); + + it('returns an empty object on invalid JSON', () => { + expect(outVaultMeta('{"test"}')).to.deep.equal({}); + }); + }); +}); diff --git a/packages/api/src/format/output.spec.ts b/packages/api/src/format/output.spec.ts deleted file mode 100644 index 119ac5fa..00000000 --- a/packages/api/src/format/output.spec.ts +++ /dev/null @@ -1,587 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import BigNumber from 'bignumber.js'; -import { isAddress } from '@parity/abi/lib/util/address'; -import { isInstanceOf } from '@parity/abi/lib/util/types'; - -import { Block, Receipt } from '../types'; -import { - outBlock, - outAccountInfo, - outAddress, - outChainStatus, - outDate, - outHistogram, - outHwAccountInfo, - outNodeKind, - outNumber, - outPeer, - outPeers, - outReceipt, - outSyncing, - outTransaction, - outTrace, - outVaultMeta -} from './output'; -import { - SerializedBlock, - SerializedReceipt, - SerializedTransaction -} from './types.serialized'; - -describe('format/output', () => { - const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; - const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; - - describe('outAccountInfo', () => { - it('returns meta objects parsed', () => { - expect( - outAccountInfo({ - '0x63cf90d3f0410092fc0fca41846f596223979195': { - name: 'name', - uuid: 'uuid', - meta: '{"name":"456"}' - } - }) - ).toEqual({ - '0x63Cf90D3f0410092FC0fca41846f596223979195': { - name: 'name', - uuid: 'uuid', - meta: { name: '456' } - } - }); - }); - - it('returns objects without meta & uuid as required', () => { - expect( - outAccountInfo({ - '0x63cf90d3f0410092fc0fca41846f596223979195': { name: 'name' } - }) - ).toEqual({ - '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name' } - }); - }); - }); - - describe('outAddress', () => { - it('retuns the address as checksummed', () => { - expect(outAddress(address)).toEqual(checksum); - }); - - it('retuns the checksum as checksummed', () => { - expect(outAddress(checksum)).toEqual(checksum); - }); - }); - - describe('outBlock', () => { - ['author', 'miner'].forEach(input => { - it(`formats ${input} address as address`, () => { - const block: SerializedBlock = {}; - - block[input as keyof SerializedBlock] = address; - const formatted = outBlock(block)[input as keyof Block]; - - expect(isAddress(formatted as string)).toBe(true); - expect(formatted).toEqual(checksum); - }); - }); - - [ - 'difficulty', - 'gasLimit', - 'gasUsed', - 'number', - 'nonce', - 'totalDifficulty' - ].forEach(input => { - it(`formats ${input} number as hexnumber`, () => { - const block: SerializedBlock = {}; - - block[input as keyof SerializedBlock] = 0x123; - const formatted = outBlock(block)[input as keyof Block]; - - expect(isInstanceOf(formatted, BigNumber)).toBe(true); - // @ts-ignore - expect(formatted.toString(16)).toEqual('123'); - }); - }); - - ['timestamp'].forEach(input => { - it(`formats ${input} number as Date`, () => { - const block: SerializedBlock = {}; - - block[input as keyof SerializedBlock] = 0x57513668; - const formatted = outBlock(block)[input as keyof Block]; - - expect(isInstanceOf(formatted, Date)).toBe(true); - expect((formatted as Date).getTime()).toEqual(1464940136000); - }); - }); - - it('ignores and passes through unknown keys', () => { - expect(outBlock({ someRandom: 'someRandom' } as any)).toEqual({ - someRandom: 'someRandom' - }); - }); - - it('formats a block with all the info converted', () => { - expect( - outBlock({ - author: address, - miner: address, - difficulty: '0x100', - gasLimit: '0x101', - gasUsed: '0x102', - number: '0x103', - nonce: '0x104', - totalDifficulty: '0x105', - timestamp: '0x57513668', - extraData: 'someExtraStuffInHere' - }) - ).toEqual({ - author: checksum, - miner: checksum, - difficulty: new BigNumber('0x100'), - gasLimit: new BigNumber('0x101'), - gasUsed: new BigNumber('0x102'), - number: new BigNumber('0x103'), - nonce: new BigNumber('0x104'), - totalDifficulty: new BigNumber('0x105'), - timestamp: new Date('2016-06-03T07:48:56.000Z'), - extraData: 'someExtraStuffInHere' - }); - }); - }); - - describe('outChainStatus', () => { - it('formats blockGap values', () => { - const status = { - blockGap: [0x1234, '0x5678'] - }; - - expect(outChainStatus(status)).toEqual({ - blockGap: [new BigNumber(0x1234), new BigNumber(0x5678)] - }); - }); - - it('handles null blockGap values', () => { - const status = { - blockGap: undefined - }; - - expect(outChainStatus(status)).toEqual(status); - }); - }); - - describe('outDate', () => { - it('converts a second date in unix timestamp', () => { - expect(outDate(0x57513668)).toEqual(new Date('2016-06-03T07:48:56.000Z')); - }); - }); - - describe('outHistogram', () => { - ['bucketBounds', 'counts'].forEach(type => { - it(`formats ${type} as number arrays`, () => { - expect(outHistogram({ [type]: [0x123, 0x456, 0x789] })).toEqual({ - [type]: [ - new BigNumber(0x123), - new BigNumber(0x456), - new BigNumber(0x789) - ] - }); - }); - }); - }); - - describe('outHwAccountInfo', () => { - it('returns objects with formatted addresses', () => { - expect( - outHwAccountInfo({ - '0x63cf90d3f0410092fc0fca41846f596223979195': { - manufacturer: 'mfg', - name: 'type' - } - }) - ).toEqual({ - '0x63Cf90D3f0410092FC0fca41846f596223979195': { - manufacturer: 'mfg', - name: 'type' - } - }); - }); - }); - - describe('outNodeKind', () => { - it('formats the input as received', () => { - const kind = { availability: 'personal', capability: 'full' }; - - expect(outNodeKind(kind)).toEqual(kind); - }); - }); - - describe('outNumber', () => { - it('returns a BigNumber equalling the value', () => { - const bn = outNumber('0x123456'); - - expect(isInstanceOf(bn, BigNumber)).toBe(true); - expect(bn.eq(0x123456)).toBe(true); - }); - - it('assumes 0 when ivalid input', () => { - expect(outNumber().eq(0)).toBe(true); - }); - }); - - describe('outPeer', () => { - it('converts all internal numbers to BigNumbers', () => { - expect( - outPeer({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: '0x0f', - head: '0x02', - version: 63 - } - } - }) - ).toEqual({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: new BigNumber(15), - head: '0x02', - version: 63 - } - } - }); - }); - - it('does not output null protocols', () => { - expect( - outPeer({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - les: null - } - }) - ).toEqual({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: {} - }); - }); - }); - - describe('outPeers', () => { - it('converts all internal numbers to BigNumbers', () => { - expect( - outPeers({ - active: 789, - connected: '456', - max: 0x7b, - peers: [ - { - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: '0x0f', - head: '0x02', - version: 63 - }, - les: null - } - } - ] - }) - ).toEqual({ - active: new BigNumber(789), - connected: new BigNumber(456), - max: new BigNumber(123), - peers: [ - { - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: new BigNumber(15), - head: '0x02', - version: 63 - } - } - } - ] - }); - }); - }); - - describe('outReceipt', () => { - ['contractAddress'].forEach(input => { - it(`formats ${input} address as address`, () => { - const block: SerializedReceipt = {}; - - block[input as keyof SerializedReceipt] = address; - const formatted = outReceipt(block)[input as keyof Receipt]; - - expect(isAddress(formatted as string)).toBe(true); - expect(formatted).toEqual(checksum); - }); - }); - - [ - 'blockNumber', - 'cumulativeGasUsed', - 'cumulativeGasUsed', - 'gasUsed', - 'transactionIndex' - ].forEach(input => { - it(`formats ${input} number as hexnumber`, () => { - const block: SerializedReceipt = {}; - - block[input as keyof SerializedReceipt] = 0x123; - const formatted = outReceipt(block)[input as keyof Receipt]; - - expect(isInstanceOf(formatted, BigNumber)).toBe(true); - // @ts-ignore - expect(formatted.toString(16)).toEqual('123'); - }); - }); - - it('ignores and passes through unknown keys', () => { - // @ts-ignore - expect(outReceipt({ someRandom: 'someRandom' })).toEqual({ - someRandom: 'someRandom' - }); - }); - - it('formats a receipt with all the info converted', () => { - expect( - outReceipt({ - contractAddress: address, - blockNumber: '0x100', - cumulativeGasUsed: '0x101', - gasUsed: '0x102', - transactionIndex: '0x103', - extraData: 'someExtraStuffInHere' - }) - ).toEqual({ - contractAddress: checksum, - blockNumber: new BigNumber('0x100'), - cumulativeGasUsed: new BigNumber('0x101'), - gasUsed: new BigNumber('0x102'), - transactionIndex: new BigNumber('0x103'), - extraData: 'someExtraStuffInHere' - }); - }); - }); - - describe('outSyncing', () => { - [ - 'currentBlock', - 'highestBlock', - 'startingBlock', - 'warpChunksAmount', - 'warpChunksProcessed' - ].forEach(input => { - it(`formats ${input} numbers as a number`, () => { - expect(outSyncing({ [input]: '0x123' })).toEqual({ - [input]: new BigNumber('0x123') - }); - }); - }); - - it('formats blockGap properly', () => { - expect(outSyncing({ blockGap: [0x123, 0x456] })).toEqual({ - blockGap: [new BigNumber(0x123), new BigNumber(0x456)] - }); - }); - }); - - describe('outTransaction', () => { - ['from', 'to'].forEach(input => { - it(`formats ${input} address as address`, () => { - const block: SerializedTransaction = {}; - - block[input as keyof SerializedTransaction] = address; - const formatted = outTransaction(block)[ - input as keyof SerializedTransaction - ]; - - expect(isAddress(formatted as string)).toBe(true); - expect(formatted).toEqual(checksum); - }); - }); - - [ - 'blockNumber', - 'gasPrice', - 'gas', - 'nonce', - 'transactionIndex', - 'value' - ].forEach(input => { - it(`formats ${input} number as hexnumber`, () => { - const block: SerializedTransaction = {}; - - block[input as keyof SerializedTransaction] = 0x123; - const formatted = outTransaction(block)[ - input as keyof SerializedTransaction - ]; - - expect(isInstanceOf(formatted, BigNumber)).toBe(true); - // @ts-ignore - expect(formatted.toString(16)).toEqual('123'); - }); - }); - - it('passes condition as null when null', () => { - expect(outTransaction({ condition: null })).toEqual({ condition: null }); - }); - - it('ignores and passes through unknown keys', () => { - // @ts-ignore - expect(outTransaction({ someRandom: 'someRandom' })).toEqual({ - someRandom: 'someRandom' - }); - }); - - it('formats a transaction with all the info converted', () => { - expect( - outTransaction({ - from: address, - to: address, - blockNumber: '0x100', - gasPrice: '0x101', - gas: '0x102', - nonce: '0x103', - transactionIndex: '0x104', - value: '0x105', - extraData: 'someExtraStuffInHere' - }) - ).toEqual({ - from: checksum, - to: checksum, - blockNumber: new BigNumber('0x100'), - gasPrice: new BigNumber('0x101'), - gas: new BigNumber('0x102'), - nonce: new BigNumber('0x103'), - transactionIndex: new BigNumber('0x104'), - value: new BigNumber('0x105'), - extraData: 'someExtraStuffInHere' - }); - }); - }); - - describe('outTrace', () => { - it('ignores and passes through unknown keys', () => { - // @ts-ignore - expect(outTrace({ someRandom: 'someRandom' })).toEqual({ - someRandom: 'someRandom' - }); - }); - - it('formats a trace with all the info converted', () => { - const formatted = outTrace({ - type: 'call', - action: { - from: address, - to: address, - value: '0x06', - gas: '0x07', - input: '0x1234', - callType: 'call' - }, - result: { - gasUsed: '0x08', - output: '0x5678' - }, - traceAddress: ['0x2'], - subtraces: 3, - transactionPosition: '0xb', - transactionHash: - '0x000000000000000000000000000000000000000000000000000000000000000c', - blockNumber: '0x0d', - blockHash: - '0x000000000000000000000000000000000000000000000000000000000000000e' - }); - - // @ts-ignore - expect(isInstanceOf(formatted.action.gas, BigNumber)).toBe(true); - // @ts-ignore - expect(formatted.action.gas.toNumber()).toEqual(7); - // @ts-ignore - expect(isInstanceOf(formatted.action.value, BigNumber)).toBe(true); - // @ts-ignore - expect(formatted.action.value.toNumber()).toEqual(6); - - // @ts-ignore - expect(formatted.action.from).toEqual(checksum); - // @ts-ignore - expect(formatted.action.to).toEqual(checksum); - - // @ts-ignore - expect(isInstanceOf(formatted.blockNumber, BigNumber)).toBe(true); - // @ts-ignore - expect(formatted.blockNumber.toNumber()).toEqual(13); - // @ts-ignore - expect(isInstanceOf(formatted.transactionPosition, BigNumber)).toBe(true); - // @ts-ignore - expect(formatted.transactionPosition.toNumber()).toEqual(11); - }); - }); - - describe('outVaultMeta', () => { - it('returns an exmpt object on null', () => { - expect(outVaultMeta(null)).toEqual({}); - }); - - it('returns the original value if not string', () => { - expect(outVaultMeta({ test: 123 })).toEqual({ test: 123 }); - }); - - it('returns an object from JSON string', () => { - expect(outVaultMeta('{"test":123}')).toEqual({ test: 123 }); - }); - - it('returns an empty object on invalid JSON', () => { - expect(outVaultMeta('{"test"}')).toEqual({}); - }); - }); -}); diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts deleted file mode 100644 index 974046bc..00000000 --- a/packages/api/src/format/output.ts +++ /dev/null @@ -1,556 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import BigNumber from 'bignumber.js'; -import { isString } from '@parity/abi/lib/util/types'; -import { toChecksumAddress } from '@parity/abi/lib/util/address'; - -import { - AccountInfo, - Block, - ChainStatus, - Condition, - Histogram, - HwAccountInfo, - Log, - NodeKind, - Peer, - PeerProtocolItem, - PeerProtocol, - Peers, - Receipt, - SignerRequest, - SigningPayload, - Syncing, - Trace, - TraceReplay, - Transaction, - VaultMeta -} from '../types'; -import { - SerializedAccountInfo, - SerializedBlock, - SerializedChainStatus, - SerializedCondition, - SerializedHistogram, - SerializedHwAccountInfo, - SerializedLog, - SerializedPeer, - SerializedPeers, - SerializedReceipt, - SerializedSignerRequest, - SerializedSigningPayload, - SerializedSyncing, - SerializedTrace, - SerializedTraceReplay, - SerializedTransaction, - SerializedVaultMeta, - SerializedNumber -} from './types.serialized'; - -export function outAccountInfo (infos: SerializedAccountInfo) { - return Object.keys(infos).reduce( - (ret, _address) => { - const info = infos[_address]; - const address = outAddress(_address); - - ret[address] = { - name: info.name - }; - - if (info.meta) { - ret[address].uuid = info.uuid; - try { - ret[address].meta = JSON.parse(info.meta); - } catch (e) { - console.error( - `Couldn't parse meta field of JSON key file ${info.uuid}` - ); - } - } - - return ret; - }, - {} as AccountInfo - ); -} - -export function outAddress (address?: string) { - return toChecksumAddress(address); -} - -export function outAddresses (addresses: string[]) { - return (addresses || []).map(outAddress); -} - -export function outBlock (block: SerializedBlock) { - const result: Block = {}; - - if (block) { - Object.keys(block).forEach(key => { - switch (key) { - case 'author': - case 'miner': - result[key] = outAddress(block[key]); - break; - - case 'difficulty': - case 'gasLimit': - case 'gasUsed': - case 'nonce': - case 'number': - case 'totalDifficulty': - result[key] = outNumber(block[key]); - break; - - case 'timestamp': - result[key] = outDate(block[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = block[key]; - } - }); - } - - return result; -} - -export function outChainStatus (status?: SerializedChainStatus) { - const result: ChainStatus = {}; - if (status) { - Object.keys(status).forEach(key => { - switch (key) { - case 'blockGap': - result[key] = status[key] - ? (status[key] as number[]).map(outNumber) - : undefined; - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = status[key]; - } - }); - } - - return result; -} - -export function outDate (date?: number | string | Date) { - if (date instanceof Date && typeof date.toISOString === 'function') { - return date; - } - - try { - if (typeof date === 'string' && new Date(date).toISOString() === date) { - return new Date(date); - } - } catch (error) { - /* Do nothing */ - } - - return new Date(outNumber(date as number).toNumber() * 1000); -} - -export function outHistogram (histogram: SerializedHistogram) { - const result: Histogram = {}; - if (histogram) { - Object.keys(histogram).forEach(key => { - switch (key) { - case 'bucketBounds': - case 'counts': - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result[key] = histogram[key].map(outNumber); - break; - } - }); - } - - return result; -} - -export function outLog (log: SerializedLog) { - const result: Log = {}; - Object.keys(log).forEach(key => { - switch (key) { - case 'blockNumber': - case 'logIndex': - case 'transactionIndex': - result[key] = outNumber(log[key]); - break; - - case 'address': - result[key] = outAddress(log[key]); - break; - } - }); - - return result; -} - -export function outHwAccountInfo (infos: SerializedHwAccountInfo) { - return Object.keys(infos).reduce( - (ret, _address) => { - const address = outAddress(_address); - - ret[address] = infos[_address]; - - return ret; - }, - {} as HwAccountInfo - ); -} - -export function outNodeKind (info: NodeKind) { - return info; -} - -export function outNumber (n?: SerializedNumber) { - return new BigNumber(n || 0); -} - -export function outPeer (peer: SerializedPeer) { - const protocols = Object.keys(peer.protocols).reduce( - (obj, key) => { - if (peer.protocols[key as PeerProtocol]) { - // @ts-ignore - obj[key as PeerProtocol] = Object.assign( - {}, - peer.protocols[key as PeerProtocol], - { - difficulty: outNumber( - // @ts-ignore "Object is possibly 'undefined'." No it's not. - peer.protocols[key as PeerProtocol].difficulty - ) - } - ); - } - - return obj; - }, - {} as { les?: PeerProtocolItem; par?: PeerProtocolItem } - ); - - return { - caps: peer.caps, - id: peer.id, - name: peer.name, - network: peer.network, - protocols - } as Peer; -} - -export function outPeers (peers: SerializedPeers) { - return { - active: outNumber(peers.active), - connected: outNumber(peers.connected), - max: outNumber(peers.max), - peers: peers.peers.map(peer => outPeer(peer)) - } as Peers; -} - -export function outPrivateReceipt (receipt: SerializedReceipt) { - const result: Receipt = {}; - if (receipt) { - Object.keys(receipt).forEach(key => { - switch (key) { - case 'status': - result[key] = outNumber(receipt[key]); - break; - - case 'contractAddress': - result[key] = outAddress(receipt[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = receipt[key]; - } - }); - } - - return result; -} - -export function outReceipt (receipt: SerializedReceipt) { - const result: Receipt = {}; - if (receipt) { - Object.keys(receipt).forEach(key => { - switch (key) { - case 'blockNumber': - case 'cumulativeGasUsed': - case 'gasUsed': - case 'transactionIndex': - result[key] = outNumber(receipt[key]); - break; - - case 'contractAddress': - result[key] = outAddress(receipt[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = receipt[key]; - } - }); - } - - return result; -} - -export function outSignerRequest (request: SerializedSignerRequest) { - const result: SignerRequest = {}; - - if (request) { - Object.keys(request).forEach(key => { - switch (key) { - case 'id': - result[key] = outNumber(request[key]); - break; - - case 'payload': - result[key] = {}; - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result[key].decrypt = outSigningPayload(request[key].decrypt); - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result[key].sign = outSigningPayload(request[key].sign); - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result[key].signTransaction = outTransaction( - // @ts-ignore "Object is possibly 'undefined'." No it's not. - request[key].signTransaction - ); - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result[key].sendTransaction = outTransaction( - // @ts-ignore "Object is possibly 'undefined'." No it's not. - request[key].sendTransaction - ); - break; - - case 'origin': - // @ts-ignore "Object is possibly 'undefined'." No it's not. - const type = Object.keys(result[key])[0]; - // @ts-ignore "Object is possibly 'undefined'." No it's not. - const details = result[key][type]; - - request[key] = { type, details }; - break; - } - }); - } - - return result; -} - -export function outSyncing (syncing: SerializedSyncing) { - const result: Syncing = {}; - - if (syncing && syncing !== 'false') { - Object.keys(syncing).forEach(key => { - switch (key) { - case 'currentBlock': - case 'highestBlock': - case 'startingBlock': - case 'warpChunksAmount': - case 'warpChunksProcessed': - result[key] = outNumber(syncing[key]); - break; - - case 'blockGap': - result[key] = syncing[key] - ? (syncing[key] as number[]).map(outNumber) - : undefined; - break; - } - }); - } - - return result; -} - -export function outTransactionCondition ( - condition?: SerializedCondition | null -) { - let result: Condition | null = null; - if (condition) { - result = {}; - if (condition.block) { - result.block = outNumber(condition.block); - } else if (condition.time) { - result.time = outDate(condition.time); - } - } - - return result; -} - -export function outTransaction (tx: SerializedTransaction) { - const result: Transaction = {}; - - if (tx) { - Object.keys(tx).forEach(key => { - switch (key) { - case 'blockNumber': - case 'gasPrice': - case 'gas': - case 'nonce': - case 'transactionIndex': - case 'value': - result[key] = outNumber(tx[key]); - break; - - case 'condition': - result[key] = outTransactionCondition(tx[key]); - break; - - case 'creates': - case 'from': - case 'to': - result[key] = outAddress(tx[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = tx[key]; - } - }); - } - - return result; -} - -export function outSigningPayload (payload: SerializedSigningPayload) { - const result: SigningPayload = {}; - if (payload) { - Object.keys(payload).forEach(key => { - switch (key) { - case 'address': - result[key] = outAddress(payload[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = payload[key]; - } - }); - } - - return payload; -} - -export function outTrace (trace: SerializedTrace) { - const result: Trace = {}; - if (trace) { - Object.keys(trace).forEach(key => { - switch (key) { - case 'subtraces': - case 'transactionPosition': - case 'blockNumber': - result[key] = outNumber(trace[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result[key] = trace[key]; - } - }); - - if (trace.action) { - result.action = {}; - Object.keys(trace.action).forEach(key => { - switch (key) { - case 'gas': - case 'value': - case 'balance': - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result.action[key] = outNumber(trace.action[key]); - break; - - case 'from': - case 'to': - case 'address': - case 'refundAddress': - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result.action[key] = outAddress(trace.action[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result.action[key] = trace.action[key]; - } - }); - } - - if (trace.result) { - result.result = {}; - Object.keys(trace.result).forEach(key => { - switch (key) { - case 'gasUsed': - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result.result[key] = outNumber(trace.result[key]); - break; - - case 'address': - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result.action[key] = outAddress(trace.action[key]); - break; - - default: - // @ts-ignore Here, we explicitly pass down extra keys, if they exist - result.result[key] = trace.result[key]; - } - }); - } - - if (trace.traceAddress) { - result.traceAddress = []; - trace.traceAddress.forEach((address, index) => { - // @ts-ignore "Object is possibly 'undefined'." No it's not. - result.traceAddress[index] = outNumber(address); - }); - } - } - - return result; -} - -export function outTraces (traces?: SerializedTrace[]) { - if (traces) { - return traces.map(outTrace); - } - - return traces; -} - -export function outTraceReplay (trace: SerializedTraceReplay) { - const result: TraceReplay = {}; - - if (trace) { - Object.keys(trace).forEach(key => { - switch (key) { - case 'trace': - result[key] = outTraces(trace[key]); - break; - } - }); - } - - return result; -} - -export function outVaultMeta (meta: SerializedVaultMeta) { - if (isString(meta)) { - try { - const obj = JSON.parse(meta); - - return obj as VaultMeta; - } catch (error) { - return {}; - } - } - - return meta || {}; -} diff --git a/packages/api/src/format/types.serialized.ts b/packages/api/src/format/types.serialized.ts deleted file mode 100644 index d64cd5f8..00000000 --- a/packages/api/src/format/types.serialized.ts +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -export type SerializedNumber = number | string; - -export interface SerializedAccountInfo { - [address: string]: { meta?: string; name: string; uuid?: string }; -} - -export interface SerializedBlock { - author?: string; - miner?: string; - difficulty?: string; - extraData?: string; - gasLimit?: string; - gasUsed?: string; - nonce?: string; - number?: string; - totalDifficulty?: string; - timestamp?: number | string; -} - -export type SerializedBlockGap = (string | number)[]; - -export interface SerializedChainStatus { - blockGap?: SerializedBlockGap | null; -} - -export type SerializedCondition = { - block?: SerializedNumber; - time?: SerializedNumber; -}; - -export interface SerializedHistogram { - bucketBounds?: number[]; - counts?: number[]; -} - -export interface SerializedHwAccountInfo { - [address: string]: { [key: string]: any }; -} - -export interface SerializedLog { - address: string; - blockNumber: SerializedNumber; - logIndex: SerializedNumber; - transactionIndex: SerializedNumber; -} - -export interface SerializedPeer { - caps?: string[]; - id?: string; - name?: string; - network?: { - localAddress: string; - remoteAddress: string; - }; - protocols: { - les?: { - difficulty: SerializedNumber; - head: SerializedNumber; - version: SerializedNumber; - } | null; - par?: { - difficulty: SerializedNumber; - head: SerializedNumber; - version: SerializedNumber; - } | null; - }; -} - -export interface SerializedPeers { - active: SerializedNumber; - connected: SerializedNumber; - max: SerializedNumber; - peers: SerializedPeer[]; -} - -export interface SerializedReceipt { - blockNumber?: SerializedNumber; - contractAddress?: string; - cumulativeGasUsed?: SerializedNumber; - extraData?: string; - gasUsed?: SerializedNumber; - transactionIndex?: SerializedNumber; - status?: SerializedNumber; -} - -export interface SerializedSignerRequest { - id?: SerializedNumber; - origin?: { - [index: string]: string; - }; - payload?: { - decrypt?: SerializedSigningPayload; - sign?: SerializedSigningPayload; - signTransaction?: SerializedTransaction; - sendTransaction?: SerializedTransaction; - }; -} - -export interface SerializedSigningPayload { - address?: string; -} - -export interface SerializedTrace { - action?: { - callType?: string; - gas?: SerializedNumber; - value?: SerializedNumber; - balance?: SerializedNumber; - from?: string; - input?: string; - to?: string; - address?: string; - refundAddress?: string; - }; - blockHash?: string; - blockNumber?: SerializedNumber; - result?: { - address?: string; - gasUsed?: SerializedNumber; - output?: string; - }; - traceAddress?: SerializedNumber[]; - subtraces?: SerializedNumber; - transactionHash?: string; - transactionPosition?: SerializedNumber; - type?: string; -} - -export interface SerializedTraceReplay { - trace?: SerializedTrace[]; -} - -export interface SerializedTransaction { - blockNumber?: SerializedNumber; - creates?: string; - extraData?: string; - to?: string; - from?: string; - condition?: SerializedCondition | null; - gas?: string; - gasPrice?: string; - transactionIndex?: SerializedNumber; - value?: string; - nonce?: string; - data?: string; -} - -export interface SerializedSyncing { - currentBlock?: SerializedNumber; - highestBlock?: SerializedNumber; - startingBlock?: SerializedNumber; - warpChunksAmount?: SerializedNumber; - warpChunksProcessed?: SerializedNumber; - blockGap?: SerializedBlockGap | null; -} - -export type SerializedVaultMeta = string | { [key: string]: any } | null; diff --git a/packages/api/src/polyfill.js b/packages/api/src/polyfill.js new file mode 100644 index 00000000..1d7ee6e1 --- /dev/null +++ b/packages/api/src/polyfill.js @@ -0,0 +1,23 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +if (typeof Promise === 'undefined') { + require('es6-promise').polyfill(); +} + +if (typeof fetch === 'undefined') { + require('isomorphic-fetch'); +} diff --git a/packages/api/src/provider/current.spec.js b/packages/api/src/provider/current.spec.js index 47bd1f27..42489cf6 100644 --- a/packages/api/src/provider/current.spec.js +++ b/packages/api/src/provider/current.spec.js @@ -28,7 +28,7 @@ function initProvider (sendAsync, isParity = false) { // eslint-disable-line sta describe('provider/Current', () => { describe('isParity', () => { it('returns the value of the embedded provider', () => { - expect(initProvider(null, true).isParity).toBe.true; + expect(initProvider(null, true).isParity).to.be.true; }); }); @@ -39,8 +39,8 @@ describe('provider/Current', () => { }; initProvider(sendAsync).send('method', ['params'], (error, payload) => { - expect(error).not.toBe.ok; - expect(payload).toEqual({ + expect(error).not.to.be.ok; + expect(payload).to.deep.equal({ id: 1, jsonrpc: '2.0', method: 'method', @@ -56,8 +56,8 @@ describe('provider/Current', () => { }); initProvider(sendAsync).send('', [], (error, result) => { - expect(error).not.toBe.ok; - expect(result).toEqual('xyz'); + expect(error).not.to.be.ok; + expect(result).to.equal('xyz'); done(); }); }); @@ -66,8 +66,8 @@ describe('provider/Current', () => { const sendAsync = (payload, callback) => callback(null, 'xyz'); initProvider(sendAsync).send('', [], (error, result) => { - expect(error).not.toBe.ok; - expect(result).toEqual('xyz'); + expect(error).not.to.be.ok; + expect(result).to.equal('xyz'); done(); }); }); @@ -78,7 +78,7 @@ describe('provider/Current', () => { }; initProvider(sendAsync).send('method', ['params'], (error, payload) => { - expect(error).toEqual('error'); + expect(error).to.equal('error'); done(); }); }); diff --git a/packages/api/src/provider/http.spec.js b/packages/api/src/provider/http.spec.js index b97284a7..b489a912 100644 --- a/packages/api/src/provider/http.spec.js +++ b/packages/api/src/provider/http.spec.js @@ -31,7 +31,7 @@ describe('provider/Http', () => { describe('isParity', () => { it('return true', () => { - expect(provider.isParity).toBe.true; + expect(provider.isParity).to.be.true; }); }); }); diff --git a/packages/api/src/provider/ipc.js b/packages/api/src/provider/ipc.js new file mode 100644 index 00000000..b43c1d4d --- /dev/null +++ b/packages/api/src/provider/ipc.js @@ -0,0 +1,173 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const EventEmitter = require('eventemitter3'); + +// https://github.com/electron/electron/issues/2288 +const IS_ELECTRON = !!(typeof window !== 'undefined' && window && window.process && window.process.type); + +let ipcRenderer; + +if (IS_ELECTRON) { + ipcRenderer = window.require('electron').ipcRenderer; +} + +const METHOD_REQUEST_TOKEN = 'shell_requestNewToken'; + +class Ipc extends EventEmitter { + constructor (appId) { + super(); + this._appId = appId; + + this.id = 0; + this._messages = {}; + this._queued = []; + + if (!IS_ELECTRON) { + throw new Error('IpcProvider must be used in Electron environment.'); + } + + ipcRenderer.on('PARITY_SHELL_IPC_CHANNEL', this.receiveMessage.bind(this)); + } + + _constructMessage (id, data) { + return Object.assign({}, data, { + id, + to: 'shell', + from: this._appId, + token: this._token + }); + } + + receiveMessage (_, { id, error, from, to, token, result }) { + const isTokenValid = token ? token === this._token : true; + + if (from !== 'shell' || to !== this._appId || !isTokenValid) { + return; + } + + if (this._messages[id].subscription) { + this._messages[id].initial + ? this._messages[id].resolve(result) + : this._messages[id].callback(error && new Error(error), result); + this._messages[id].initial = false; + } else { + this._messages[id].callback(error && new Error(error), result); + this._messages[id] = null; + } + } + + requestNewToken () { + return new Promise((resolve, reject) => { + // Webview is ready when receivin the ping + ipcRenderer.once('ping', () => { + this.send(METHOD_REQUEST_TOKEN, [], (error, token) => { + if (error) { + reject(error); + } else { + this.setToken(token); + resolve(token); + } + }); + }); + }); + } + + _send (message) { + if (!this._token && message.data.method !== METHOD_REQUEST_TOKEN) { + this._queued.push(message); + + return; + } + + const id = ++this.id; + const postMessage = this._constructMessage(id, message.data); + + this._messages[id] = Object.assign({}, postMessage, message.options); + + ipcRenderer.sendToHost('parity', { data: postMessage }); + } + + send (method, params, callback) { + this._send({ + data: { + method, + params + }, + options: { + callback + } + }); + } + + _sendQueued () { + if (!this._token) { + return; + } + + this._queued.forEach(this._send.bind(this)); + this._queued = []; + } + + setToken (token) { + if (token) { + this._connected = true; + this._token = token; + this.emit('connected'); + this._sendQueued(); + } + } + + subscribe (api, callback, params) { + return new Promise((resolve, reject) => { + this._send({ + data: { + api, + params + }, + options: { + callback, + resolve, + reject, + subscription: true, + initial: true + } + }); + }); + } + + // FIXME: Should return callback, not promise + unsubscribe (subId) { + return new Promise((resolve, reject) => { + this._send({ + data: { + subId + }, + options: { + callback: (error, result) => { + error ? reject(error) : resolve(result); + } + } + }); + }); + } + + unsubscribeAll () { + return this.unsubscribe('*'); + } +} + +module.exports = Ipc; diff --git a/packages/api/src/provider/ipc.spec.js b/packages/api/src/provider/ipc.spec.js new file mode 100644 index 00000000..3cfde4ea --- /dev/null +++ b/packages/api/src/provider/ipc.spec.js @@ -0,0 +1,29 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/* eslint-disable no-unused-expressions */ + +const IpcProvider = require('./ipc'); + +function createProvider () { + return new IpcProvider('ipc://test.com', '123', false); +} + +describe('provider/IpcProvider', () => { + it('throws error if not Electron', () => { + expect(createProvider).to.throw('IpcProvider must be used in Electron environment.'); + }); +}); diff --git a/packages/api/src/provider/postMessage.js b/packages/api/src/provider/postMessage.js new file mode 100644 index 00000000..fcc8a245 --- /dev/null +++ b/packages/api/src/provider/postMessage.js @@ -0,0 +1,171 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const EventEmitter = require('eventemitter3'); + +class PostMessage extends EventEmitter { + constructor (appId, destination, source) { + super(); + + this._appId = appId; + this._destination = destination || window.parent; + + this.id = 0; + this._connected = false; + this._messages = {}; + this._queued = []; + + this._receiveMessage = this._receiveMessage.bind(this); + this._send = this._send.bind(this); + this.send = this.send.bind(this); + this.subscribe = this.subscribe.bind(this); + this.unsubscribe = this.unsubscribe.bind(this); + + (source || window).addEventListener('message', this._receiveMessage, false); + } + + get isConnected () { + return this._connected; + } + + get isParity () { + return true; + } + + get queuedCount () { + return this._queued.length; + } + + setToken (token) { + if (token) { + this._connected = true; + this._token = token; + this.emit('connected'); + this._sendQueued(); + } + } + + addMiddleware () { + } + + _constructMessage (id, data) { + return Object.assign({}, data, { + id, + to: 'shell', + from: this._appId, + token: this._token + }); + } + + _send (message) { + if (!this._token) { + this._queued.push(message); + + return; + } + + const id = ++this.id; + const postMessage = this._constructMessage(id, message.data); + + this._messages[id] = Object.assign({}, postMessage, message.options); + this._destination.postMessage(postMessage, '*'); + } + + send (method, params, callback) { + this._send({ + data: { + method, + params + }, + options: { + callback + } + }); + } + + _sendQueued () { + if (!this._token) { + return; + } + + this._queued.forEach(this._send); + this._queued = []; + } + + subscribe (api, callback, params) { + // console.log('paritySubscribe', JSON.stringify(params), api, callback); + return new Promise((resolve, reject) => { + this._send({ + data: { + api, + params + }, + options: { + callback, + resolve, + reject, + subscription: true, + initial: true + } + }); + }); + } + + // FIXME: Should return callback, not promise + unsubscribe (subId) { + return new Promise((resolve, reject) => { + this._send({ + data: { + subId + }, + options: { + callback: (error, result) => { + error + ? reject(error) + : resolve(result); + } + } + }); + }); + } + + unsubscribeAll () { + return this.unsubscribe('*'); + } + + _receiveMessage ({ data: { id, error, from, to, token, result }, origin, source }) { + const isTokenValid = token + ? token === this._token + : true; + + if (from !== 'shell' || to !== this._appId || !isTokenValid) { + return; + } + + if (this._messages[id].subscription) { + // console.log('subscription', result, 'initial?', this._messages[id].initial); + this._messages[id].initial + ? this._messages[id].resolve(result) + : this._messages[id].callback(error && new Error(error), result); + this._messages[id].initial = false; + } else { + this._messages[id].callback(error && new Error(error), result); + this._messages[id] = null; + } + } +} + +module.exports = PostMessage; diff --git a/packages/api/src/provider/postMessage.spec.js b/packages/api/src/provider/postMessage.spec.js new file mode 100644 index 00000000..79ab8129 --- /dev/null +++ b/packages/api/src/provider/postMessage.spec.js @@ -0,0 +1,134 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/* eslint-disable no-unused-expressions */ + +const sinon = require('sinon'); + +const PostMessage = require('./postMessage'); + +const APP_ID = 'xyz'; + +let destination; +let provider; +let source; + +function createDestination () { + destination = { + postMessage: sinon.stub() + }; + + return destination; +} + +function createSource () { + source = { + addEventListener: sinon.stub() + }; + + return source; +} + +function createProvider () { + provider = new PostMessage(APP_ID, createDestination(), createSource()); + + return provider; +} + +describe('provider/PostMessage', () => { + beforeEach(() => { + createProvider(); + }); + + describe('constructor', () => { + it('adds an event listener for message', () => { + expect(source.addEventListener).to.have.been.calledWith('message', provider._receiveMessage); + }); + }); + + describe('getters', () => { + describe('isParity', () => { + it('returns true', () => { + expect(provider.isParity).to.be.true; + }); + }); + + describe('isConnected', () => { + it('returns the internal connected status', () => { + provider._connected = 'connected'; + + expect(provider.isConnected).to.equal('connected'); + }); + }); + }); + + describe('setToken', () => { + beforeEach(() => { + sinon.spy(provider, '_sendQueued'); + }); + + afterEach(() => { + provider._sendQueued.restore(); + }); + + it('sets the connected status', () => { + expect(provider.isConnected).to.be.false; + + provider.setToken('123'); + + expect(provider.isConnected).to.be.true; + }); + + it('sends all queued messages', () => { + expect(provider._sendQueued).not.to.have.beenCalled; + + provider.setToken('123'); + + expect(provider._sendQueued).to.have.been.called; + }); + + it('emits a connected message', (done) => { + provider.on('connected', done); + provider.setToken('123'); + }); + }); + + describe('send', () => { + it('queues messages before token is available', () => { + expect(provider.queuedCount).to.equal(0); + + provider.send('method', 'params', () => {}); + + expect(destination.postMessage).not.to.have.been.called; + expect(provider.queuedCount).to.equal(1); + }); + + it('sends queued messages as token is available', () => { + expect(provider.queuedCount).to.equal(0); + + provider.send('method', 'params', () => {}); + provider.setToken('123'); + + expect(destination.postMessage).to.have.been.calledWith( + provider._constructMessage(1, { + method: 'method', + params: 'params' + }), '*' + ); + expect(provider.queuedCount).to.equal(0); + }); + }); +}); diff --git a/packages/api/src/provider/sendAsync.spec.js b/packages/api/src/provider/sendAsync.spec.js index cc22d171..efb14e93 100644 --- a/packages/api/src/provider/sendAsync.spec.js +++ b/packages/api/src/provider/sendAsync.spec.js @@ -36,7 +36,7 @@ describe('provider/SendAsync', () => { describe('sendAsync', () => { it('calls into the supplied provider', (done) => { initProvider().sendAsync({ method: 'method', params: 'params' }, (error, data) => { // eslint-disable-line - expect(data).toEqual({ + expect(data).to.deep.equal({ result: { isStubbed: true, method: 'method', diff --git a/packages/api/src/provider/ws.spec.js b/packages/api/src/provider/ws.spec.js index 557a96f0..748a5972 100644 --- a/packages/api/src/provider/ws.spec.js +++ b/packages/api/src/provider/ws.spec.js @@ -31,7 +31,7 @@ describe('provider/Ws', () => { describe('isParity', () => { it('return true', () => { - expect(provider.isParity).toBe.true; + expect(provider.isParity).to.be.true; }); }); }); diff --git a/packages/api/src/pubsub/pubsub.spec.js b/packages/api/src/pubsub/pubsub.spec.js index cac4c1ea..0d0d0d6d 100644 --- a/packages/api/src/pubsub/pubsub.spec.js +++ b/packages/api/src/pubsub/pubsub.spec.js @@ -50,8 +50,8 @@ describe('pubsub/Pubsub', () => { it('retrieves the available account info', (done) => { instance.parity.accountsInfo((error, result) => { - expect(error).toBe.null; - expect(result).toEqual({ + expect(error).to.be.null; + expect(result).to.deep.equal({ '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name', uuid: 'uuid', meta: { data: 'data' @@ -79,7 +79,7 @@ describe('pubsub/Pubsub', () => { it('Promise gets resolved on success.', (done) => { instance.parity.accountsInfo().then(s => { instance.parity.unsubscribe(s).then(b => { - expect(b).toBe.true; + expect(b).to.be.true; done(); }); }); @@ -106,8 +106,8 @@ describe('pubsub/Pubsub', () => { it('retrieves the chain status', (done) => { instance.parity.chainStatus((error, result) => { - expect(error).toBe.null; - expect(result).toEqual({ + expect(error).to.be.null; + expect(result).to.deep.equal({ 'blockGap': [new BigNumber(0x123), new BigNumber(0x456)] }); done(); @@ -133,9 +133,9 @@ describe('pubsub/Pubsub', () => { it('returns the gasfloor, formatted', (done) => { instance.parity.gasFloorTarget((error, result) => { - expect(error).toBe.null; - expect(isBigNumber(result)).toBe.true; - expect(result.eq(0x123456)).toBe.true; + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(0x123456)).to.be.true; done(); }); }); @@ -159,9 +159,9 @@ describe('pubsub/Pubsub', () => { it('returns the tx limit, formatted', (done) => { instance.parity.transactionsLimit((error, result) => { - expect(error).toBe.null; - expect(isBigNumber(result)).toBe.true; - expect(result.eq(1024)).toBe.true; + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(1024)).to.be.true; done(); }); }); @@ -185,9 +185,9 @@ describe('pubsub/Pubsub', () => { it('returns the min gasprice, formatted', (done) => { instance.parity.minGasPrice((error, result) => { - expect(error).toBe.null; - expect(isBigNumber(result)).toBe.true; - expect(result.eq(0x123456)).toBe.true; + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(0x123456)).to.be.true; done(); }); }); @@ -211,10 +211,10 @@ describe('pubsub/Pubsub', () => { it('returns the peer structure, formatted', (done) => { instance.parity.netPeers((error, peers) => { - expect(error).toBe.null; - expect(peers.active.eq(123)).toBe.true; - expect(peers.connected.eq(456)).toBe.true; - expect(peers.max.eq(789)).toBe.true; + expect(error).to.be.null; + expect(peers.active.eq(123)).to.be.true; + expect(peers.connected.eq(456)).to.be.true; + expect(peers.max.eq(789)).to.be.true; done(); }); }); @@ -238,9 +238,9 @@ describe('pubsub/Pubsub', () => { it('returns the connected port, formatted', (done) => { instance.parity.netPort((error, count) => { - expect(error).toBe.null; - expect(isBigNumber(count)).toBe.true; - expect(count.eq(33030)).toBe.true; + expect(error).to.be.null; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(33030)).to.be.true; done(); }); }); @@ -264,8 +264,8 @@ describe('pubsub/Pubsub', () => { it('returns a list of accounts, formatted', (done) => { instance.eth.accounts((error, accounts) => { - expect(error).toBe.null; - expect(accounts).toEqual([address]); + expect(error).to.be.null; + expect(accounts).to.deep.equal([address]); done(); }); }); @@ -289,8 +289,8 @@ describe('pubsub/Pubsub', () => { it('returns newHeads for eth_subscribe', (done) => { instance.eth.newHeads((error, blockNumber) => { - expect(error).toBe.null; - expect(blockNumber).toEqual('0x123456'); + expect(error).to.be.null; + expect(blockNumber).to.equal('0x123456'); done(); }); }); @@ -314,9 +314,9 @@ describe('pubsub/Pubsub', () => { it('returns the current blockNumber, formatted', (done) => { instance.eth.blockNumber((error, blockNumber) => { - expect(error).toBe.null; - expect(isBigNumber(blockNumber)).toBe.true; - expect(blockNumber.toString(16)).toEqual('123456'); + expect(error).to.be.null; + expect(isBigNumber(blockNumber)).to.be.true; + expect(blockNumber.toString(16)).to.equal('123456'); done(); }); }); @@ -340,16 +340,16 @@ describe('pubsub/Pubsub', () => { it('formats the input options & blockNumber', (done) => { instance.eth.call((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_call', [{ data: '0x12345678' }, 'earliest']]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_call', [{ data: '0x12345678' }, 'earliest']]); done(); }, { data: '12345678' }, 'earliest'); }); it('provides a latest blockNumber when not specified', (done) => { instance.eth.call((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_call', [{ data: '0x12345678' }, 'latest']]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_call', [{ data: '0x12345678' }, 'latest']]); done(); }, { data: '12345678' }); }); @@ -373,8 +373,8 @@ describe('pubsub/Pubsub', () => { it('returns the coinbase, formatted', (done) => { instance.eth.coinbase((error, account) => { - expect(error).toBe.null; - expect(account).toEqual(address); + expect(error).to.be.null; + expect(account).to.deep.equal(address); done(); }); }); @@ -398,17 +398,17 @@ describe('pubsub/Pubsub', () => { it('converts the options correctly', (done) => { instance.eth.estimateGas((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_estimateGas', [{ gas: '0x5208' }]]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_estimateGas', [{ gas: '0x5208' }]]); done(); }, { gas: 21000 }); }); it('returns the gas used, formatted', (done) => { instance.eth.estimateGas((error, gas) => { - expect(error).toBe.null; - expect(isBigNumber(gas)).toBe.true; - expect(gas.toString(16)).toEqual('123'); + expect(error).to.be.null; + expect(isBigNumber(gas)).to.be.true; + expect(gas.toString(16)).to.deep.equal('123'); done(); }); }); @@ -432,9 +432,9 @@ describe('pubsub/Pubsub', () => { it('returns the gas price, formatted', (done) => { instance.eth.gasPrice((error, price) => { - expect(error).toBe.null; - expect(isBigNumber(price)).toBe.true; - expect(price.toString(16)).toEqual('123'); + expect(error).to.be.null; + expect(isBigNumber(price)).to.be.true; + expect(price.toString(16)).to.deep.equal('123'); done(); }); }); @@ -458,25 +458,25 @@ describe('pubsub/Pubsub', () => { it('passes in the address (default blockNumber)', (done) => { instance.eth.getBalance((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getBalance', [address.toLowerCase(), 'latest']]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBalance', [address.toLowerCase(), 'latest']]); done(); }, address); }); it('passes in the address & blockNumber', (done) => { instance.eth.getBalance((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getBalance', [address.toLowerCase(), '0x456']]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBalance', [address.toLowerCase(), '0x456']]); done(); }, address, 0x456); }); it('returns the balance', (done) => { instance.eth.getBalance((error, balance) => { - expect(error).toBe.null; - expect(isBigNumber(balance)).toBe.true; - expect(balance.toString(16)).toEqual('123'); + expect(error).to.be.null; + expect(isBigNumber(balance)).to.be.true; + expect(balance.toString(16)).to.deep.equal('123'); done(); }, address); }); @@ -500,24 +500,24 @@ describe('pubsub/Pubsub', () => { it('formats the input hash as a hash, default full', (done) => { instance.eth.getBlockByHash((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getBlockByHash', ['0x1234', false]]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByHash', ['0x1234', false]]); done(); }, '1234'); }); it('formats the input hash as a hash, full true', (done) => { instance.eth.getBlockByHash((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getBlockByHash', ['0x1234', true]]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByHash', ['0x1234', true]]); done(); }, '1234', true); }); it('formats the output into block', (done) => { instance.eth.getBlockByHash((error, block) => { - expect(error).toBe.null; - expect(block.miner).toEqual(address); + expect(error).to.be.null; + expect(block.miner).to.equal(address); done(); }, '1234'); }); @@ -541,32 +541,32 @@ describe('pubsub/Pubsub', () => { it('assumes blockNumber latest & full false', (done) => { instance.eth.getBlockByNumber((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getBlockByNumber', ['latest', false]]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['latest', false]]); done(); }); }); it('uses input blockNumber & full false', (done) => { instance.eth.getBlockByNumber((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getBlockByNumber', ['0x1234', false]]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['0x1234', false]]); done(); }, '0x1234'); }); it('formats the input blockNumber, full true', (done) => { instance.eth.getBlockByNumber((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getBlockByNumber', ['0x1234', true]]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['0x1234', true]]); done(); }, 0x1234, true); }); it('formats the output into block', (done) => { instance.eth.getBlockByNumber((error, block) => { - expect(error).toBe.null; - expect(block.miner).toEqual(address); + expect(error).to.be.null; + expect(block.miner).to.equal(address); done(); }, 0x1234); }); @@ -590,25 +590,25 @@ describe('pubsub/Pubsub', () => { it('passes in the address (default blockNumber)', (done) => { instance.eth.getTransactionCount((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getTransactionCount', [address.toLowerCase(), 'latest']]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getTransactionCount', [address.toLowerCase(), 'latest']]); done(); }, address); }); it('passes in the address & blockNumber', (done) => { instance.eth.getTransactionCount((error) => { - expect(error).toBe.null; - expect(scope.body.parity_subscribe.params).toEqual(['eth_getTransactionCount', [address.toLowerCase(), '0x456']]); + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getTransactionCount', [address.toLowerCase(), '0x456']]); done(); }, address, 0x456); }); it('returns the count, formatted', (done) => { instance.eth.getTransactionCount((error, count) => { - expect(error).toBe.null; - expect(isBigNumber(count)).toBe.true; - expect(count.toString(16)).toEqual('123'); + expect(error).to.be.null; + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); done(); }, address, 0x456); }); diff --git a/packages/api/src/rpc/db/db.spec.js b/packages/api/src/rpc/db/db.spec.js index 9d82eab7..5cd6764c 100644 --- a/packages/api/src/rpc/db/db.spec.js +++ b/packages/api/src/rpc/db/db.spec.js @@ -31,7 +31,7 @@ describe('rpc/Db', () => { it('formats the inputs correctly', () => { return instance.putHex('db', 'key', '1234').then(() => { - expect(scope.body.db_putHex.params).toEqual(['db', 'key', '0x1234']); + expect(scope.body.db_putHex.params).to.deep.equal(['db', 'key', '0x1234']); }); }); }); diff --git a/packages/api/src/rpc/eth/eth.e2e.js b/packages/api/src/rpc/eth/eth.e2e.js index 9298a63f..02018f69 100644 --- a/packages/api/src/rpc/eth/eth.e2e.js +++ b/packages/api/src/rpc/eth/eth.e2e.js @@ -30,7 +30,7 @@ describe('ethapi.eth', () => { it('returns the available accounts', () => { return ethapi.eth.accounts().then((accounts) => { accounts.forEach((account) => { - expect(isAddress(account)).toBe.true; + expect(isAddress(account)).to.be.true; }); }); }); @@ -40,7 +40,7 @@ describe('ethapi.eth', () => { it('returns the current blockNumber', () => { return ethapi.eth.blockNumber().then((blockNumber) => { latestBlockNumber = blockNumber; - expect(blockNumber.gt(0xabcde)).toBe.true; + expect(blockNumber.gt(0xabcde)).to.be.true; }); }); }); @@ -48,7 +48,7 @@ describe('ethapi.eth', () => { describe('coinbase', () => { it('returns the coinbase', () => { return ethapi.eth.coinbase().then((coinbase) => { - expect(isAddress(coinbase)).toBe.true; + expect(isAddress(coinbase)).to.be.true; }); }); }); @@ -56,7 +56,7 @@ describe('ethapi.eth', () => { describe('gasPrice', () => { it('returns the current gasPrice', () => { return ethapi.eth.gasPrice().then((gasPrice) => { - expect(gasPrice.gt(0)).toBe.true; + expect(gasPrice.gt(0)).to.be.true; }); }); }); @@ -64,7 +64,7 @@ describe('ethapi.eth', () => { describe('getBalance', () => { it('returns the balance for latest block', () => { return ethapi.eth.getBalance(address).then((balance) => { - expect(balance.gt(0)).toBe.true; + expect(balance.gt(0)).to.be.true; }); }); @@ -75,7 +75,7 @@ describe('ethapi.eth', () => { return ethapi.eth .getBalance(address, atBlock) .then((balance) => { - expect(balance.toString(16)).toEqual(atValue); + expect(balance.toString(16)).to.equal(atValue); }) .catch((error) => { // Parity doesn't support pruned-before-block balance lookups @@ -87,7 +87,7 @@ describe('ethapi.eth', () => { return ethapi.eth .getBalance(address, latestBlockNumber.minus(1000)) .then((balance) => { - expect(balance.gt(0)).toBe.true; + expect(balance.gt(0)).to.be.true; }); }); }); @@ -95,20 +95,20 @@ describe('ethapi.eth', () => { describe('getBlockByNumber', () => { it('returns the latest block', () => { return ethapi.eth.getBlockByNumber().then((block) => { - expect(block).toBe.ok; + expect(block).to.be.ok; }); }); it('returns a block by blockNumber', () => { return ethapi.eth.getBlockByNumber(latestBlockNumber).then((block) => { latestBlockHash = block.hash; - expect(block).toBe.ok; + expect(block).to.be.ok; }); }); it('returns a block by blockNumber (full)', () => { return ethapi.eth.getBlockByNumber(latestBlockNumber, true).then((block) => { - expect(block).toBe.ok; + expect(block).to.be.ok; }); }); }); @@ -116,15 +116,15 @@ describe('ethapi.eth', () => { describe('getBlockByHash', () => { it('returns the specified block', () => { return ethapi.eth.getBlockByHash(latestBlockHash).then((block) => { - expect(block).toBe.ok; - expect(block.hash).toEqual(latestBlockHash); + expect(block).to.be.ok; + expect(block.hash).to.equal(latestBlockHash); }); }); it('returns the specified block (full)', () => { return ethapi.eth.getBlockByHash(latestBlockHash, true).then((block) => { - expect(block).toBe.ok; - expect(block.hash).toEqual(latestBlockHash); + expect(block).to.be.ok; + expect(block.hash).to.equal(latestBlockHash); }); }); }); @@ -132,8 +132,8 @@ describe('ethapi.eth', () => { describe('getBlockTransactionCountByHash', () => { it('returns the transactions of the specified hash', () => { return ethapi.eth.getBlockTransactionCountByHash(latestBlockHash).then((count) => { - expect(count).toBe.ok; - expect(count.gte(0)).toBe.true; + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; }); }); }); @@ -141,15 +141,15 @@ describe('ethapi.eth', () => { describe('getBlockTransactionCountByNumber', () => { it('returns the transactions of latest', () => { return ethapi.eth.getBlockTransactionCountByNumber().then((count) => { - expect(count).toBe.ok; - expect(count.gte(0)).toBe.true; + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; }); }); it('returns the transactions of a specified number', () => { return ethapi.eth.getBlockTransactionCountByNumber(latestBlockNumber).then((count) => { - expect(count).toBe.ok; - expect(count.gte(0)).toBe.true; + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; }); }); }); @@ -157,15 +157,15 @@ describe('ethapi.eth', () => { describe('getTransactionCount', () => { it('returns the count for an address', () => { return ethapi.eth.getTransactionCount(address).then((count) => { - expect(count).toBe.ok; - expect(count.gte(0x1000c2)).toBe.ok; + expect(count).to.be.ok; + expect(count.gte(0x1000c2)).to.be.ok; }); }); it('returns the count for an address at specified blockNumber', () => { return ethapi.eth.getTransactionCount(address, latestBlockNumber).then((count) => { - expect(count).toBe.ok; - expect(count.gte(0x1000c2)).toBe.ok; + expect(count).to.be.ok; + expect(count.gte(0x1000c2)).to.be.ok; }); }); }); diff --git a/packages/api/src/rpc/eth/eth.js b/packages/api/src/rpc/eth/eth.js index 9c594382..3263f32b 100644 --- a/packages/api/src/rpc/eth/eth.js +++ b/packages/api/src/rpc/eth/eth.js @@ -14,325 +14,309 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -const { - inAddress, - inBlockNumber, - inData, - inFilter, - inHash, - inHex, - inNumber16, - inOptions -} = require('../../format/input'); -const { - outAddress, - outBlock, - outLog, - outNumber, - outReceipt, - outSyncing, - outTransaction -} = require('../../format/output'); +const { inAddress, inBlockNumber, inData, inFilter, inHash, inHex, inNumber16, inOptions } = require('../../format/input'); +const { outAddress, outBlock, outLog, outNumber, outReceipt, outSyncing, outTransaction } = require('../../format/output'); class Eth { - constructor(provider) { + constructor (provider) { this._provider = provider; } - accounts() { + accounts () { return this._provider .send('eth_accounts') - .then(accounts => (accounts || []).map(outAddress)); + .then((accounts) => (accounts || []).map(outAddress)); } - blockNumber() { - return this._provider.send('eth_blockNumber').then(outNumber); + blockNumber () { + return this._provider + .send('eth_blockNumber') + .then(outNumber); } - call(options, blockNumber = 'latest') { - return this._provider.send( - 'eth_call', - inOptions(options), - inBlockNumber(blockNumber) - ); + call (options, blockNumber = 'latest') { + return this._provider + .send('eth_call', inOptions(options), inBlockNumber(blockNumber)); } - coinbase() { - return this._provider.send('eth_coinbase').then(outAddress); + coinbase () { + return this._provider + .send('eth_coinbase') + .then(outAddress); } - compileLLL(code) { - return this._provider.send('eth_compileLLL', inData(code)); + compileLLL (code) { + return this._provider + .send('eth_compileLLL', inData(code)); } - compileSerpent(code) { - return this._provider.send('eth_compileSerpent', inData(code)); + compileSerpent (code) { + return this._provider + .send('eth_compileSerpent', inData(code)); } - compileSolidity(code) { - return this._provider.send('eth_compileSolidity', inData(code)); + compileSolidity (code) { + return this._provider + .send('eth_compileSolidity', inData(code)); } - estimateGas(options) { + estimateGas (options) { return this._provider .send('eth_estimateGas', inOptions(options)) .then(outNumber); } - fetchQueuedTransactions() { - return this._provider.send('eth_fetchQueuedTransactions'); + fetchQueuedTransactions () { + return this._provider + .send('eth_fetchQueuedTransactions'); } - flush() { - return this._provider.send('eth_flush'); + flush () { + return this._provider + .send('eth_flush'); } - gasPrice() { - return this._provider.send('eth_gasPrice').then(outNumber); + gasPrice () { + return this._provider + .send('eth_gasPrice') + .then(outNumber); } - getBalance(address, blockNumber = 'latest') { + getBalance (address, blockNumber = 'latest') { return this._provider .send('eth_getBalance', inAddress(address), inBlockNumber(blockNumber)) .then(outNumber); } - getBlockByHash(hash, full = false) { + getBlockByHash (hash, full = false) { return this._provider .send('eth_getBlockByHash', inHex(hash), full) .then(outBlock); } - getBlockByNumber(blockNumber = 'latest', full = false) { + getBlockByNumber (blockNumber = 'latest', full = false) { return this._provider .send('eth_getBlockByNumber', inBlockNumber(blockNumber), full) .then(outBlock); } - getBlockTransactionCountByHash(hash) { + getBlockTransactionCountByHash (hash) { return this._provider .send('eth_getBlockTransactionCountByHash', inHex(hash)) .then(outNumber); } - getBlockTransactionCountByNumber(blockNumber = 'latest') { + getBlockTransactionCountByNumber (blockNumber = 'latest') { return this._provider .send('eth_getBlockTransactionCountByNumber', inBlockNumber(blockNumber)) .then(outNumber); } - getCode(address, blockNumber = 'latest') { - return this._provider.send( - 'eth_getCode', - inAddress(address), - inBlockNumber(blockNumber) - ); + getCode (address, blockNumber = 'latest') { + return this._provider + .send('eth_getCode', inAddress(address), inBlockNumber(blockNumber)); } - getCompilers() { - return this._provider.send('eth_getCompilers'); + getCompilers () { + return this._provider + .send('eth_getCompilers'); } - getFilterChanges(filterId) { + getFilterChanges (filterId) { return this._provider .send('eth_getFilterChanges', inNumber16(filterId)) - .then(logs => logs.map(outLog)); + .then((logs) => logs.map(outLog)); } - getFilterChangesEx(filterId) { - return this._provider.send('eth_getFilterChangesEx', inNumber16(filterId)); + getFilterChangesEx (filterId) { + return this._provider + .send('eth_getFilterChangesEx', inNumber16(filterId)); } - getFilterLogs(filterId) { + getFilterLogs (filterId) { return this._provider .send('eth_getFilterLogs', inNumber16(filterId)) - .then(logs => logs.map(outLog)); + .then((logs) => logs.map(outLog)); } - getFilterLogsEx(filterId) { - return this._provider.send('eth_getFilterLogsEx', inNumber16(filterId)); + getFilterLogsEx (filterId) { + return this._provider + .send('eth_getFilterLogsEx', inNumber16(filterId)); } - getLogs(options) { + getLogs (options) { return this._provider .send('eth_getLogs', inFilter(options)) - .then(logs => logs.map(outLog)); + .then((logs) => logs.map(outLog)); } - getLogsEx(options) { - return this._provider.send('eth_getLogsEx', inFilter(options)); + getLogsEx (options) { + return this._provider + .send('eth_getLogsEx', inFilter(options)); } - getStorageAt(address, index = 0, blockNumber = 'latest') { - return this._provider.send( - 'eth_getStorageAt', - inAddress(address), - inNumber16(index), - inBlockNumber(blockNumber) - ); + getStorageAt (address, index = 0, blockNumber = 'latest') { + return this._provider + .send('eth_getStorageAt', inAddress(address), inNumber16(index), inBlockNumber(blockNumber)); } - getTransactionByBlockHashAndIndex(hash, index = 0) { + getTransactionByBlockHashAndIndex (hash, index = 0) { return this._provider - .send( - 'eth_getTransactionByBlockHashAndIndex', - inHex(hash), - inNumber16(index) - ) + .send('eth_getTransactionByBlockHashAndIndex', inHex(hash), inNumber16(index)) .then(outTransaction); } - getTransactionByBlockNumberAndIndex(blockNumber = 'latest', index = 0) { + getTransactionByBlockNumberAndIndex (blockNumber = 'latest', index = 0) { return this._provider - .send( - 'eth_getTransactionByBlockNumberAndIndex', - inBlockNumber(blockNumber), - inNumber16(index) - ) + .send('eth_getTransactionByBlockNumberAndIndex', inBlockNumber(blockNumber), inNumber16(index)) .then(outTransaction); } - getTransactionByHash(hash) { + getTransactionByHash (hash) { return this._provider .send('eth_getTransactionByHash', inHex(hash)) .then(outTransaction); } - getTransactionCount(address, blockNumber = 'latest') { + getTransactionCount (address, blockNumber = 'latest') { return this._provider - .send( - 'eth_getTransactionCount', - inAddress(address), - inBlockNumber(blockNumber) - ) + .send('eth_getTransactionCount', inAddress(address), inBlockNumber(blockNumber)) .then(outNumber); } - getTransactionReceipt(txhash) { + getTransactionReceipt (txhash) { return this._provider .send('eth_getTransactionReceipt', inHex(txhash)) .then(outReceipt); } - getUncleByBlockHashAndIndex(hash, index = 0) { - return this._provider.send( - 'eth_getUncleByBlockHashAndIndex', - inHex(hash), - inNumber16(index) - ); + getUncleByBlockHashAndIndex (hash, index = 0) { + return this._provider + .send('eth_getUncleByBlockHashAndIndex', inHex(hash), inNumber16(index)); } - getUncleByBlockNumberAndIndex(blockNumber = 'latest', index = 0) { - return this._provider.send( - 'eth_getUncleByBlockNumberAndIndex', - inBlockNumber(blockNumber), - inNumber16(index) - ); + getUncleByBlockNumberAndIndex (blockNumber = 'latest', index = 0) { + return this._provider + .send('eth_getUncleByBlockNumberAndIndex', inBlockNumber(blockNumber), inNumber16(index)); } - getUncleCountByBlockHash(hash) { + getUncleCountByBlockHash (hash) { return this._provider .send('eth_getUncleCountByBlockHash', inHex(hash)) .then(outNumber); } - getUncleCountByBlockNumber(blockNumber = 'latest') { + getUncleCountByBlockNumber (blockNumber = 'latest') { return this._provider .send('eth_getUncleCountByBlockNumber', inBlockNumber(blockNumber)) .then(outNumber); } - getWork() { - return this._provider.send('eth_getWork'); + getWork () { + return this._provider + .send('eth_getWork'); } - hashrate() { - return this._provider.send('eth_hashrate').then(outNumber); + hashrate () { + return this._provider + .send('eth_hashrate') + .then(outNumber); } - inspectTransaction() { - return this._provider.send('eth_inspectTransaction'); + inspectTransaction () { + return this._provider + .send('eth_inspectTransaction'); } - mining() { - return this._provider.send('eth_mining'); + mining () { + return this._provider + .send('eth_mining'); } - newBlockFilter() { - return this._provider.send('eth_newBlockFilter'); + newBlockFilter () { + return this._provider + .send('eth_newBlockFilter'); } - newFilter(options) { - return this._provider.send('eth_newFilter', inFilter(options)); + newFilter (options) { + return this._provider + .send('eth_newFilter', inFilter(options)); } - newFilterEx(options) { - return this._provider.send('eth_newFilterEx', inFilter(options)); + newFilterEx (options) { + return this._provider + .send('eth_newFilterEx', inFilter(options)); } - newPendingTransactionFilter() { - return this._provider.send('eth_newPendingTransactionFilter'); + newPendingTransactionFilter () { + return this._provider + .send('eth_newPendingTransactionFilter'); } - notePassword() { - return this._provider.send('eth_notePassword'); + notePassword () { + return this._provider + .send('eth_notePassword'); } - pendingTransactions() { - return this._provider.send('eth_pendingTransactions'); + pendingTransactions () { + return this._provider + .send('eth_pendingTransactions'); } - protocolVersion() { - return this._provider.send('eth_protocolVersion'); + protocolVersion () { + return this._provider + .send('eth_protocolVersion'); } - register() { - return this._provider.send('eth_register'); + register () { + return this._provider + .send('eth_register'); } - sendRawTransaction(data) { - return this._provider.send('eth_sendRawTransaction', inData(data)); + sendRawTransaction (data) { + return this._provider + .send('eth_sendRawTransaction', inData(data)); } - sendTransaction(options) { - return this._provider.send('eth_sendTransaction', inOptions(options)); + sendTransaction (options) { + return this._provider + .send('eth_sendTransaction', inOptions(options)); } - sign(address, hash) { - return this._provider.send('eth_sign', inAddress(address), inHash(hash)); + sign (address, hash) { + return this._provider + .send('eth_sign', inAddress(address), inHash(hash)); } - signTransaction(options) { - return this._provider.send('eth_signTransaction', inOptions(options)); + signTransaction (options) { + return this._provider + .send('eth_signTransaction', inOptions(options)); } - submitHashrate(hashrate, clientId) { - return this._provider.send( - 'eth_submitHashrate', - inNumber16(hashrate), - clientId - ); + submitHashrate (hashrate, clientId) { + return this._provider + .send('eth_submitHashrate', inNumber16(hashrate), clientId); } - submitWork(nonce, powHash, mixDigest) { - return this._provider.send( - 'eth_submitWork', - inNumber16(nonce), - powHash, - mixDigest - ); + submitWork (nonce, powHash, mixDigest) { + return this._provider + .send('eth_submitWork', inNumber16(nonce), powHash, mixDigest); } - syncing() { - return this._provider.send('eth_syncing').then(outSyncing); + syncing () { + return this._provider + .send('eth_syncing') + .then(outSyncing); } - uninstallFilter(filterId) { - return this._provider.send('eth_uninstallFilter', inHex(filterId)); + uninstallFilter (filterId) { + return this._provider + .send('eth_uninstallFilter', inHex(filterId)); } - unregister() { - return this._provider.send('eth_unregister'); + unregister () { + return this._provider + .send('eth_unregister'); } } diff --git a/packages/api/src/rpc/eth/eth.spec.js b/packages/api/src/rpc/eth/eth.spec.js index 7d16785a..10c547d7 100644 --- a/packages/api/src/rpc/eth/eth.spec.js +++ b/packages/api/src/rpc/eth/eth.spec.js @@ -35,7 +35,7 @@ describe('rpc/Eth', () => { it('returns a list of accounts, formatted', () => { return instance.accounts().then((accounts) => { - expect(accounts).toEqual([address]); + expect(accounts).to.deep.equal([address]); }); }); }); @@ -47,8 +47,8 @@ describe('rpc/Eth', () => { it('returns the current blockNumber, formatted', () => { return instance.blockNumber().then((blockNumber) => { - expect(isBigNumber(blockNumber)).toBe.true; - expect(blockNumber.toString(16)).toEqual('123456'); + expect(isBigNumber(blockNumber)).to.be.true; + expect(blockNumber.toString(16)).to.equal('123456'); }); }); }); @@ -60,13 +60,13 @@ describe('rpc/Eth', () => { it('formats the input options & blockNumber', () => { return instance.call({ data: '12345678' }, 'earliest').then(() => { - expect(scope.body.eth_call.params).toEqual([{ data: '0x12345678' }, 'earliest']); + expect(scope.body.eth_call.params).to.deep.equal([{ data: '0x12345678' }, 'earliest']); }); }); it('provides a latest blockNumber when not specified', () => { return instance.call({ data: '12345678' }).then(() => { - expect(scope.body.eth_call.params).toEqual([{ data: '0x12345678' }, 'latest']); + expect(scope.body.eth_call.params).to.deep.equal([{ data: '0x12345678' }, 'latest']); }); }); }); @@ -78,7 +78,7 @@ describe('rpc/Eth', () => { it('returns the coinbase, formatted', () => { return instance.coinbase().then((account) => { - expect(account).toEqual(address); + expect(account).to.deep.equal(address); }); }); }); @@ -93,8 +93,8 @@ describe('rpc/Eth', () => { it('formats the input as data, returns the output', () => { return instance[method]('0xabcdef').then((result) => { - expect(scope.body[`eth_${method}`].params).toEqual(['0xabcdef']); - expect(result).toEqual('0x123'); + expect(scope.body[`eth_${method}`].params).to.deep.equal(['0xabcdef']); + expect(result).to.equal('0x123'); }); }); }); @@ -107,14 +107,14 @@ describe('rpc/Eth', () => { it('converts the options correctly', () => { return instance.estimateGas({ gas: 21000 }).then(() => { - expect(scope.body.eth_estimateGas.params).toEqual([{ gas: '0x5208' }]); + expect(scope.body.eth_estimateGas.params).to.deep.equal([{ gas: '0x5208' }]); }); }); it('returns the gas used', () => { return instance.estimateGas({}).then((gas) => { - expect(isBigNumber(gas)).toBe.true; - expect(gas.toString(16)).toEqual('123'); + expect(isBigNumber(gas)).to.be.true; + expect(gas.toString(16)).to.deep.equal('123'); }); }); }); @@ -126,8 +126,8 @@ describe('rpc/Eth', () => { it('returns the fomratted price', () => { return instance.gasPrice().then((price) => { - expect(isBigNumber(price)).toBe.true; - expect(price.toString(16)).toEqual('123'); + expect(isBigNumber(price)).to.be.true; + expect(price.toString(16)).to.deep.equal('123'); }); }); }); @@ -139,20 +139,20 @@ describe('rpc/Eth', () => { it('passes in the address (default blockNumber)', () => { return instance.getBalance(address).then(() => { - expect(scope.body.eth_getBalance.params).toEqual([address.toLowerCase(), 'latest']); + expect(scope.body.eth_getBalance.params).to.deep.equal([address.toLowerCase(), 'latest']); }); }); it('passes in the address & blockNumber', () => { return instance.getBalance(address, 0x456).then(() => { - expect(scope.body.eth_getBalance.params).toEqual([address.toLowerCase(), '0x456']); + expect(scope.body.eth_getBalance.params).to.deep.equal([address.toLowerCase(), '0x456']); }); }); it('returns the balance', () => { return instance.getBalance(address, 0x123).then((balance) => { - expect(isBigNumber(balance)).toBe.true; - expect(balance.toString(16)).toEqual('123'); + expect(isBigNumber(balance)).to.be.true; + expect(balance.toString(16)).to.deep.equal('123'); }); }); }); @@ -164,19 +164,19 @@ describe('rpc/Eth', () => { it('formats the input hash as a hash, default full', () => { return instance.getBlockByHash('1234').then(() => { - expect(scope.body.eth_getBlockByHash.params).toEqual(['0x1234', false]); + expect(scope.body.eth_getBlockByHash.params).to.deep.equal(['0x1234', false]); }); }); it('formats the input hash as a hash, full true', () => { return instance.getBlockByHash('1234', true).then(() => { - expect(scope.body.eth_getBlockByHash.params).toEqual(['0x1234', true]); + expect(scope.body.eth_getBlockByHash.params).to.deep.equal(['0x1234', true]); }); }); it('formats the output into block', () => { return instance.getBlockByHash('1234').then((block) => { - expect(block.miner).toEqual(address); + expect(block.miner).to.equal(address); }); }); }); @@ -188,25 +188,25 @@ describe('rpc/Eth', () => { it('assumes blockNumber latest & full false', () => { return instance.getBlockByNumber().then(() => { - expect(scope.body.eth_getBlockByNumber.params).toEqual(['latest', false]); + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['latest', false]); }); }); it('uses input blockNumber & full false', () => { return instance.getBlockByNumber('0x1234').then(() => { - expect(scope.body.eth_getBlockByNumber.params).toEqual(['0x1234', false]); + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['0x1234', false]); }); }); it('formats the input blockNumber, full true', () => { return instance.getBlockByNumber(0x1234, true).then(() => { - expect(scope.body.eth_getBlockByNumber.params).toEqual(['0x1234', true]); + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['0x1234', true]); }); }); it('formats the output into block', () => { return instance.getBlockByNumber(0x1234).then((block) => { - expect(block.miner).toEqual(address); + expect(block.miner).to.equal(address); }); }); }); @@ -218,14 +218,14 @@ describe('rpc/Eth', () => { it('formats input hash properly', () => { return instance.getBlockTransactionCountByHash('abcdef').then(() => { - expect(scope.body.eth_getBlockTransactionCountByHash.params).toEqual(['0xabcdef']); + expect(scope.body.eth_getBlockTransactionCountByHash.params).to.deep.equal(['0xabcdef']); }); }); it('formats the output number', () => { return instance.getBlockTransactionCountByHash('0x1234').then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.toString(16)).toEqual('123'); + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); }); }); }); @@ -237,20 +237,20 @@ describe('rpc/Eth', () => { it('specified blockNumber latest when none specified', () => { return instance.getBlockTransactionCountByNumber().then(() => { - expect(scope.body.eth_getBlockTransactionCountByNumber.params).toEqual(['latest']); + expect(scope.body.eth_getBlockTransactionCountByNumber.params).to.deep.equal(['latest']); }); }); it('formats input blockNumber properly', () => { return instance.getBlockTransactionCountByNumber(0xabcdef).then(() => { - expect(scope.body.eth_getBlockTransactionCountByNumber.params).toEqual(['0xabcdef']); + expect(scope.body.eth_getBlockTransactionCountByNumber.params).to.deep.equal(['0xabcdef']); }); }); it('formats the output number', () => { return instance.getBlockTransactionCountByNumber('0x1234').then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.toString(16)).toEqual('123'); + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); }); }); }); @@ -262,19 +262,19 @@ describe('rpc/Eth', () => { it('passes in the address (default blockNumber)', () => { return instance.getCode(address).then(() => { - expect(scope.body.eth_getCode.params).toEqual([address.toLowerCase(), 'latest']); + expect(scope.body.eth_getCode.params).to.deep.equal([address.toLowerCase(), 'latest']); }); }); it('passes in the address & blockNumber', () => { return instance.getCode(address, 0x456).then(() => { - expect(scope.body.eth_getCode.params).toEqual([address.toLowerCase(), '0x456']); + expect(scope.body.eth_getCode.params).to.deep.equal([address.toLowerCase(), '0x456']); }); }); it('returns the code', () => { return instance.getCode(address, 0x123).then((code) => { - expect(code).toEqual('0x1234567890'); + expect(code).to.equal('0x1234567890'); }); }); }); @@ -286,19 +286,19 @@ describe('rpc/Eth', () => { it('passes in the address (default index& blockNumber)', () => { return instance.getStorageAt(address).then(() => { - expect(scope.body.eth_getStorageAt.params).toEqual([address.toLowerCase(), '0x0', 'latest']); + expect(scope.body.eth_getStorageAt.params).to.deep.equal([address.toLowerCase(), '0x0', 'latest']); }); }); it('passes in the address, index & blockNumber', () => { return instance.getStorageAt(address, 15, 0x456).then(() => { - expect(scope.body.eth_getStorageAt.params).toEqual([address.toLowerCase(), '0xf', '0x456']); + expect(scope.body.eth_getStorageAt.params).to.deep.equal([address.toLowerCase(), '0xf', '0x456']); }); }); it('returns the storage', () => { return instance.getStorageAt(address, 0x123).then((storage) => { - expect(storage).toEqual('0x1234567890'); + expect(storage).to.equal('0x1234567890'); }); }); }); @@ -310,19 +310,19 @@ describe('rpc/Eth', () => { it('passes in the hash (default index)', () => { return instance.getTransactionByBlockHashAndIndex('12345').then(() => { - expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).toEqual(['0x12345', '0x0']); + expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).to.deep.equal(['0x12345', '0x0']); }); }); it('passes in the hash & specified index', () => { return instance.getTransactionByBlockHashAndIndex('6789', 0x456).then(() => { - expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).toEqual(['0x6789', '0x456']); + expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).to.deep.equal(['0x6789', '0x456']); }); }); it('returns the formatted transaction', () => { return instance.getTransactionByBlockHashAndIndex('6789', 0x123).then((tx) => { - expect(tx).toEqual({ to: address }); + expect(tx).to.deep.equal({ to: address }); }); }); }); @@ -334,19 +334,19 @@ describe('rpc/Eth', () => { it('passes in the default parameters', () => { return instance.getTransactionByBlockNumberAndIndex().then(() => { - expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).toEqual(['latest', '0x0']); + expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).to.deep.equal(['latest', '0x0']); }); }); it('passes in the blockNumber & specified index', () => { return instance.getTransactionByBlockNumberAndIndex('0x6789', 0x456).then(() => { - expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).toEqual(['0x6789', '0x456']); + expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).to.deep.equal(['0x6789', '0x456']); }); }); it('returns the formatted transaction', () => { return instance.getTransactionByBlockNumberAndIndex('0x6789', 0x123).then((tx) => { - expect(tx).toEqual({ to: address }); + expect(tx).to.deep.equal({ to: address }); }); }); }); @@ -358,13 +358,13 @@ describe('rpc/Eth', () => { it('passes in the hash', () => { return instance.getTransactionByHash('12345').then(() => { - expect(scope.body.eth_getTransactionByHash.params).toEqual(['0x12345']); + expect(scope.body.eth_getTransactionByHash.params).to.deep.equal(['0x12345']); }); }); it('returns the formatted transaction', () => { return instance.getTransactionByHash('6789').then((tx) => { - expect(tx).toEqual({ to: address }); + expect(tx).to.deep.equal({ to: address }); }); }); }); @@ -376,20 +376,20 @@ describe('rpc/Eth', () => { it('passes in the address (default blockNumber)', () => { return instance.getTransactionCount(address).then(() => { - expect(scope.body.eth_getTransactionCount.params).toEqual([address.toLowerCase(), 'latest']); + expect(scope.body.eth_getTransactionCount.params).to.deep.equal([address.toLowerCase(), 'latest']); }); }); it('passes in the address & blockNumber', () => { return instance.getTransactionCount(address, 0x456).then(() => { - expect(scope.body.eth_getTransactionCount.params).toEqual([address.toLowerCase(), '0x456']); + expect(scope.body.eth_getTransactionCount.params).to.deep.equal([address.toLowerCase(), '0x456']); }); }); it('returns the count, formatted', () => { return instance.getTransactionCount(address, 0x123).then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.toString(16)).toEqual('123'); + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); }); }); }); @@ -401,13 +401,13 @@ describe('rpc/Eth', () => { it('passes in the hash (default index)', () => { return instance.getUncleByBlockHashAndIndex('12345').then(() => { - expect(scope.body.eth_getUncleByBlockHashAndIndex.params).toEqual(['0x12345', '0x0']); + expect(scope.body.eth_getUncleByBlockHashAndIndex.params).to.deep.equal(['0x12345', '0x0']); }); }); it('passes in the hash & specified index', () => { return instance.getUncleByBlockHashAndIndex('6789', 0x456).then(() => { - expect(scope.body.eth_getUncleByBlockHashAndIndex.params).toEqual(['0x6789', '0x456']); + expect(scope.body.eth_getUncleByBlockHashAndIndex.params).to.deep.equal(['0x6789', '0x456']); }); }); }); @@ -419,13 +419,13 @@ describe('rpc/Eth', () => { it('passes in the default parameters', () => { return instance.getUncleByBlockNumberAndIndex().then(() => { - expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).toEqual(['latest', '0x0']); + expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).to.deep.equal(['latest', '0x0']); }); }); it('passes in the blockNumber & specified index', () => { return instance.getUncleByBlockNumberAndIndex('0x6789', 0x456).then(() => { - expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).toEqual(['0x6789', '0x456']); + expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).to.deep.equal(['0x6789', '0x456']); }); }); }); @@ -437,14 +437,14 @@ describe('rpc/Eth', () => { it('passes in the hash', () => { return instance.getUncleCountByBlockHash('12345').then(() => { - expect(scope.body.eth_getUncleCountByBlockHash.params).toEqual(['0x12345']); + expect(scope.body.eth_getUncleCountByBlockHash.params).to.deep.equal(['0x12345']); }); }); it('formats the output number', () => { return instance.getUncleCountByBlockHash('0x1234').then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.toString(16)).toEqual('123'); + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); }); }); }); @@ -456,20 +456,20 @@ describe('rpc/Eth', () => { it('passes in the default parameters', () => { return instance.getUncleCountByBlockNumber().then(() => { - expect(scope.body.eth_getUncleCountByBlockNumber.params).toEqual(['latest']); + expect(scope.body.eth_getUncleCountByBlockNumber.params).to.deep.equal(['latest']); }); }); it('passes in the blockNumber', () => { return instance.getUncleCountByBlockNumber('0x6789').then(() => { - expect(scope.body.eth_getUncleCountByBlockNumber.params).toEqual(['0x6789']); + expect(scope.body.eth_getUncleCountByBlockNumber.params).to.deep.equal(['0x6789']); }); }); it('formats the output number', () => { return instance.getUncleCountByBlockNumber('0x1234').then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.toString(16)).toEqual('123'); + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); }); }); }); diff --git a/packages/api/src/rpc/net/net.e2e.js b/packages/api/src/rpc/net/net.e2e.js index cbf70c87..34cfe6df 100644 --- a/packages/api/src/rpc/net/net.e2e.js +++ b/packages/api/src/rpc/net/net.e2e.js @@ -25,7 +25,7 @@ describe('ethapi.net', () => { describe('listening', () => { it('returns the listening status', () => { return ethapi.net.listening().then((status) => { - expect(isBoolean(status)).toBe.true; + expect(isBoolean(status)).to.be.true; }); }); }); @@ -33,7 +33,7 @@ describe('ethapi.net', () => { describe('peerCount', () => { it('returns the peer count', () => { return ethapi.net.peerCount().then((count) => { - expect(count.gte(0)).toBe.true; + expect(count.gte(0)).to.be.true; }); }); }); @@ -41,7 +41,7 @@ describe('ethapi.net', () => { describe('version', () => { it('returns the version', () => { return ethapi.net.version().then((version) => { - expect(version).toBe.ok; + expect(version).to.be.ok; }); }); }); diff --git a/packages/api/src/rpc/net/net.spec.js b/packages/api/src/rpc/net/net.spec.js index 976fc521..fae6bfbd 100644 --- a/packages/api/src/rpc/net/net.spec.js +++ b/packages/api/src/rpc/net/net.spec.js @@ -30,8 +30,8 @@ describe('rpc/Net', () => { mockHttp([{ method: 'net_peerCount', reply: { result: '0x123456' } }]); return instance.peerCount().then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.eq(0x123456)).toBe.true; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; }); }); }); diff --git a/packages/api/src/rpc/parity/parity.e2e.js b/packages/api/src/rpc/parity/parity.e2e.js index 2b6bd7a5..d0d68dc9 100644 --- a/packages/api/src/rpc/parity/parity.e2e.js +++ b/packages/api/src/rpc/parity/parity.e2e.js @@ -24,7 +24,7 @@ describe('ethapi.parity', () => { describe('chainStatus', () => { it('returns and translates the status', () => { return ethapi.parity.chainStatus().then((value) => { - expect(value).toBe.ok; + expect(value).to.be.ok; }); }); }); @@ -32,7 +32,7 @@ describe('ethapi.parity', () => { describe('gasFloorTarget', () => { it('returns and translates the target', () => { return ethapi.parity.gasFloorTarget().then((value) => { - expect(value.gt(0)).toBe.true; + expect(value.gt(0)).to.be.true; }); }); }); @@ -40,9 +40,9 @@ describe('ethapi.parity', () => { describe('gasPriceHistogram', () => { it('returns and translates the target', () => { return ethapi.parity.gasPriceHistogram().then((result) => { - expect(Object.keys(result)).toEqual(['bucketBounds', 'counts']); - expect(result.bucketBounds.length > 0).toBe.true; - expect(result.counts.length > 0).toBe.true; + expect(Object.keys(result)).to.deep.equal(['bucketBounds', 'counts']); + expect(result.bucketBounds.length > 0).to.be.true; + expect(result.counts.length > 0).to.be.true; }); }); }); @@ -50,7 +50,7 @@ describe('ethapi.parity', () => { describe('netChain', () => { it('returns and the chain', () => { return ethapi.parity.netChain().then((value) => { - expect(value).toEqual('morden'); + expect(value).to.equal('morden'); }); }); }); @@ -58,7 +58,7 @@ describe('ethapi.parity', () => { describe('netPort', () => { it('returns and translates the port', () => { return ethapi.parity.netPort().then((value) => { - expect(value.gt(0)).toBe.true; + expect(value.gt(0)).to.be.true; }); }); }); @@ -66,7 +66,7 @@ describe('ethapi.parity', () => { describe('transactionsLimit', () => { it('returns and translates the limit', () => { return ethapi.parity.transactionsLimit().then((value) => { - expect(value.gt(0)).toBe.true; + expect(value.gt(0)).to.be.true; }); }); }); @@ -74,7 +74,7 @@ describe('ethapi.parity', () => { describe('rpcSettings', () => { it('returns and translates the settings', () => { return ethapi.parity.rpcSettings().then((value) => { - expect(value).toBe.ok; + expect(value).to.be.ok; }); }); }); diff --git a/packages/api/src/rpc/parity/parity.spec.js b/packages/api/src/rpc/parity/parity.spec.js index 881c5948..7c751422 100644 --- a/packages/api/src/rpc/parity/parity.spec.js +++ b/packages/api/src/rpc/parity/parity.spec.js @@ -38,7 +38,7 @@ describe('rpc/parity', () => { } }]); return instance.accountsInfo().then((result) => { - expect(result).toEqual({ + expect(result).to.deep.equal({ '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name', uuid: 'uuid', meta: { data: 'data' @@ -58,7 +58,7 @@ describe('rpc/parity', () => { } }]); return instance.chainStatus().then((result) => { - expect(result).toEqual({ + expect(result).to.deep.equal({ 'blockGap': [new BigNumber(0x123), new BigNumber(0x456)] }); }); @@ -70,8 +70,8 @@ describe('rpc/parity', () => { mockHttp([{ method: 'parity_gasFloorTarget', reply: { result: '0x123456' } }]); return instance.gasFloorTarget().then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.eq(0x123456)).toBe.true; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; }); }); }); @@ -86,7 +86,7 @@ describe('rpc/parity', () => { it('passes the addresses through', () => { return instance.importGethAccounts(ACCOUNTS).then((result) => { - expect(scope.body['parity_importGethAccounts'].params).toEqual([ACCOUNTS]); + expect(scope.body['parity_importGethAccounts'].params).to.deep.equal([ACCOUNTS]); }); }); }); @@ -96,8 +96,8 @@ describe('rpc/parity', () => { mockHttp([{ method: 'parity_minGasPrice', reply: { result: '0x123456' } }]); return instance.minGasPrice().then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.eq(0x123456)).toBe.true; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; }); }); }); @@ -107,8 +107,8 @@ describe('rpc/parity', () => { mockHttp([{ method: 'parity_netMaxPeers', reply: { result: 25 } }]); return instance.netMaxPeers().then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.eq(25)).toBe.true; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(25)).to.be.true; }); }); }); @@ -118,9 +118,9 @@ describe('rpc/parity', () => { mockHttp([{ method: 'parity_netPeers', reply: { result: { active: 123, connected: 456, max: 789, peers: [] } } }]); return instance.netPeers().then((peers) => { - expect(peers.active.eq(123)).toBe.true; - expect(peers.connected.eq(456)).toBe.true; - expect(peers.max.eq(789)).toBe.true; + expect(peers.active.eq(123)).to.be.true; + expect(peers.connected.eq(456)).to.be.true; + expect(peers.max.eq(789)).to.be.true; }); }); }); @@ -130,8 +130,8 @@ describe('rpc/parity', () => { mockHttp([{ method: 'parity_netPort', reply: { result: 33030 } }]); return instance.netPort().then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.eq(33030)).toBe.true; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(33030)).to.be.true; }); }); }); @@ -141,8 +141,8 @@ describe('rpc/parity', () => { mockHttp([{ method: 'parity_transactionsLimit', reply: { result: 1024 } }]); return instance.transactionsLimit().then((count) => { - expect(isBigNumber(count)).toBe.true; - expect(count.eq(1024)).toBe.true; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(1024)).to.be.true; }); }); }); diff --git a/packages/api/src/rpc/personal/personal.e2e.js b/packages/api/src/rpc/personal/personal.e2e.js index 63c1a9c9..883b1b2f 100644 --- a/packages/api/src/rpc/personal/personal.e2e.js +++ b/packages/api/src/rpc/personal/personal.e2e.js @@ -28,7 +28,7 @@ describe.skip('ethapi.personal', () => { it('creates a new account', () => { return ethapi.personal.newAccount(password).then((_address) => { address = _address; - expect(isAddress(address)).toBe.ok; + expect(isAddress(address)).to.be.ok; }); }); }); @@ -36,9 +36,9 @@ describe.skip('ethapi.personal', () => { describe('listAccounts', () => { it('has the newly-created account', () => { return ethapi.personal.listAccounts(password).then((accounts) => { - expect(accounts.filter((_address) => _address === address)).toEqual([address]); + expect(accounts.filter((_address) => _address === address)).to.deep.equal([address]); accounts.forEach((account) => { - expect(isAddress(account)).toBe.true; + expect(isAddress(account)).to.be.true; }); }); }); @@ -47,8 +47,8 @@ describe.skip('ethapi.personal', () => { describe('unlockAccount', () => { it('unlocks the newly-created account', () => { return ethapi.personal.unlockAccount(address, password).then((result) => { - expect(isBoolean(result)).toBe.true; - expect(result).toBe.true; + expect(isBoolean(result)).to.be.true; + expect(result).to.be.true; }); }); }); diff --git a/packages/api/src/rpc/personal/personal.spec.js b/packages/api/src/rpc/personal/personal.spec.js index 4a7f88c9..c115c63d 100644 --- a/packages/api/src/rpc/personal/personal.spec.js +++ b/packages/api/src/rpc/personal/personal.spec.js @@ -31,7 +31,7 @@ describe('rpc/Personal', () => { scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: [account] } }]); return instance.listAccounts().then((result) => { - expect(result).toEqual([checksum]); + expect(result).to.deep.equal([checksum]); }); }); @@ -39,7 +39,7 @@ describe('rpc/Personal', () => { scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: null } }]); return instance.listAccounts().then((result) => { - expect(result).toEqual([]); + expect(result).to.deep.equal([]); }); }); }); @@ -49,8 +49,8 @@ describe('rpc/Personal', () => { scope = mockHttp([{ method: 'personal_newAccount', reply: { result: account } }]); return instance.newAccount('password').then((result) => { - expect(scope.body.personal_newAccount.params).toEqual(['password']); - expect(result).toEqual(checksum); + expect(scope.body.personal_newAccount.params).to.deep.equal(['password']); + expect(result).to.equal(checksum); }); }); }); @@ -62,13 +62,13 @@ describe('rpc/Personal', () => { it('passes account, password & duration', () => { return instance.unlockAccount(account, 'password', 0xf).then(() => { - expect(scope.body.personal_unlockAccount.params).toEqual([account, 'password', '0xf']); + expect(scope.body.personal_unlockAccount.params).to.deep.equal([account, 'password', '0xf']); }); }); it('provides a default duration when not specified', () => { return instance.unlockAccount(account, 'password').then(() => { - expect(scope.body.personal_unlockAccount.params).toEqual([account, 'password', '0x1']); + expect(scope.body.personal_unlockAccount.params).to.deep.equal([account, 'password', '0x1']); }); }); }); diff --git a/packages/api/src/rpc/trace/trace.e2e.js b/packages/api/src/rpc/trace/trace.e2e.js index 0d1dd6ff..7360de93 100644 --- a/packages/api/src/rpc/trace/trace.e2e.js +++ b/packages/api/src/rpc/trace/trace.e2e.js @@ -24,13 +24,13 @@ describe('ethapi.trace', () => { describe('block', () => { it('returns the latest block traces', () => { return ethapi.trace.block().then((traces) => { - expect(traces).toBe.ok; + expect(traces).to.be.ok; }); }); it('returns traces for a specified block', () => { return ethapi.trace.block('0x65432').then((traces) => { - expect(traces).toBe.ok; + expect(traces).to.be.ok; }); }); }); @@ -39,7 +39,7 @@ describe('ethapi.trace', () => { it('returns traces for a specific transaction', () => { return ethapi.eth.getBlockByNumber().then((latestBlock) => { return ethapi.trace.replayTransaction(latestBlock.transactions[0]).then((traces) => { - expect(traces).toBe.ok; + expect(traces).to.be.ok; }); }); }); diff --git a/packages/api/src/rpc/trace/trace.spec.js b/packages/api/src/rpc/trace/trace.spec.js index a34cc18d..74a094d8 100644 --- a/packages/api/src/rpc/trace/trace.spec.js +++ b/packages/api/src/rpc/trace/trace.spec.js @@ -31,13 +31,13 @@ describe('rpc/Trace', () => { it('assumes latest blockNumber when not specified', () => { return instance.block().then(() => { - expect(scope.body.trace_block.params).toEqual(['latest']); + expect(scope.body.trace_block.params).to.deep.equal(['latest']); }); }); it('passed specified blockNumber', () => { return instance.block(0x123).then(() => { - expect(scope.body.trace_block.params).toEqual(['0x123']); + expect(scope.body.trace_block.params).to.deep.equal(['0x123']); }); }); }); diff --git a/packages/api/src/rpc/web3/web3.e2e.js b/packages/api/src/rpc/web3/web3.e2e.js index 05967b1d..440d16e8 100644 --- a/packages/api/src/rpc/web3/web3.e2e.js +++ b/packages/api/src/rpc/web3/web3.e2e.js @@ -27,7 +27,7 @@ describe('ethapi.web3', () => { return ethapi.web3.clientVersion().then((version) => { const [client] = version.split('/'); - expect(client === 'Parity' || client === 'Geth').toBe.ok; + expect(client === 'Parity' || client === 'Geth').to.be.ok; }); }); }); @@ -38,8 +38,8 @@ describe('ethapi.web3', () => { const hexStr = 'baz()'.split('').map((char) => char.charCodeAt(0).toString(16)).join(''); return ethapi.web3.sha3(`0x${hexStr}`).then((hash) => { - expect(isHexNumber(hash)).toBe.true; - expect(hash).toEqual(sha); + expect(isHexNumber(hash)).to.be.true; + expect(hash).to.equal(sha); }); }); }); diff --git a/packages/api/src/rpc/web3/web3.spec.js b/packages/api/src/rpc/web3/web3.spec.js index 46b6b38d..372de2e2 100644 --- a/packages/api/src/rpc/web3/web3.spec.js +++ b/packages/api/src/rpc/web3/web3.spec.js @@ -31,7 +31,7 @@ describe('rpc/Web3', () => { it('formats the inputs correctly', () => { return instance.sha3('1234').then(() => { - expect(scope.body.web3_sha3.params).toEqual(['0x1234']); + expect(scope.body.web3_sha3.params).to.deep.equal(['0x1234']); }); }); }); diff --git a/packages/api/src/subscriptions/eth.spec.js b/packages/api/src/subscriptions/eth.spec.js index 28cb968e..a9b8ed9b 100644 --- a/packages/api/src/subscriptions/eth.spec.js +++ b/packages/api/src/subscriptions/eth.spec.js @@ -58,7 +58,7 @@ describe('subscriptions/eth', () => { describe('constructor', () => { it('starts the instance in a stopped state', () => { - expect(eth.isStarted).toBe.false; + expect(eth.isStarted).to.be.false; }); }); @@ -69,11 +69,11 @@ describe('subscriptions/eth', () => { }); it('sets the started status', () => { - expect(eth.isStarted).toBe.true; + expect(eth.isStarted).to.be.true; }); it('calls eth_blockNumber', () => { - expect(api._calls.blockNumber.length).toBe.ok; + expect(api._calls.blockNumber.length).to.be.ok; }); it('updates subscribers', () => { @@ -89,15 +89,15 @@ describe('subscriptions/eth', () => { }); it('sets the started status', () => { - expect(eth.isStarted).toBe.true; + expect(eth.isStarted).to.be.true; }); it('calls eth_blockNumber', () => { - expect(api._calls.blockNumber.length).toBe.ok; + expect(api._calls.blockNumber.length).to.be.ok; }); it('does not update subscribers', () => { - expect(cb).not.toBeen.called; + expect(cb).not.to.been.called; }); }); }); diff --git a/packages/api/src/subscriptions/logging.spec.js b/packages/api/src/subscriptions/logging.spec.js index 10c33ca3..8da8a476 100644 --- a/packages/api/src/subscriptions/logging.spec.js +++ b/packages/api/src/subscriptions/logging.spec.js @@ -31,7 +31,7 @@ describe('subscriptions/logging', () => { describe('constructor', () => { it('starts the instance in a started state', () => { - expect(logging.isStarted).toBe.true; + expect(logging.isStarted).to.be.true; }); }); diff --git a/packages/api/src/subscriptions/manager.spec.js b/packages/api/src/subscriptions/manager.spec.js index ad26be2e..977d3805 100644 --- a/packages/api/src/subscriptions/manager.spec.js +++ b/packages/api/src/subscriptions/manager.spec.js @@ -59,8 +59,8 @@ describe('subscriptions/manager', () => { describe('constructor', () => { it('sets up the subscription types & defaults', () => { - expect(manager.subscriptions).toBe.an.array; - expect(Object.keys(manager.values)).toEqual(Object.keys(events)); + expect(manager.subscriptions).to.be.an.array; + expect(Object.keys(manager.values)).to.deep.equal(Object.keys(events)); }); }); @@ -93,7 +93,7 @@ describe('subscriptions/manager', () => { }); it('returns a subscriptionId', () => { - expect(subscriptionId).toBe.a.number; + expect(subscriptionId).to.be.a.number; }); it('calls the subscription callback with updated values', () => { diff --git a/packages/api/src/subscriptions/personal.spec.js b/packages/api/src/subscriptions/personal.spec.js index 468e26c8..deb959f6 100644 --- a/packages/api/src/subscriptions/personal.spec.js +++ b/packages/api/src/subscriptions/personal.spec.js @@ -95,7 +95,7 @@ describe('subscriptions/personal', () => { describe('constructor', () => { it('starts the instance in a stopped state', () => { - expect(personal.isStarted).toBe.false; + expect(personal.isStarted).to.be.false; }); }); @@ -106,19 +106,19 @@ describe('subscriptions/personal', () => { }); it('sets the started status', () => { - expect(personal.isStarted).toBe.true; + expect(personal.isStarted).to.be.true; }); it('calls parity_accountsInfo', () => { - expect(api._calls.accountsInfo.length).toBe.ok; + expect(api._calls.accountsInfo.length).to.be.ok; }); it('calls parity_allAccountsInfo', () => { - expect(api._calls.allAccountsInfo.length).toBe.ok; + expect(api._calls.allAccountsInfo.length).to.be.ok; }); it('calls eth_accounts', () => { - expect(api._calls.listAccounts.length).toBe.ok; + expect(api._calls.listAccounts.length).to.be.ok; }); it('updates subscribers', () => { @@ -137,23 +137,23 @@ describe('subscriptions/personal', () => { }); it('sets the started status', () => { - expect(personal.isStarted).toBe.true; + expect(personal.isStarted).to.be.true; }); it('calls parity_defaultAccount', () => { - expect(api._calls.defaultAccount.length).toBe.ok; + expect(api._calls.defaultAccount.length).to.be.ok; }); it('calls personal_accountsInfo', () => { - expect(api._calls.accountsInfo.length).toBe.ok; + expect(api._calls.accountsInfo.length).to.be.ok; }); it('calls personal_allAccountsInfo', () => { - expect(api._calls.allAccountsInfo.length).toBe.ok; + expect(api._calls.allAccountsInfo.length).to.be.ok; }); it('calls personal_listAccounts', () => { - expect(api._calls.listAccounts.length).toBe.ok; + expect(api._calls.listAccounts.length).to.be.ok; }); }); }); diff --git a/packages/api/src/transport/TransportError.spec.js b/packages/api/src/transport/TransportError.spec.js deleted file mode 100644 index 7e5695c0..00000000 --- a/packages/api/src/transport/TransportError.spec.js +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -const TransportError = require('./error'); - -describe('transport/Error', () => { - describe('requestRejected', () => { - it('creates a Request Rejected error', () => { - const error = TransportError.requestRejected('method'); - - expect(error.code).to.equal(TransportError.ERROR_CODES.REQUEST_REJECTED); - expect(error.message).to.match(/been rejected/); - expect(error.method).to.equal('method'); - }); - }); -}); diff --git a/packages/api/src/transport/TransportError.js b/packages/api/src/transport/error.js similarity index 58% rename from packages/api/src/transport/TransportError.js rename to packages/api/src/transport/error.js index ea34e97b..f68eb478 100644 --- a/packages/api/src/transport/TransportError.js +++ b/packages/api/src/transport/error.js @@ -1,7 +1,18 @@ // Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. -// -// SPDX-License-Identifier: MIT + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . const ExtendableError = require('es6-error'); @@ -38,8 +49,9 @@ class TransportError extends ExtendableError { super(m); this.code = code; - this.type = - Object.keys(ERROR_CODES).find(key => ERROR_CODES[key] === code) || ''; + this.type = Object + .keys(ERROR_CODES) + .find((key) => ERROR_CODES[key] === code) || ''; this.method = method; this.text = message; @@ -49,11 +61,7 @@ class TransportError extends ExtendableError { TransportError.ERROR_CODES = ERROR_CODES; TransportError.requestRejected = function (method = null) { - return new TransportError( - method, - ERROR_CODES.REQUEST_REJECTED, - 'Request has been rejected.' - ); + return new TransportError(method, ERROR_CODES.REQUEST_REJECTED, 'Request has been rejected.'); }; module.exports = TransportError; diff --git a/packages/api/src/transport/error.spec.js b/packages/api/src/transport/error.spec.js new file mode 100644 index 00000000..c79c1d4f --- /dev/null +++ b/packages/api/src/transport/error.spec.js @@ -0,0 +1,29 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const TransportError = require('./error'); + +describe('transport/Error', () => { + describe('requestRejected', () => { + it('creates a Request Rejected error', () => { + const error = TransportError.requestRejected('method'); + + expect(error.code).to.equal(TransportError.ERROR_CODES.REQUEST_REJECTED); + expect(error.message).to.match(/been rejected/); + expect(error.method).to.equal('method'); + }); + }); +}); diff --git a/packages/api/src/transport/http/http.e2e.js b/packages/api/src/transport/http/http.e2e.js index d50980ca..9d969c38 100644 --- a/packages/api/src/transport/http/http.e2e.js +++ b/packages/api/src/transport/http/http.e2e.js @@ -25,7 +25,7 @@ describe('transport/Http', () => { return http.execute('web3_clientVersion').then((version) => { const [client] = version.split('/'); - expect(client === 'Geth' || client === 'Parity').toBe.ok; + expect(client === 'Geth' || client === 'Parity').to.be.ok; }); }); }); diff --git a/packages/api/src/transport/http/http.js b/packages/api/src/transport/http/http.js index d18066fb..f1936040 100644 --- a/packages/api/src/transport/http/http.js +++ b/packages/api/src/transport/http/http.js @@ -16,7 +16,7 @@ const { Logging } = require('../../subscriptions'); const JsonRpcBase = require('../jsonRpcBase'); -const TransportError = require('../TransportError'); +const TransportError = require('../error'); /* global fetch */ class Http extends JsonRpcBase { diff --git a/packages/api/src/transport/http/http.spec.js b/packages/api/src/transport/http/http.spec.js index cd840fd5..2d00cad8 100644 --- a/packages/api/src/transport/http/http.spec.js +++ b/packages/api/src/transport/http/http.spec.js @@ -35,7 +35,7 @@ describe('transport/Http', () => { body: `{"id":${transport._id - 1},"jsonrpc":"2.0","method":"someMethod","params":["param"]}` }; - expect(opt).toEqual(enc); + expect(opt).to.deep.equal(enc); }); }); @@ -76,27 +76,27 @@ describe('transport/Http', () => { }); it('makes POST', () => { - expect(scope.isDone()).toBe.true; + expect(scope.isDone()).to.be.true; }); it('sets jsonrpc', () => { - expect(scope.body.eth_call.jsonrpc).toEqual('2.0'); + expect(scope.body.eth_call.jsonrpc).to.equal('2.0'); }); it('sets the method', () => { - expect(scope.body.eth_call.method).toEqual('eth_call'); + expect(scope.body.eth_call.method).to.equal('eth_call'); }); it('passes the params', () => { - expect(scope.body.eth_call.params).toEqual([1, 2, 3, 'test']); + expect(scope.body.eth_call.params).to.deep.equal([1, 2, 3, 'test']); }); it('increments the id', () => { - expect(scope.body.eth_call.id).not.toEqual(0); + expect(scope.body.eth_call.id).not.to.equal(0); }); it('passes the actual result back', () => { - expect(result).toEqual(RESULT); + expect(result).to.deep.equal(RESULT); }); }); @@ -115,7 +115,7 @@ describe('transport/Http', () => { }); it('returns HTTP errors as throws', () => { - expect(scope.isDone()).toBe.true; + expect(scope.isDone()).to.be.true; expect(error.message).to.match(/Internal Server Error/); }); }); @@ -137,7 +137,7 @@ describe('transport/Http', () => { }); it('returns RPC errors as throws', () => { - expect(scope.isDone()).toBe.true; + expect(scope.isDone()).to.be.true; expect(error.message).to.match(/RPC failure/); }); }); diff --git a/packages/api/src/transport/index.js b/packages/api/src/transport/index.js index 2314229c..851a4532 100644 --- a/packages/api/src/transport/index.js +++ b/packages/api/src/transport/index.js @@ -17,7 +17,7 @@ const Ws = require('./ws'); const Http = require('./http'); -const TransportError = require('./TransportError'); +const TransportError = require('./error'); const Middleware = require('./middleware'); const WsSecure = Ws; diff --git a/packages/api/src/transport/jsonRpcBase.spec.js b/packages/api/src/transport/jsonRpcBase.spec.js index ad7eec6b..c6f30029 100644 --- a/packages/api/src/transport/jsonRpcBase.spec.js +++ b/packages/api/src/transport/jsonRpcBase.spec.js @@ -31,7 +31,7 @@ describe('transport/JsonRpcBase', () => { base2.addMiddleware(null); base2._middlewareList.then((list) => { - expect(list).toEqual([]); + expect(list).to.deep.equal([]); done(); }); }); @@ -41,14 +41,14 @@ describe('transport/JsonRpcBase', () => { class Middleware { constructor (parent) { - expect(parent).toEqual(base2); + expect(parent).to.equal(base2); } } base2.addMiddleware(Middleware); base2._middlewareList.then((list) => { - expect(list.length).toEqual(1); - expect(isInstanceOf(list[0], Middleware)).toBe.true; + expect(list.length).to.equal(1); + expect(isInstanceOf(list[0], Middleware)).to.be.true; done(); }); }); @@ -56,19 +56,19 @@ describe('transport/JsonRpcBase', () => { describe('setDebug', () => { it('starts with disabled flag', () => { - expect(base.isDebug).toBe.false; + expect(base.isDebug).to.be.false; }); it('true flag switches on', () => { base.setDebug(true); - expect(base.isDebug).toBe.true; + expect(base.isDebug).to.be.true; }); it('false flag switches off', () => { base.setDebug(true); - expect(base.isDebug).toBe.true; + expect(base.isDebug).to.be.true; base.setDebug(false); - expect(base.isDebug).toBe.false; + expect(base.isDebug).to.be.false; }); describe('logging', () => { @@ -97,13 +97,13 @@ describe('transport/JsonRpcBase', () => { it('does log errors with flag on', () => { base.setDebug(true); base.log('error'); - expect(console.log).toBe.called; + expect(console.log).to.be.called; }); it('does log errors with flag on', () => { base.setDebug(true); base.error('error'); - expect(console.error).toBe.called; + expect(console.error).to.be.called; }); }); }); diff --git a/packages/api/src/transport/jsonRpcEncoder.spec.js b/packages/api/src/transport/jsonRpcEncoder.spec.js index b140a2d3..27c84be1 100644 --- a/packages/api/src/transport/jsonRpcEncoder.spec.js +++ b/packages/api/src/transport/jsonRpcEncoder.spec.js @@ -32,8 +32,8 @@ describe('transport/JsonRpcEncoder', () => { params: ['param1', 'param2'] }; - expect(bdy).toEqual(enc); - expect(encoder.id - id).toEqual(1); + expect(bdy).to.deep.equal(enc); + expect(encoder.id - id).to.equal(1); }); }); @@ -43,8 +43,8 @@ describe('transport/JsonRpcEncoder', () => { const bdy = encoder.encode('someMethod', ['param1', 'param2']); const enc = `{"id":${id},"jsonrpc":"2.0","method":"someMethod","params":["param1","param2"]}`; - expect(bdy).toEqual(enc); - expect(encoder.id - id).toEqual(1); + expect(bdy).to.equal(enc); + expect(encoder.id - id).to.equal(1); }); }); }); diff --git a/packages/api/src/transport/middleware.spec.js b/packages/api/src/transport/middleware.spec.js index b28f8e3b..1827ccd4 100644 --- a/packages/api/src/transport/middleware.spec.js +++ b/packages/api/src/transport/middleware.spec.js @@ -44,19 +44,19 @@ describe('transport/Middleware', () => { it('Routes requests to middleware', () => { return transport.execute('mock_rpc', [100]).then((num) => { - expect(num).toBe.equal(100); + expect(num).to.be.equal(100); }); }); it('Passes non-mocked requests through', () => { return transport.execute('not_moced', [200]).then((result) => { - expect(result).toBe.equal(MOCKED); + expect(result).to.be.equal(MOCKED); }); }); it('Passes mocked requests through, if middleware returns null', () => { return transport.execute('mock_null', [300]).then((result) => { - expect(result).toBe.equal(MOCKED); + expect(result).to.be.equal(MOCKED); }); }); }); diff --git a/packages/api/src/transport/ws/ws.e2e.js b/packages/api/src/transport/ws/ws.e2e.js index cfcb7c90..77bc99e8 100644 --- a/packages/api/src/transport/ws/ws.e2e.js +++ b/packages/api/src/transport/ws/ws.e2e.js @@ -25,7 +25,7 @@ describe('transport/WsSecure', () => { return ws.execute('web3_clientVersion').then((version) => { const [client] = version.split('/'); - expect(client === 'Geth' || client === 'Parity').toBe.ok; + expect(client === 'Geth' || client === 'Parity').to.be.ok; }); }); }); diff --git a/packages/api/src/transport/ws/ws.js b/packages/api/src/transport/ws/ws.js index 26f79175..26091f08 100644 --- a/packages/api/src/transport/ws/ws.js +++ b/packages/api/src/transport/ws/ws.js @@ -20,7 +20,7 @@ const { keccak_256 } = require('js-sha3'); // eslint-disable-line camelcase const { Logging } = require('../../subscriptions'); const JsonRpcBase = require('../jsonRpcBase'); -const TransportError = require('../TransportError'); +const TransportError = require('../error'); /* global WebSocket */ class Ws extends JsonRpcBase { diff --git a/packages/api/src/transport/ws/ws.spec.js b/packages/api/src/transport/ws/ws.spec.js index 80303053..96c04009 100644 --- a/packages/api/src/transport/ws/ws.spec.js +++ b/packages/api/src/transport/ws/ws.spec.js @@ -73,27 +73,27 @@ describe('transport/ws', () => { }); it('makes call', () => { - expect(scope.isDone()).toBe.true; + expect(scope.isDone()).to.be.true; }); it('sets jsonrpc', () => { - expect(scope.body.test_anyCall.jsonrpc).toEqual('2.0'); + expect(scope.body.test_anyCall.jsonrpc).to.equal('2.0'); }); it('sets the method', () => { - expect(scope.body.test_anyCall.method).toEqual('test_anyCall'); + expect(scope.body.test_anyCall.method).to.equal('test_anyCall'); }); it('passes the params', () => { - expect(scope.body.test_anyCall.params).toEqual([1, 2, 3]); + expect(scope.body.test_anyCall.params).to.deep.equal([1, 2, 3]); }); it('increments the id', () => { - expect(scope.body.test_anyCall.id).not.toEqual(0); + expect(scope.body.test_anyCall.id).not.to.equal(0); }); it('passes the actual result back', () => { - expect(result).toEqual('TestResult'); + expect(result).to.equal('TestResult'); }); }); diff --git a/packages/api/src/util/address.js b/packages/api/src/util/address.js new file mode 100644 index 00000000..a446f9f4 --- /dev/null +++ b/packages/api/src/util/address.js @@ -0,0 +1,22 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { isAddress, toChecksumAddress } = require('@parity/abi/lib/util/address'); + +module.exports = { + isAddress, + toChecksumAddress +}; diff --git a/packages/api/src/util/address.ts b/packages/api/src/util/address.ts deleted file mode 100644 index 9f9c88d8..00000000 --- a/packages/api/src/util/address.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -export { isAddress, toChecksumAddress } from '@parity/abi/lib/util/address'; diff --git a/packages/api/src/util/decode.js b/packages/api/src/util/decode.js new file mode 100644 index 00000000..afcf835a --- /dev/null +++ b/packages/api/src/util/decode.js @@ -0,0 +1,102 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { isHex } = require('./types'); + +const Func = require('@parity/abi/lib/spec/function'); +const { fromParamType, toParamType } = require('@parity/abi/lib/spec/paramType/format'); + +function decodeCallData (data) { + if (!isHex(data)) { + throw new Error('Input to decodeCallData should be a hex value'); + } + + if (data.substr(0, 2) === '0x') { + return decodeCallData(data.slice(2)); + } + + if (data.length < 8) { + throw new Error('Input to decodeCallData should be method signature + data'); + } + + const signature = data.substr(0, 8); + const paramdata = data.substr(8); + + return { + signature: `0x${signature}`, + paramdata: `0x${paramdata}` + }; +} + +function decodeMethodInput (methodAbi, paramdata) { + if (!methodAbi) { + throw new Error('decodeMethodInput should receive valid method-specific ABI'); + } + + if (paramdata && paramdata.length) { + if (!isHex(paramdata)) { + throw new Error('Input to decodeMethodInput should be a hex value'); + } + + if (paramdata.substr(0, 2) === '0x') { + return decodeMethodInput(methodAbi, paramdata.slice(2)); + } + } + + return new Func(methodAbi).decodeInput(paramdata).map((decoded) => decoded.value); +} + +// takes a method in form name(...,types) and returns the inferred abi definition +function methodToAbi (method) { + const length = method.length; + const typesStart = method.indexOf('('); + const typesEnd = method.indexOf(')'); + + if (typesStart === -1) { + throw new Error(`Missing start ( in call to decodeMethod with ${method}`); + } else if (typesEnd === -1) { + throw new Error(`Missing end ) in call to decodeMethod with ${method}`); + } else if (typesEnd < typesStart) { + throw new Error(`End ) is before start ( in call to decodeMethod with ${method}`); + } else if (typesEnd !== length - 1) { + throw new Error(`Extra characters after end ) in call to decodeMethod with ${method}`); + } + + const name = method.substr(0, typesStart); + const types = method.substr(typesStart + 1, length - (typesStart + 1) - 1).split(','); + const inputs = types.filter((_type) => _type.length).map((_type) => { + const type = fromParamType(toParamType(_type)); + + return { type }; + }); + + return { type: 'function', name, inputs }; +} + +function abiDecode (inputTypes, data) { + return decodeMethodInput({ + inputs: inputTypes.map((type) => { + return { type }; + }) + }, data); +} + +module.exports = { + decodeCallData, + decodeMethodInput, + methodToAbi, + abiDecode +}; diff --git a/packages/api/src/util/decode.spec.js b/packages/api/src/util/decode.spec.js new file mode 100644 index 00000000..ed97efb7 --- /dev/null +++ b/packages/api/src/util/decode.spec.js @@ -0,0 +1,113 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const BigNumber = require('bignumber.js'); +const { abiDecode, decodeCallData, decodeMethodInput, methodToAbi } = require('./decode'); + +describe('util/decode', () => { + const METH = '0x70a08231'; + const ENCO = '0x70a082310000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + const DATA = '0x0000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + + describe('decodeCallData', () => { + it('throws on non-hex inputs', () => { + expect(() => decodeCallData('invalid')).to.throw(/should be a hex value/); + }); + + it('throws when invalid signature length', () => { + expect(() => decodeCallData(METH.slice(-6))).to.throw(/should be method signature/); + }); + + it('splits valid inputs properly', () => { + expect(decodeCallData(ENCO)).to.deep.equal({ + signature: METH, + paramdata: DATA + }); + }); + }); + + describe('decodeMethodInput', () => { + it('expects a valid ABI', () => { + expect(() => decodeMethodInput(null, null)).to.throw(/should receive valid method/); + }); + + it('expects valid hex parameter data', () => { + expect(() => decodeMethodInput({}, 'invalid')).to.throw(/should be a hex value/); + }); + + it('correct decodes null inputs', () => { + expect(decodeMethodInput({}, null)).to.deep.equal([]); + }); + + it('correct decodes empty inputs', () => { + expect(decodeMethodInput({}, '')).to.deep.equal([]); + }); + + it('correctly decodes valid inputs', () => { + expect( + decodeMethodInput({ + type: 'function', + inputs: [ + { type: 'uint' } + ] + }, DATA) + ).to.deep.equal( + [ new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') ] + ); + }); + }); + + describe('methodToAbi', () => { + it('throws when no start ( specified', () => { + expect(() => methodToAbi('invalid,uint,bool)')).to.throw(/Missing start \(/); + }); + + it('throws when no end ) specified', () => { + expect(() => methodToAbi('invalid(uint,bool')).to.throw(/Missing end \)/); + }); + + it('throws when end ) is not in the last position', () => { + expect(() => methodToAbi('invalid(uint,bool)2')).to.throw(/Extra characters after end \)/); + }); + + it('throws when start ( is after end )', () => { + expect(() => methodToAbi('invalid)uint,bool(')).to.throw(/End \) is before start \(/); + }); + + it('throws when invalid types are present', () => { + expect(() => methodToAbi('method(invalidType,bool,uint)')).to.throw(/Cannot convert invalidType/); + }); + + it('returns a valid methodabi for a valid method', () => { + expect(methodToAbi('valid(uint,bool)')).to.deep.equals({ + type: 'function', + name: 'valid', + inputs: [ + { type: 'uint256' }, + { type: 'bool' } + ] + }); + }); + }); + + describe('abiDecode', () => { + it('correctly decodes valid inputs', () => { + expect(abiDecode(['uint'], DATA)).to.deep.equal( + [ new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') ] + ); + }); + }); +}); diff --git a/packages/api/src/util/decode.spec.ts b/packages/api/src/util/decode.spec.ts deleted file mode 100644 index ba272843..00000000 --- a/packages/api/src/util/decode.spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import BigNumber from 'bignumber.js'; -import { - abiDecode, - decodeCallData, - decodeMethodInput, - methodToAbi -} from './decode'; - -describe('util/decode', () => { - const METH = '0x70a08231'; - const ENCO = - '0x70a082310000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; - const DATA = - '0x0000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; - - describe('decodeCallData', () => { - it('throws on non-hex inputs', () => { - expect(() => decodeCallData('invalid')).toThrow(/should be a hex value/); - }); - - it('throws when invalid signature length', () => { - expect(() => decodeCallData(METH.slice(-6))).toThrow( - /should be method signature/ - ); - }); - - it('splits valid inputs properly', () => { - expect(decodeCallData(ENCO)).toEqual({ - signature: METH, - paramdata: DATA - }); - }); - }); - - describe('decodeMethodInput', () => { - it('expects a valid ABI', () => { - expect(() => decodeMethodInput(null as any, null as any)).toThrow( - /should receive valid method/ - ); - }); - - it('expects valid hex parameter data', () => { - expect(() => decodeMethodInput({}, 'invalid')).toThrow( - /should be a hex value/ - ); - }); - - it('correct decodes null inputs', () => { - expect(decodeMethodInput({})).toEqual([]); - }); - - it('correct decodes empty inputs', () => { - expect(decodeMethodInput({}, '')).toEqual([]); - }); - - it('correctly decodes valid inputs', () => { - expect( - decodeMethodInput( - { - type: 'function', - inputs: [{ type: 'uint' }] - }, - DATA - ) - ).toEqual([new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9')]); - }); - }); - - describe('methodToAbi', () => { - it('throws when no start ( specified', () => { - expect(() => methodToAbi('invalid,uint,bool)')).toThrow( - /Missing start \(/ - ); - }); - - it('throws when no end ) specified', () => { - expect(() => methodToAbi('invalid(uint,bool')).toThrow(/Missing end \)/); - }); - - it('throws when end ) is not in the last position', () => { - expect(() => methodToAbi('invalid(uint,bool)2')).toThrow( - /Extra characters after end \)/ - ); - }); - - it('throws when start ( is after end )', () => { - expect(() => methodToAbi('invalid)uint,bool(')).toThrow( - /End \) is before start \(/ - ); - }); - - it('throws when invalid types are present', () => { - expect(() => methodToAbi('method(invalidType,bool,uint)')).toThrow( - /Cannot convert invalidType/ - ); - }); - - it('returns a valid methodabi for a valid method', () => { - expect(methodToAbi('valid(uint,bool)')).toEqual({ - type: 'function', - name: 'valid', - inputs: [{ type: 'uint256' }, { type: 'bool' }] - }); - }); - }); - - describe('abiDecode', () => { - it('correctly decodes valid inputs', () => { - expect(abiDecode(['uint'], DATA)).toEqual([ - new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') - ]); - }); - }); -}); diff --git a/packages/api/src/util/decode.ts b/packages/api/src/util/decode.ts deleted file mode 100644 index c1ce8a72..00000000 --- a/packages/api/src/util/decode.ts +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { AbiItem, TokenTypeEnum, TokenValue } from '@parity/abi'; -import { - fromParamType, - toParamType -} from '@parity/abi/lib/spec/paramType/format'; -import Func from '@parity/abi/lib/spec/function'; - -import { isHex } from './types'; - -/** - * Decode call data. - * - * @param data - The call data to decode. - */ -export const decodeCallData = ( - data: string -): { paramdata: string; signature: string } => { - if (!isHex(data)) { - throw new Error('Input to decodeCallData should be a hex value'); - } - - if (data.startsWith('0x')) { - return decodeCallData(data.slice(2)); - } - - if (data.length < 8) { - throw new Error( - 'Input to decodeCallData should be method signature + data' - ); - } - - const signature = data.substr(0, 8); - const paramdata = data.substr(8); - - return { - signature: `0x${signature}`, - paramdata: `0x${paramdata}` - }; -}; - -/** - * Decode the method inputs. - * - * @param methodAbi - The ABI of the method. - * @param paramdata - - */ -export const decodeMethodInput = ( - methodAbi: AbiItem, - paramdata?: string -): TokenValue[] => { - if (!methodAbi) { - throw new Error( - 'decodeMethodInput should receive valid method-specific ABI' - ); - } - - if (paramdata && paramdata.length) { - if (!isHex(paramdata)) { - throw new Error('Input to decodeMethodInput should be a hex value'); - } - - if (paramdata.substr(0, 2) === '0x') { - return decodeMethodInput(methodAbi, paramdata.slice(2)); - } - } - - return new Func(methodAbi) - .decodeInput(paramdata) - .map(decoded => decoded.value) as TokenValue[]; -}; - -/** - * Takes a method in form name(...,types) and returns the inferred abi definition. - * - * @param method - The method to convert to abi. - */ -export const methodToAbi = (method: string) => { - const length = method.length; - const typesStart = method.indexOf('('); - const typesEnd = method.indexOf(')'); - - if (typesStart === -1) { - throw new Error(`Missing start ( in call to decodeMethod with ${method}`); - } else if (typesEnd === -1) { - throw new Error(`Missing end ) in call to decodeMethod with ${method}`); - } else if (typesEnd < typesStart) { - throw new Error( - `End ) is before start ( in call to decodeMethod with ${method}` - ); - } else if (typesEnd !== length - 1) { - throw new Error( - `Extra characters after end ) in call to decodeMethod with ${method}` - ); - } - - const name = method.substr(0, typesStart); - const types = method - .substr(typesStart + 1, length - (typesStart + 1) - 1) - .split(','); - const inputs = types - .filter(_type => _type.length) - .map(_type => { - const type = fromParamType(toParamType(_type)); - - return { type }; - }); - - return { type: 'function', name, inputs }; -}; - -/** - * Decode fata from an ABI. - * - * @param inputTypes - The types of the inputs. - * @param data - The data passed to this ABI. - */ -export const abiDecode = (inputTypes: TokenTypeEnum[], data: string) => { - return decodeMethodInput( - { - inputs: inputTypes.map(type => { - return { type }; - }) - }, - data - ); -}; diff --git a/packages/api/src/util/encode.js b/packages/api/src/util/encode.js new file mode 100644 index 00000000..89f98a2b --- /dev/null +++ b/packages/api/src/util/encode.js @@ -0,0 +1,76 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const Abi = require('@parity/abi'); +const Func = require('@parity/abi/lib/spec/function'); + +const { abiDecode } = require('./decode'); +const { cleanupValue } = require('./format'); +const { sha3 } = require('./sha3'); + +function encodeMethodCallAbi (methodAbi = {}, values = []) { + const func = new Func(methodAbi); + const tokens = Abi.encodeTokens(func.inputParamTypes(), values); + const call = func.encodeCall(tokens); + + return `0x${call}`; +} + +function abiEncode (methodName, inputTypes, data) { + const result = encodeMethodCallAbi({ + name: methodName || '', + type: 'function', + inputs: inputTypes.map((type) => { + return { type }; + }) + }, data); + + return result; +} + +function abiUnencode (abi, data) { + const callsig = data.substr(2, 8); + const op = abi.find((field) => { + return field.type === 'function' && + abiSignature(field.name, field.inputs.map((input) => input.type)).substr(2, 8) === callsig; + }); + + if (!op) { + console.warn(`Unknown function ID: ${callsig}`); + return null; + } + + let argsByIndex = abiDecode(op.inputs.map((field) => field.type), '0x' + data.substr(10)) + .map((value, index) => cleanupValue(value, op.inputs[index].type)); + const argsByName = op.inputs.reduce((result, field, index) => { + result[field.name] = argsByIndex[index]; + + return result; + }, {}); + + return [op.name, argsByName, argsByIndex]; +} + +function abiSignature (name, inputs) { + return sha3(`${name}(${inputs.join()})`); +} + +module.exports = { + abiEncode, + abiSignature, + abiUnencode, + encodeMethodCallAbi +}; diff --git a/packages/api/src/util/encode.spec.js b/packages/api/src/util/encode.spec.js new file mode 100644 index 00000000..c294f35f --- /dev/null +++ b/packages/api/src/util/encode.spec.js @@ -0,0 +1,96 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/* eslint-disable no-unused-expressions */ + +const { abiEncode, abiUnencode, abiSignature, encodeMethodCallAbi } = require('./encode'); + +const ABI = { + type: 'function', + name: 'valid', + inputs: [ + { type: 'uint256' }, + { type: 'bool' } + ] +}; + +const RESULT = [ + 'f87fa141', + '0000000000000000000000000000000000000000000000000000000000000123', + '0000000000000000000000000000000000000000000000000000000000000001' +].join(''); +const VARIABLE = [ + '5a6fbce0', + 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + '0000000000000000000000000000000000000000000000000000000000000040', + '000000000000000000000000000000000000000000000000000000000000000f', + '687474703a2f2f666f6f2e6261722f0000000000000000000000000000000000' +].join(''); + +describe('util/encode', () => { + describe('encodeMethodCallAbi', () => { + it('encodes calls with the correct result', () => { + expect(encodeMethodCallAbi(ABI, [0x123, true])).to.equal(`0x${RESULT}`); + }); + }); + + describe('abiEncode', () => { + it('encodes calls with the correct result', () => { + expect(abiEncode('valid', ['uint256', 'bool'], [0x123, true])).to.equal(`0x${RESULT}`); + }); + + it('encodes variable values', () => { + expect( + abiEncode( + 'hintUrl', ['bytes32', 'string'], ['0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', 'http://foo.bar/'] + ) + ).to.equal(`0x${VARIABLE}`); + }); + + it('encodes only the data with null name', () => { + expect( + abiEncode(null, ['uint256', 'bool'], [0x123, true]) + ).to.equal(`0x${RESULT.substr(8)}`); + }); + }); + + describe('abiUnencode', () => { + it('decodes data correctly from abi', () => { + expect( + abiUnencode([{ + name: 'test', + type: 'function', + inputs: [ + { type: 'uint', name: 'arga' } + ] + }], '0x1acb6f7700000000000000000000000000000038') + ).to.deep.equal(['test', { arga: 56 }, [56]]); + }); + + it('returns null when function not found', () => { + expect(abiUnencode([], '0x12345678')).to.be.null; + }); + }); + + // Same example as in abi/util/signature.spec.js + describe('abiSignature', () => { + it('encodes baz(uint32,bool) correctly', () => { + expect( + abiSignature('baz', ['uint32', 'bool']) + ).to.equal('0xcdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2'); + }); + }); +}); diff --git a/packages/api/src/util/encode.spec.ts b/packages/api/src/util/encode.spec.ts deleted file mode 100644 index fb318b37..00000000 --- a/packages/api/src/util/encode.spec.ts +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { - abiEncode, - abiUnencode, - abiSignature, - encodeMethodCallAbi -} from './encode'; -import { AbiItem } from '@parity/abi'; - -const ABI: AbiItem = { - type: 'function', - name: 'valid', - inputs: [{ type: 'uint256' }, { type: 'bool' }] -}; - -const RESULT = [ - 'f87fa141', - '0000000000000000000000000000000000000000000000000000000000000123', - '0000000000000000000000000000000000000000000000000000000000000001' -].join(''); -const VARIABLE = [ - '5a6fbce0', - 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', - '0000000000000000000000000000000000000000000000000000000000000040', - '000000000000000000000000000000000000000000000000000000000000000f', - '687474703a2f2f666f6f2e6261722f0000000000000000000000000000000000' -].join(''); - -describe('util/encode', () => { - describe('encodeMethodCallAbi', () => { - it('encodes calls with the correct result', () => { - expect(encodeMethodCallAbi(ABI, [0x123, true])).toEqual(`0x${RESULT}`); - }); - }); - - describe('abiEncode', () => { - it('encodes calls with the correct result', () => { - expect(abiEncode('valid', ['uint256', 'bool'], [0x123, true])).toEqual( - `0x${RESULT}` - ); - }); - - it('encodes variable values', () => { - expect( - abiEncode( - 'hintUrl', - ['bytes32', 'string'], - [ - '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', - 'http://foo.bar/' - ] - ) - ).toEqual(`0x${VARIABLE}`); - }); - - it('encodes only the data with null name', () => { - expect(abiEncode(undefined, ['uint256', 'bool'], [0x123, true])).toEqual( - `0x${RESULT.substr(8)}` - ); - }); - }); - - describe('abiUnencode', () => { - it('decodes data correctly from abi', () => { - expect( - abiUnencode( - [ - { - name: 'test', - type: 'function', - inputs: [{ type: 'uint', name: 'arga' }] - } - ], - '0x1acb6f7700000000000000000000000000000038' - ) - ).toEqual(['test', { arga: 56 }, [56]]); - }); - - it('returns null when function not found', () => { - expect(abiUnencode([], '0x12345678')).toBe(null); - }); - }); - - // Same example as in abi/util/signature.spec.js - describe('abiSignature', () => { - it('encodes baz(uint32,bool) correctly', () => { - expect(abiSignature('baz', ['uint32', 'bool'])).toEqual( - '0xcdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2' - ); - }); - }); -}); diff --git a/packages/api/src/util/encode.ts b/packages/api/src/util/encode.ts deleted file mode 100644 index ae4ddb24..00000000 --- a/packages/api/src/util/encode.ts +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import Abi, { - AbiItem, - AbiObject, - TokenTypeEnum, - TokenValue -} from '@parity/abi'; -import Func from '@parity/abi/lib/spec/function'; - -import { abiDecode } from './decode'; -import { cleanupValue } from './format'; -import { sha3 } from './sha3'; - -/** - * Encode a method call. - * - * @param methodAbi - The method's ABI. - * @param values - The values that are passed to this method. - */ -export const encodeMethodCallAbi = ( - methodAbi: AbiItem, - values: TokenValue[] = [] -) => { - const func = new Func(methodAbi); - const tokens = Abi.encodeTokens(func.inputParamTypes(), values); - const call = func.encodeCall(tokens); - - return `0x${call}`; -}; - -/** - * Formats correctly a method call to be passed to {@link encodeMethodCallAbi}. - * - * @param methodName - The method name to encode. - * @param inputTypes - The method's inputs types. - * @param data - The data that is passed to this method. - */ -export const abiEncode = ( - methodName: string | undefined, - inputTypes: TokenTypeEnum[], - data: TokenValue[] -) => { - const result = encodeMethodCallAbi( - { - name: methodName || '', - type: 'function', - inputs: inputTypes.map(type => { - return { type }; - }) - }, - data - ); - - return result; -}; - -/** - * Unencode a method. - * - * @param abi - The Abi to unencode. - * @param data - The data passed to this method. - */ -export const abiUnencode = (abi: AbiObject, data: string) => { - const callsig = data.substr(2, 8); - const op = abi.find(field => { - return ( - field.type === 'function' && - !!field.inputs && - abiSignature(field.name, field.inputs.map(input => input.type)).substr( - 2, - 8 - ) === callsig - ); - }); - - if (!op || !op.inputs) { - console.warn(`Unknown function ID: ${callsig}`); - return null; - } - - const argsByIndex = abiDecode( - op.inputs.map(field => field.type), - '0x' + data.substr(10) - ).map( - (value, index) => - cleanupValue(value as string, (op.inputs as any)[index].type) // TODO Remove `as any` here - ); - const argsByName = op.inputs.reduce( - (result, field, index) => { - if (!field.name) { - throw new Error( - `abiUnencode: input at index ${index} with type ${ - field.type - } doesn't have a name.` - ); - } - result[field.name] = argsByIndex[index]; - - return result; - }, - {} as { [index: string]: TokenValue } - ); - - return [op.name, argsByName, argsByIndex]; -}; - -/** - * Get the signature of an Abi method. - * - * @param name - The name of the method. - * @param inputs - The inputs' types of this method. - */ -export const abiSignature = (name: string | undefined, inputs: string[]) => { - return sha3(`${name}(${inputs.join()})`); -}; diff --git a/packages/api/src/util/format.js b/packages/api/src/util/format.js new file mode 100644 index 00000000..12a1db18 --- /dev/null +++ b/packages/api/src/util/format.js @@ -0,0 +1,123 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { range } = require('lodash'); + +function bytesToHex (bytes) { + return '0x' + Buffer.from(bytes).toString('hex'); +} + +function cleanupValue (value, type) { + // TODO: make work with arbitrary depth arrays + if (value instanceof Array && type.match(/bytes[0-9]+/)) { + // figure out if it's an ASCII string hiding in there: + let ascii = ''; + + for (let index = 0, ended = false; index < value.length && ascii !== null; ++index) { + const val = value[index]; + + if (val === 0) { + ended = true; + } else { + ascii += String.fromCharCode(val); + } + + if ((ended && val !== 0) || (!ended && (val < 32 || val >= 128))) { + ascii = null; + } + } + + value = ascii === null + ? bytesToHex(value) + : ascii; + } + + if (type.substr(0, 4) === 'uint' && +type.substr(4) <= 48) { + value = +value; + } + + return value; +} + +function hexToBytes (hex) { + const raw = toHex(hex).slice(2); + const bytes = []; + + for (let i = 0; i < raw.length; i += 2) { + bytes.push(parseInt(raw.substr(i, 2), 16)); + } + + return bytes; +} + +function hexToAscii (hex) { + const bytes = hexToBytes(hex); + const str = bytes.map((byte) => String.fromCharCode(byte)).join(''); + + return str; +} + +function bytesToAscii (bytes) { + return bytes.map((b) => String.fromCharCode(b % 512)).join(''); +} + +function asciiToHex (string) { + let result = '0x'; + + for (let i = 0; i < string.length; ++i) { + result += ('0' + string.charCodeAt(i).toString(16)).substr(-2); + } + + return result; +} + +function padRight (input, length) { + const hexLength = length * 2; + const value = toHex(input).substr(2, hexLength); + + return '0x' + value + range(hexLength - value.length).map(() => '0').join(''); +} + +function padLeft (input, length) { + const hexLength = length * 2; + const value = toHex(input).substr(2, hexLength); + + return '0x' + range(hexLength - value.length).map(() => '0').join('') + value; +} + +function toHex (str) { + if (str && str.toString) { + str = str.toString(16); + } + + if (str && str.substr(0, 2) === '0x') { + return str.toLowerCase(); + } + + return `0x${(str || '').toLowerCase()}`; +} + +module.exports = { + asciiToHex, + bytesToAscii, + bytesToHex, + cleanupValue, + hexToAscii, + hexToBytes, + padLeft, + padRight, + toHex +}; diff --git a/packages/api/src/util/format.spec.js b/packages/api/src/util/format.spec.js new file mode 100644 index 00000000..9d8da384 --- /dev/null +++ b/packages/api/src/util/format.spec.js @@ -0,0 +1,114 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { bytesToHex, cleanupValue, hexToBytes, hexToAscii, bytesToAscii, asciiToHex, padLeft, padRight } = require('./format'); + +describe('util/format', () => { + describe('bytesToHex', () => { + it('correctly converts an empty array', () => { + expect(bytesToHex([])).to.equal('0x'); + }); + + it('correctly converts a non-empty array', () => { + expect(bytesToHex([0, 15, 16])).to.equal('0x000f10'); + }); + }); + + describe('cleanupValue', () => { + it('returns unknown values as the original', () => { + expect(cleanupValue('original', 'unknown')).to.equal('original'); + }); + + it('returns ascii arrays as ascii', () => { + expect(cleanupValue([97, 115, 99, 105, 105, 0], 'bytes32')).to.equal('ascii'); + }); + + it('returns non-ascii arrays as hex strings', () => { + expect(cleanupValue([97, 200, 0, 0], 'bytes4')).to.equal('0x61c80000'); + }); + + it('returns uint (>48) as the original', () => { + expect(cleanupValue('original', 'uint49')).to.equal('original'); + }); + + it('returns uint (<=48) as the number value', () => { + expect(cleanupValue('12345', 'uint48')).to.equal(12345); + }); + }); + + describe('hexToBytes', () => { + it('correctly converts an empty string', () => { + expect(hexToBytes('')).to.deep.equal([]); + expect(hexToBytes('0x')).to.deep.equal([]); + }); + + it('correctly converts a non-empty string', () => { + expect(hexToBytes('0x000f10')).to.deep.equal([0, 15, 16]); + }); + }); + + describe('asciiToHex', () => { + it('correctly converts an empty string', () => { + expect(asciiToHex('')).to.equal('0x'); + }); + + it('correctly converts a non-empty string', () => { + expect(asciiToHex('abc')).to.equal('0x616263'); + expect(asciiToHex('a\nb')).to.equal('0x610a62'); + }); + + it('correctly converts where charCode < 0x10', () => { + expect( + asciiToHex( + [32, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0].map((v) => String.fromCharCode(v)).join('') + ) + ).to.equal('0x20100f0e0d0c0b0a09080706050403020100'); + }); + }); + + describe('hexToAscii', () => { + it('correctly converts an empty string', () => { + expect(hexToAscii('')).to.equal(''); + expect(hexToAscii('0x')).to.equal(''); + }); + + it('correctly converts a non-empty string', () => { + expect(hexToAscii('0x616263')).to.equal('abc'); + }); + }); + + describe('bytesToAscii', () => { + it('correctly converts an empty string', () => { + expect(bytesToAscii([])).to.equal(''); + }); + + it('correctly converts a non-empty string', () => { + expect(bytesToAscii([97, 98, 99])).to.equal('abc'); + }); + }); + + describe('padLeft', () => { + it('correctly pads to the number of hex digits', () => { + expect(padLeft('ab', 4)).to.equal('0x000000ab'); + }); + }); + + describe('padRight', () => { + it('correctly pads to the number of hex digits', () => { + expect(padRight('ab', 4)).to.equal('0xab000000'); + }); + }); +}); diff --git a/packages/api/src/util/format.spec.ts b/packages/api/src/util/format.spec.ts deleted file mode 100644 index 8b3d20e4..00000000 --- a/packages/api/src/util/format.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { - bytesToHex, - cleanupValue, - hexToBytes, - hexToAscii, - bytesToAscii, - asciiToHex, - padLeft, - padRight -} from './format'; - -describe('util/format', () => { - /** - * @test {bytesToHex} - */ - describe('bytesToHex', () => { - it('correctly converts an empty array', () => { - expect(bytesToHex([])).toEqual('0x'); - }); - - it('correctly converts a non-empty array', () => { - expect(bytesToHex([0, 15, 16])).toEqual('0x000f10'); - }); - }); - - /** - * @test {cleanupValue} - */ - describe('cleanupValue', () => { - it('returns unknown values as the original', () => { - expect(cleanupValue('original', 'unknown')).toEqual('original'); - }); - - it('returns ascii arrays as ascii', () => { - expect(cleanupValue([97, 115, 99, 105, 105, 0], 'bytes32')).toEqual( - 'ascii' - ); - }); - - it('returns non-ascii arrays as hex strings', () => { - expect(cleanupValue([97, 200, 0, 0], 'bytes4')).toEqual('0x61c80000'); - }); - - it('returns uint (>48) as the original', () => { - expect(cleanupValue('original', 'uint49')).toEqual('original'); - }); - - it('returns uint (<=48) as the number value', () => { - expect(cleanupValue('12345', 'uint48')).toEqual(12345); - }); - }); - - /** - * @test {hexToBytes} - */ - describe('hexToBytes', () => { - it('correctly converts an empty string', () => { - expect(hexToBytes('')).toEqual([]); - expect(hexToBytes('0x')).toEqual([]); - }); - - it('correctly converts a non-empty string', () => { - expect(hexToBytes('0x000f10')).toEqual([0, 15, 16]); - }); - }); - - /** - * @test {asciiToHex} - */ - describe('asciiToHex', () => { - it('correctly converts an empty string', () => { - expect(asciiToHex('')).toEqual('0x'); - }); - - it('correctly converts a non-empty string', () => { - expect(asciiToHex('abc')).toEqual('0x616263'); - expect(asciiToHex('a\nb')).toEqual('0x610a62'); - }); - - it('correctly converts where charCode < 0x10', () => { - expect( - asciiToHex( - [32, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] - .map(v => String.fromCharCode(v)) - .join('') - ) - ).toEqual('0x20100f0e0d0c0b0a09080706050403020100'); - }); - }); - - /** - * @test {hexToAscii} - */ - describe('hexToAscii', () => { - it('correctly converts an empty string', () => { - expect(hexToAscii('')).toEqual(''); - expect(hexToAscii('0x')).toEqual(''); - }); - - it('correctly converts a non-empty string', () => { - expect(hexToAscii('0x616263')).toEqual('abc'); - }); - }); - - /** - * @test {bytesToAscii} - */ - describe('bytesToAscii', () => { - it('correctly converts an empty string', () => { - expect(bytesToAscii([])).toEqual(''); - }); - - it('correctly converts a non-empty string', () => { - expect(bytesToAscii([97, 98, 99])).toEqual('abc'); - }); - }); - - /** - * @test {padLeft} - */ - describe('padLeft', () => { - it('correctly pads to the number of hex digits', () => { - expect(padLeft('ab', 4)).toEqual('0x000000ab'); - }); - }); - - /** - * @test {padRight} - */ - describe('padRight', () => { - it('correctly pads to the number of hex digits', () => { - expect(padRight('ab', 4)).toEqual('0xab000000'); - }); - }); -}); diff --git a/packages/api/src/util/format.ts b/packages/api/src/util/format.ts deleted file mode 100644 index f7e800bf..00000000 --- a/packages/api/src/util/format.ts +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { Bytes } from '../types'; -import { range } from 'lodash'; - -/** - * Convert a bytes array to a hexadecimal string. - * - * @param bytes - The bytes array to convert to hexadecimal. - */ -export const bytesToHex = (bytes: Bytes) => { - return '0x' + Buffer.from(bytes).toString('hex'); -}; - -/** - * Clean the value if it's cleanable: - * - ASCII arrays are returned as ASCII strings - * - non-ASCII arrays are converted to hex - * - uint (<=48) are converted to numbers - * - * @param value - The value to clean. - * @param type - The type of the value. - */ -export const cleanupValue = (value: string | number | Bytes, type: string) => { - // TODO: make work with arbitrary depth arrays - if (value instanceof Array && type.match(/bytes[0-9]+/)) { - // figure out if it's an ASCII string hiding in there: - let ascii: string | null = ''; - let ended = false; - - for (let index = 0; index < value.length && ascii !== null; ++index) { - const val = value[index]; - - if (val === 0) { - ended = true; - } else { - ascii += String.fromCharCode(val); - } - - if ((ended && val !== 0) || (!ended && (val < 32 || val >= 128))) { - ascii = null; - } - } - - value = ascii === null ? bytesToHex(value) : ascii; - } - - if (type.substr(0, 4) === 'uint' && +type.substr(4) <= 48) { - value = +value; - } - - return value; -}; - -/** - * Convert a hexadecimal string to a bytes array. - * - * @param hex - The hex string to convert. - */ -export const hexToBytes = (hex: string) => { - const raw = toHex(hex).slice(2); - const bytes = []; - - for (let i = 0; i < raw.length; i += 2) { - bytes.push(parseInt(raw.substr(i, 2), 16)); - } - - return bytes; -}; - -/** - * Convert a hexadecimal string to an ASCII string. - * - * @param hex - The hex string to convert. - */ -export const hexToAscii = (hex: string) => { - const bytes = hexToBytes(hex); - const str = bytes.map(byte => String.fromCharCode(byte)).join(''); - - return str; -}; - -/** - * Convert a bytes array to an ASCII string. - * - * @param bytes - The bytes array to convert. - */ -export const bytesToAscii = (bytes: Bytes) => - bytes.map(b => String.fromCharCode(b % 512)).join(''); - -/** - * Convert an ASCII string to a hexadecimal string. - * - * @param string - The ASCII string to convert. - */ -export const asciiToHex = (baseString: string) => { - let result = '0x'; - - for (let i = 0; i < baseString.length; ++i) { - result += ('0' + baseString.charCodeAt(i).toString(16)).substr(-2); - } - - return result; -}; - -/** - * Pad the input string with `length` zeros on the right. - * - * @param input - The input string to pad. - * @param length - The number of zeros to pad. - */ -export const padRight = (input: string, length: number) => { - const hexLength = length * 2; - const value = toHex(input).substr(2, hexLength); - - return ( - '0x' + - value + - range(hexLength - value.length) - .map(() => '0') - .join('') - ); -}; - -/** - * Pad the input string with `length` zeros on the left. - * - * @param input - The input string to pad. - * @param length - The number of zeros to pad. - */ -export const padLeft = (input: string | undefined, length: number) => { - const hexLength = length * 2; - const value = toHex(input).substr(2, hexLength); - - return ( - '0x' + - range(hexLength - value.length) - .map(() => '0') - .join('') + - value - ); -}; - -/** - * Convert a string to hexadecimal. - * - * @param str - The string to convert. - */ -export const toHex = (str?: string) => { - if (str && str.toString) { - // TODO string has no toString(16) - // @ts-ignore - str = str.toString(16); - } - - if (str && str.substr(0, 2) === '0x') { - return str.toLowerCase(); - } - - return `0x${(str || '').toLowerCase()}`; -}; diff --git a/packages/api/src/util/identity.js b/packages/api/src/util/identity.js new file mode 100644 index 00000000..37d7f4bb --- /dev/null +++ b/packages/api/src/util/identity.js @@ -0,0 +1,34 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const blockies = require('blockies'); + +// jsdom doesn't have all the browser features, blockies fail +const TEST_ENV = process.env.NODE_ENV === 'test'; + +function createIdentityImg (address, scale = 8) { + return TEST_ENV + ? 'test-createIdentityImg' + : blockies({ + seed: (address || '').toLowerCase(), + size: 8, + scale + }).toDataURL(); +} + +module.exports = { + createIdentityImg +}; diff --git a/packages/api/src/util/index.js b/packages/api/src/util/index.js new file mode 100644 index 00000000..be8adfe6 --- /dev/null +++ b/packages/api/src/util/index.js @@ -0,0 +1,51 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { isAddress, toChecksumAddress } = require('./address'); +const { abiDecode, decodeCallData, decodeMethodInput, methodToAbi } = require('./decode'); +const { abiEncode, abiUnencode, abiSignature, encodeMethodCallAbi } = require('./encode'); +const { bytesToHex, hexToAscii, asciiToHex, cleanupValue, hexToBytes } = require('./format'); +const { fromWei, toWei } = require('./wei'); +const { sha3 } = require('./sha3'); +const { isArray, isFunction, isHex, isInstanceOf, isString } = require('./types'); +const { createIdentityImg } = require('./identity'); + +module.exports = { + abiDecode, + abiEncode, + abiUnencode, + abiSignature, + cleanupValue, + isAddressValid: isAddress, + isArray, + isFunction, + isHex, + isInstanceOf, + isString, + bytesToHex, + hexToAscii, + hexToBytes, + asciiToHex, + createIdentityImg, + decodeCallData, + decodeMethodInput, + encodeMethodCallAbi, + methodToAbi, + fromWei, + toChecksumAddress, + toWei, + sha3 +}; diff --git a/packages/api/src/util/index.ts b/packages/api/src/util/index.ts deleted file mode 100644 index cef9293c..00000000 --- a/packages/api/src/util/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -export * from './address'; -export * from './decode'; -export * from './encode'; -export * from './format'; -export * from './sha3'; -export * from './types'; -export * from './wei'; diff --git a/packages/api/src/util/sha3.js b/packages/api/src/util/sha3.js new file mode 100644 index 00000000..0048eb28 --- /dev/null +++ b/packages/api/src/util/sha3.js @@ -0,0 +1,40 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { keccak_256 } = require('js-sha3'); // eslint-disable-line + +const { hexToBytes } = require('./format'); +const { isHex } = require('./types'); + +function sha3 (value, options) { + const forceHex = options && options.encoding === 'hex'; + + if (forceHex || (!options && isHex(value))) { + const bytes = hexToBytes(value); + + return sha3(bytes); + } + + const hash = keccak_256(value); + + return `0x${hash}`; +} + +sha3.text = (val) => sha3(val, { encoding: 'raw' }); + +module.exports = { + sha3 +}; diff --git a/packages/api/src/util/sha3.spec.js b/packages/api/src/util/sha3.spec.js new file mode 100644 index 00000000..49926659 --- /dev/null +++ b/packages/api/src/util/sha3.spec.js @@ -0,0 +1,46 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { sha3 } = require('./sha3'); + +describe('util/sha3', () => { + describe('sha3', () => { + it('constructs a correct sha3 value', () => { + expect(sha3('jacogr')).to.equal('0x2f4ff4b5a87abbd2edfed699db48a97744e028c7f7ce36444d40d29d792aa4dc'); + }); + + it('constructs a correct sha3 encoded as hex', () => { + const key = '000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298' + '0000000000000000000000000000000000000000000000000000000000000001'; + + expect(sha3(key, { encoding: 'hex' })).to.equal('0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9'); + expect(sha3(`0x${key}`, { encoding: 'hex' })).to.equal('0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9'); + }); + + it('constructs a correct sha3 from Uint8Array', () => { + expect(sha3('01020304', { encoding: 'hex' })).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); + expect(sha3(Uint8Array.from([1, 2, 3, 4]))).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); + }); + + it('should interpret as bytes by default', () => { + expect(sha3('0x01020304')).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); + }); + + it('should force text if option is passed', () => { + expect(sha3('0x01020304', { encoding: 'raw' })).to.equal('0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869'); + expect(sha3.text('0x01020304')).to.equal('0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869'); + }); + }); +}); diff --git a/packages/api/src/util/sha3.spec.ts b/packages/api/src/util/sha3.spec.ts deleted file mode 100644 index 830e1510..00000000 --- a/packages/api/src/util/sha3.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { sha3, sha3Text } from './sha3'; - -describe('util/sha3', () => { - describe('sha3', () => { - it('constructs a correct sha3 value', () => { - expect(sha3('jacogr')).toEqual( - '0x2f4ff4b5a87abbd2edfed699db48a97744e028c7f7ce36444d40d29d792aa4dc' - ); - }); - - it('constructs a correct sha3 encoded as hex', () => { - const key = - '000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298' + - '0000000000000000000000000000000000000000000000000000000000000001'; - - expect(sha3(key, { encoding: 'hex' })).toEqual( - '0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9' - ); - expect(sha3(`0x${key}`, { encoding: 'hex' })).toEqual( - '0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9' - ); - }); - - it('constructs a correct sha3 from Uint8Array', () => { - expect(sha3('01020304', { encoding: 'hex' })).toEqual( - '0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b' - ); - // @ts-ignore TODO Add Uint8Array as Bytes type too - expect(sha3(Uint8Array.from([1, 2, 3, 4]))).toEqual( - '0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b' - ); - }); - - it('should interpret as bytes by default', () => { - expect(sha3('0x01020304')).toEqual( - '0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b' - ); - }); - - it('should force text if option is passed', () => { - expect(sha3('0x01020304', { encoding: 'raw' })).toEqual( - '0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869' - ); - expect(sha3Text('0x01020304')).toEqual( - '0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869' - ); - }); - }); -}); diff --git a/packages/api/src/util/sha3.ts b/packages/api/src/util/sha3.ts deleted file mode 100644 index 8d901cb9..00000000 --- a/packages/api/src/util/sha3.ts +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { keccak_256 } from 'js-sha3'; - -import { hexToBytes } from './format'; -import { isHex } from './types'; -import { Bytes } from '../types'; - -type Encoding = 'hex' | 'raw'; - -/** - * - * @param value - The value to hash - * @param options - Set the encoding in the options, encoding can be `'hex'` - * or `'raw'`. - */ -export const sha3 = ( - value: string | Bytes, - options?: { encoding: Encoding } -): string => { - const forceHex = options && options.encoding === 'hex'; - - if (forceHex || (!options && isHex(value))) { - const bytes = hexToBytes(value as string); - - return sha3(bytes); - } - - const hash = keccak_256(value); - - return `0x${hash}`; -}; - -export const sha3Text = (val: string) => sha3(val, { encoding: 'raw' }); diff --git a/packages/api/src/util/types.js b/packages/api/src/util/types.js new file mode 100644 index 00000000..a9a70d86 --- /dev/null +++ b/packages/api/src/util/types.js @@ -0,0 +1,70 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const HEXDIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; + +function isArray (test) { + return Object.prototype.toString.call(test) === '[object Array]'; +} + +function isError (test) { + return Object.prototype.toString.call(test) === '[object Error]'; +} + +function isFunction (test) { + return Object.prototype.toString.call(test) === '[object Function]'; +} + +function isHex (_test) { + if (!isString(_test)) { + return false; + } + + if (_test.substr(0, 2) === '0x') { + return isHex(_test.slice(2)); + } + + const test = _test.toLowerCase(); + let hex = true; + + for (let index = 0; hex && index < test.length; index++) { + hex = HEXDIGITS.includes(test[index]); + } + + return hex; +} + +function isObject (test) { + return Object.prototype.toString.call(test) === '[object Object]'; +} + +function isString (test) { + return Object.prototype.toString.call(test) === '[object String]'; +} + +function isInstanceOf (test, clazz) { + return test instanceof clazz; +} + +module.exports = { + isArray, + isError, + isFunction, + isHex, + isInstanceOf, + isObject, + isString +}; diff --git a/packages/api/src/util/types.spec.js b/packages/api/src/util/types.spec.js new file mode 100644 index 00000000..66e8e23c --- /dev/null +++ b/packages/api/src/util/types.spec.js @@ -0,0 +1,120 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/* eslint-disable no-unused-expressions */ + +const sinon = require('sinon'); + +const { isArray, isError, isFunction, isHex, isInstanceOf, isObject, isString } = require('./types'); +const Eth = require('../rpc/eth'); + +describe('util/types', () => { + describe('isArray', () => { + it('correctly identifies null as false', () => { + expect(isArray(null)).to.be.false; + }); + + it('correctly identifies empty array as true', () => { + expect(isArray([])).to.be.true; + }); + + it('correctly identifies array as true', () => { + expect(isArray([1, 2, 3])).to.be.true; + }); + }); + + describe('isError', () => { + it('correctly identifies null as false', () => { + expect(isError(null)).to.be.false; + }); + + it('correctly identifies Error as true', () => { + expect(isError(new Error('an error'))).to.be.true; + }); + }); + + describe('isFunction', () => { + it('correctly identifies null as false', () => { + expect(isFunction(null)).to.be.false; + }); + + it('correctly identifies function as true', () => { + expect(isFunction(sinon.stub())).to.be.true; + }); + }); + + describe('isHex', () => { + it('correctly identifies hex by leading 0x', () => { + expect(isHex('0x123')).to.be.true; + }); + + it('correctly identifies hex without leading 0x', () => { + expect(isHex('123')).to.be.true; + }); + + it('correctly identifies non-hex values', () => { + expect(isHex('123j')).to.be.false; + }); + + it('correctly indentifies non-string values', () => { + expect(isHex(false)).to.be.false; + expect(isHex()).to.be.false; + expect(isHex([1, 2, 3])).to.be.false; + }); + }); + + describe('isInstanceOf', () => { + it('correctly identifies build-in instanceof', () => { + expect(isInstanceOf(new String('123'), String)).to.be.true; // eslint-disable-line no-new-wrappers + }); + + it('correctly identifies own instanceof', () => { + expect(isInstanceOf(new Eth({}), Eth)).to.be.true; + }); + + it('correctly reports false for own', () => { + expect(isInstanceOf({}, Eth)).to.be.false; + }); + }); + + describe('isObject', () => { + it('correctly identifies empty object as object', () => { + expect(isObject({})).to.be.true; + }); + + it('correctly identifies non-empty object as object', () => { + expect(isObject({ data: '123' })).to.be.true; + }); + + it('correctly identifies Arrays as non-objects', () => { + expect(isObject([1, 2, 3])).to.be.false; + }); + + it('correctly identifies Strings as non-objects', () => { + expect(isObject('123')).to.be.false; + }); + }); + + describe('isString', () => { + it('correctly identifies empty string as string', () => { + expect(isString('')).to.be.true; + }); + + it('correctly identifies string as string', () => { + expect(isString('123')).to.be.true; + }); + }); +}); diff --git a/packages/api/src/util/types.spec.ts b/packages/api/src/util/types.spec.ts deleted file mode 100644 index 9f04621a..00000000 --- a/packages/api/src/util/types.spec.ts +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { - isArray, - isError, - isFunction, - isHex, - isInstanceOf, - isObject, - isString -} from './types'; -const Eth = require('../rpc/eth'); - -describe('util/types', () => { - describe('isArray', () => { - it('correctly identifies null as false', () => { - expect(isArray(null)).toBe(false); - }); - - it('correctly identifies empty array as true', () => { - expect(isArray([])).toBe(true); - }); - - it('correctly identifies array as true', () => { - expect(isArray([1, 2, 3])).toBe(true); - }); - }); - - describe('isError', () => { - it('correctly identifies null as false', () => { - expect(isError(null)).toBe(false); - }); - - it('correctly identifies Error as true', () => { - expect(isError(new Error('an error'))).toBe(true); - }); - }); - - describe('isFunction', () => { - it('correctly identifies null as false', () => { - expect(isFunction(null)).toBe(false); - }); - - it('correctly identifies function as true', () => { - expect(isFunction(jest.fn())).toBe(true); - }); - }); - - describe('isHex', () => { - it('correctly identifies hex by leading 0x', () => { - expect(isHex('0x123')).toBe(true); - }); - - it('correctly identifies hex without leading 0x', () => { - expect(isHex('123')).toBe(true); - }); - - it('correctly identifies non-hex values', () => { - expect(isHex('123j')).toBe(false); - }); - - it('correctly indentifies non-string values', () => { - expect(isHex(false)).toBe(false); - expect(isHex(undefined)).toBe(false); - expect(isHex([1, 2, 3])).toBe(false); - }); - }); - - describe('isInstanceOf', () => { - it('correctly identifies build-in instanceof', () => { - expect(isInstanceOf(new String('123'), String)).toBe(true); - }); - - it('correctly identifies own instanceof', () => { - expect(isInstanceOf(new Eth({}), Eth)).toBe(true); - }); - - it('correctly reports false for own', () => { - expect(isInstanceOf({}, Eth)).toBe(false); - }); - }); - - describe('isObject', () => { - it('correctly identifies empty object as object', () => { - expect(isObject({})).toBe(true); - }); - - it('correctly identifies non-empty object as object', () => { - expect(isObject({ data: '123' })).toBe(true); - }); - - it('correctly identifies Arrays as non-objects', () => { - expect(isObject([1, 2, 3])).toBe(false); - }); - - it('correctly identifies Strings as non-objects', () => { - expect(isObject('123')).toBe(false); - }); - }); - - describe('isString', () => { - it('correctly identifies empty string as string', () => { - expect(isString('')).toBe(true); - }); - - it('correctly identifies string as string', () => { - expect(isString('123')).toBe(true); - }); - }); -}); diff --git a/packages/api/src/util/types.ts b/packages/api/src/util/types.ts deleted file mode 100644 index 46615966..00000000 --- a/packages/api/src/util/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -export * from '@parity/abi/lib/util/types'; diff --git a/packages/api/src/util/wei.js b/packages/api/src/util/wei.js new file mode 100644 index 00000000..d52111ff --- /dev/null +++ b/packages/api/src/util/wei.js @@ -0,0 +1,43 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const BigNumber = require('bignumber.js'); + +const UNITS = ['wei', 'ada', 'babbage', 'shannon', 'szabo', 'finney', 'ether', 'kether', 'mether', 'gether', 'tether']; + +function _getUnitMultiplier (unit) { + const position = UNITS.indexOf(unit.toLowerCase()); + + if (position === -1) { + throw new Error(`Unknown unit ${unit} passed to wei formatter`); + } + + return Math.pow(10, position * 3); +} + +function fromWei (value, unit = 'ether') { + return new BigNumber(value).div(_getUnitMultiplier(unit)); +} + +function toWei (value, unit = 'ether') { + return new BigNumber(value).mul(_getUnitMultiplier(unit)); +} + +module.exports = { + _getUnitMultiplier, + fromWei, + toWei +}; diff --git a/packages/api/src/util/wei.spec.js b/packages/api/src/util/wei.spec.js new file mode 100644 index 00000000..e45fe12f --- /dev/null +++ b/packages/api/src/util/wei.spec.js @@ -0,0 +1,57 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { _getUnitMultiplier, fromWei, toWei } = require('./wei'); + +describe('util/wei', () => { + describe('_getUnitMultiplier', () => { + it('returns 10^0 for wei', () => { + expect(_getUnitMultiplier('wei')).to.equal(Math.pow(10, 0)); + }); + + it('returns 10^15 for finney', () => { + expect(_getUnitMultiplier('finney')).to.equal(Math.pow(10, 15)); + }); + + it('returns 10^18 for ether', () => { + expect(_getUnitMultiplier('ether')).to.equal(Math.pow(10, 18)); + }); + + it('throws an error on invalid units', () => { + expect(() => _getUnitMultiplier('invalid')).to.throw(/passed to wei formatter/); + }); + }); + + describe('fromWei', () => { + it('formats into ether when nothing specified', () => { + expect(fromWei('1230000000000000000').toString()).to.equal('1.23'); + }); + + it('formats into finney when specified', () => { + expect(fromWei('1230000000000000000', 'finney').toString()).to.equal('1230'); + }); + }); + + describe('toWei', () => { + it('formats from ether when nothing specified', () => { + expect(toWei(1.23).toString()).to.equal('1230000000000000000'); + }); + + it('formats from finney when specified', () => { + expect(toWei(1230, 'finney').toString()).to.equal('1230000000000000000'); + }); + }); +}); diff --git a/packages/api/src/util/wei.spec.ts b/packages/api/src/util/wei.spec.ts deleted file mode 100644 index 8941c780..00000000 --- a/packages/api/src/util/wei.spec.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import { EtherDenomination } from '../types'; -import { _getUnitMultiplier, fromWei, toWei } from './wei'; - -describe('util/wei', () => { - /** - * @test {_getUnitMultiplier} - */ - describe('_getUnitMultiplier', () => { - it('returns 10^0 for wei', () => { - expect(_getUnitMultiplier('wei')).toEqual(Math.pow(10, 0)); - }); - - it('returns 10^15 for finney', () => { - expect(_getUnitMultiplier('finney')).toEqual(Math.pow(10, 15)); - }); - - it('returns 10^18 for ether', () => { - expect(_getUnitMultiplier('ether')).toEqual(Math.pow(10, 18)); - }); - - it('throws an error on invalid units', () => { - expect(() => _getUnitMultiplier('invalid' as EtherDenomination)).toThrow( - /passed to wei formatter/ - ); - }); - }); - - /** - * @test {fromWei} - */ - describe('fromWei', () => { - it('formats into ether when nothing specified', () => { - expect(fromWei('1230000000000000000').toString()).toEqual('1.23'); - }); - - it('formats into finney when specified', () => { - expect(fromWei('1230000000000000000', 'finney').toString()).toEqual( - '1230' - ); - }); - }); - - /** - * @test {toWei} - */ - describe('toWei', () => { - it('formats from ether when nothing specified', () => { - expect(toWei(1.23).toString()).toEqual('1230000000000000000'); - }); - - it('formats from finney when specified', () => { - expect(toWei(1230, 'finney').toString()).toEqual('1230000000000000000'); - }); - }); -}); diff --git a/packages/api/src/util/wei.ts b/packages/api/src/util/wei.ts deleted file mode 100644 index ac54742a..00000000 --- a/packages/api/src/util/wei.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. -// -// SPDX-License-Identifier: MIT - -import BigNumber from 'bignumber.js'; - -import { EtherDenomination } from '../types'; - -const UNITS: EtherDenomination[] = [ - 'wei', - 'ada', - 'babbage', - 'shannon', - 'szabo', - 'finney', - 'ether', - 'kether', - 'mether', - 'gether', - 'tether' -]; - -/** - * Returns the multiplication factor from wei to another ether denomination. - * - * @param unit - An ether denomiation. - * @example - * _getUnitMultiplier('wei'); // 1 - * _getUnitMultiplier('ether'); // 10^^18 - * @ignore - */ -export const _getUnitMultiplier = (unit: EtherDenomination) => { - const position = UNITS.indexOf(unit.toLowerCase() as EtherDenomination); - - if (position === -1) { - throw new Error(`Unknown unit ${unit} passed to wei formatter`); - } - - return Math.pow(10, position * 3); -}; - -/** - * Convert from wei to another ether denomination. - * - * @param value - The value in wei. - * @param unit - The ether denomination to convert to. - */ -export const fromWei = ( - value: string | number | BigNumber, - unit: EtherDenomination = 'ether' -) => new BigNumber(value).dividedBy(_getUnitMultiplier(unit)); - -/** - * Convert a value from an ether denomination to wei. - * - * @param value - The value in the ether denomination. - * @param unit - The ether denomination to convert to. - */ -export const toWei = ( - value: string | number | BigNumber, - unit: EtherDenomination = 'ether' -) => new BigNumber(value).multipliedBy(_getUnitMultiplier(unit)); diff --git a/packages/api/test/types.js b/packages/api/test/types.js new file mode 100644 index 00000000..2dbcbeb0 --- /dev/null +++ b/packages/api/test/types.js @@ -0,0 +1,50 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const BigNumber = require('bignumber.js'); + +const { isFunction, isInstanceOf } = require('../src/util/types'); +const { isAddress } = require('../src/util/address'); + +const ZEROS = '000000000000000000000000000000000000000000000000000000000000'; + +function isBigNumber (test) { + return isInstanceOf(test, BigNumber); +} + +function isBoolean (test) { + return Object.prototype.toString.call(test) === '[object Boolean]'; +} + +function isHexNumber (_test) { + if (_test.substr(0, 2) !== '0x') { + return false; + } + + const test = _test.substr(2); + const hex = `${ZEROS}${(new BigNumber(_test, 16)).toString(16)}`.slice(-1 * test.length); + + return hex === test; +} + +module.exports = { + isAddress, + isBigNumber, + isBoolean, + isFunction, + isHexNumber, + isInstanceOf +}; diff --git a/yarn.lock b/yarn.lock index bb65ae55..80dff594 100644 --- a/yarn.lock +++ b/yarn.lock @@ -141,14 +141,7 @@ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf" integrity sha512-/UMY+2GkOZ27Vrc51pqC5J8SPd39FKt7kkoGAtWJ8s4msj0b15KehDWIiJpWY3/7tLxBQLLzJhIBhnEsXdzpgw== -"@types/lodash-es@^4.17.1": - version "4.17.1" - resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.1.tgz#56745e5411558362aeca31def918f88f725dd29d" - integrity sha512-3EDZjphPfdjnsWvY11ufYImFMPyQJwIH1eFYRgWQsjOctce06fmNgVf5sfvXBRiaS1o0X50bAln1lfWs8ZO3BA== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*", "@types/lodash@^4.14.110": +"@types/lodash@^4.14.110": version "4.14.116" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" integrity sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg== @@ -168,7 +161,7 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@*", "@types/node@^10.5.2": +"@types/node@*": version "10.7.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.7.1.tgz#b704d7c259aa40ee052eec678758a68d07132a2e" integrity sha512-EGoI4ylB/lPOaqXqtzAyL8HcgOuCtH2hkEaLmkueOYufsTFWBn4VCvlCDC2HW8Q+9iF+QVC3sxjDKQYjHQeZ9w== @@ -236,6 +229,11 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + acorn-globals@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" @@ -243,17 +241,39 @@ acorn-globals@^4.1.0: dependencies: acorn "^5.0.0" +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + acorn@^5.0.0, acorn@^5.5.3: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== +acorn@^5.5.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= -ajv@^5.3.0: +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= + +ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -304,6 +324,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -376,6 +404,14 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -429,6 +465,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assertion-error@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -439,6 +480,11 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -458,12 +504,12 @@ async-retry@^1.2.3: dependencies: retry "0.12.0" -async@^1.4.0, async@^1.5.0: +async@1.x, async@^1.4.0, async@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.1.4: +async@^2.1.4, async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== @@ -498,6 +544,28 @@ axios@^0.18.0: follow-redirects "^1.3.0" is-buffer "^1.1.5" +babel-cli@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -546,6 +614,130 @@ babel-generator@^6.18.0, babel-generator@^6.26.0: source-map "^0.5.7" trim-right "^1.0.1" +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + integrity sha1-FMGeXxQte0fxmlJDHlKxzLxAozA= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + integrity sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes= + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" @@ -569,6 +761,13 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + babel-plugin-istanbul@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" @@ -584,11 +783,405 @@ babel-plugin-jest-hoist@^23.2.0: resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= -babel-plugin-syntax-object-rest-spread@^6.13.0: +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + integrity sha1-a8lj67FuzLrmuStZbrfzXDQqi5o= + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + integrity sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY= + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + integrity sha1-MSVjtNvePMgGzuPkFszurd0RrAs= + +babel-plugin-syntax-do-expressions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" + integrity sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0= + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + integrity sha1-cKFITw+QiaToStRLrDU8lbmxJyE= + +babel-plugin-syntax-function-bind@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" + integrity sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y= + +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + integrity sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + integrity sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk= + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + integrity sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0= + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-do-expressions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" + integrity sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs= + dependencies: + babel-plugin-syntax-do-expressions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + integrity sha1-U3OLR+deghhYnuqUbLvTkQm75lM= + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-function-bind@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" + integrity sha1-xvuOlqwpajELjPjqQBRiQH3fapc= + dependencies: + babel-plugin-syntax-function-bind "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0, babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-env@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + babel-preset-jest@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" @@ -597,6 +1190,45 @@ babel-preset-jest@^23.2.0: babel-plugin-jest-hoist "^23.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" +babel-preset-stage-0@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" + integrity sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo= + dependencies: + babel-plugin-transform-do-expressions "^6.22.0" + babel-plugin-transform-function-bind "^6.22.0" + babel-preset-stage-1 "^6.24.1" + +babel-preset-stage-1@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + integrity sha1-dpLNfc1oSZB+auSgqFWJz7niv7A= + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + integrity sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE= + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + integrity sha1-g2raCp56f6N8sTj7kyb4eTSkg5U= + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -610,7 +1242,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -629,7 +1261,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -644,7 +1276,7 @@ babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -694,11 +1326,21 @@ bignumber.js@7.2.1, bignumber.js@^7.2.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== +binary-extensions@^1.0.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + blockies@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/blockies/-/blockies-0.0.2.tgz#22ad58da4f6b382bc79bf4386c5820c70047e4ed" integrity sha1-Iq1Y2k9rOCvHm/Q4bFggxwBH5O0= +bluebird@^3.4.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -764,6 +1406,19 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= + +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -801,6 +1456,18 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" @@ -838,6 +1505,11 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +caniuse-lite@^1.0.30000844: + version "1.0.30000910" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000910.tgz#755d5181d4b006e5a2b59b1ffa05d0a0470039f5" + integrity sha512-u/nxtHGAzCGZzIxt3dA/tpSPOcirBZFWKwz1EPz4aaupnBI2XR0Rbr74g0zc6Hzy41OEM4uMoZ38k56TpYAWjQ== + capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -863,6 +1535,22 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chai-as-promised@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-6.0.0.tgz#1a02a433a6f24dafac63b9c96fa1684db1aa8da6" + integrity sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY= + dependencies: + check-error "^1.0.2" + +chai@3.5.0, "chai@>=1.9.2 <4.0.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + integrity sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc= + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -893,6 +1581,11 @@ chardet@^0.4.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + checksum@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/checksum/-/checksum-0.1.1.tgz#dc6527d4c90be8560dbd1ed4cecf3297d528e9e9" @@ -912,6 +1605,22 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" @@ -927,6 +1636,11 @@ circular-json-es6@^2.0.1: resolved "https://registry.yarnpkg.com/circular-json-es6/-/circular-json-es6-2.0.2.tgz#e4f4a093e49fb4b6aba1157365746112a78bd344" integrity sha512-ODYONMMNb3p658Zv+Pp+/XPa5s6q7afhz3Tzyvo+VRh9WIrJ64J76ZC4GQxnlye/NesTn09jvOiuE8+xxfpwhQ== +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1054,7 +1768,19 @@ command-join@^2.0.0: resolved "https://registry.yarnpkg.com/command-join/-/command-join-2.0.0.tgz#52e8b984f4872d952ff1bdc8b98397d27c7144cf" integrity sha1-Uui5hPSHLZUv8b3IuYOX0nxxRM8= -commander@^2.12.1: +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^2.11.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commander@^2.12.1, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== @@ -1082,7 +1808,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2, concat-stream@^1.4.10: +concat-stream@1.6.2, concat-stream@^1.4.10, concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1097,6 +1823,11 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + conventional-changelog-angular@^1.6.6: version "1.6.6" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" @@ -1269,11 +2000,23 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.1: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= +convert-source-map@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-0.8.4.tgz#c22665f1e0d1b9c3c5e1b08dabd1f108695e4fcf" + integrity sha1-wiZl8eDRucPF4bCNq9HxCGleT88= + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -1289,6 +2032,18 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +coveralls@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.2.tgz#f5a0bcd90ca4e64e088b710fa8dda640aea4884f" + integrity sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw== + dependencies: + growl "~> 1.10.0" + js-yaml "^3.11.0" + lcov-parse "^0.0.10" + log-driver "^1.2.7" + minimist "^1.2.0" + request "^2.85.0" + create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -1296,7 +2051,23 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" -cross-spawn@^5.0.1: +create-thenable@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/create-thenable/-/create-thenable-1.0.2.tgz#e2031720ccc9575d8cfa31f5c146e762a80c0534" + integrity sha1-4gMXIMzJV12M+jH1wUbnYqgMBTQ= + dependencies: + object.omit "~2.0.0" + unique-concat "~0.2.2" + +cross-env@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" + integrity sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg== + dependencies: + cross-spawn "^6.0.5" + is-windows "^1.0.0" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -1305,6 +2076,17 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -1379,6 +2161,13 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= + dependencies: + ms "2.0.0" + debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1416,6 +2205,13 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= + dependencies: + type-detect "0.1.1" + deep-equal-ident@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz#06f4b89e53710cd6cea4a7781c7a956642de8dc9" @@ -1423,6 +2219,11 @@ deep-equal-ident@^1.1.1: dependencies: lodash.isequal "^3.0" +deep-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -1508,6 +2309,11 @@ detect-newline@^2.1.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= + diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -1526,6 +2332,21 @@ doctrine@0.7.2, doctrine@^0.7.2: esutils "^1.1.6" isarray "0.0.1" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -1623,6 +2444,11 @@ electron-download@^3.0.1: semver "^5.3.0" sumchecker "^1.2.0" +electron-to-chromium@^1.3.47: + version "1.3.84" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz#2e55df59e818f150a9f61b53471ebf4f0feecc65" + integrity sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw== + electron@^2.0.2: version "2.0.8" resolved "https://registry.yarnpkg.com/electron/-/electron-2.0.8.tgz#6ec7113b356e09cc9899797e0d41ebff8163e962" @@ -1712,7 +2538,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.6.1: +es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== @@ -1765,35 +2591,202 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.1: resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= dependencies: - d "1" - es5-ext "~0.10.14" + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escodegen@^1.9.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-semistandard@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-11.0.0.tgz#44eef7cfdfd47219e3a7b81b91b540e880bb2615" + integrity sha1-RO73z9/Uchnjp7gbkbVA6IC7JhU= + +eslint-config-standard-jsx@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz#009e53c4ddb1e9ee70b4650ffe63a7f39f8836e1" + integrity sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw== + +eslint-config-standard-react@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-react/-/eslint-config-standard-react-5.0.0.tgz#64c7b8140172852be810a53d48ee87649ff178e3" + integrity sha1-ZMe4FAFyhSvoEKU9SO6HZJ/xeOM= + dependencies: + eslint-config-standard-jsx "^4.0.0" + +eslint-config-standard@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" + integrity sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE= + +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + +eslint-plugin-import@^2.7.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + +eslint-plugin-node@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" + integrity sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g== + dependencies: + ignore "^3.3.6" + minimatch "^3.0.4" + resolve "^1.3.3" + semver "5.3.0" + +eslint-plugin-promise@^3.5.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" + integrity sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ== + +eslint-plugin-react@^7.1.0: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + integrity sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.2" -es6-weak-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= +eslint-plugin-standard@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47" + integrity sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w== + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -escodegen@^1.9.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== +eslint@^4.4.0: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^3.1.3: version "3.1.3" @@ -1805,7 +2798,26 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^4.2.0: +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -2049,6 +3061,14 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -2098,6 +3118,16 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +flat-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + rimraf "~2.6.2" + write "^0.2.1" + follow-redirects@^1.3.0: version "1.5.7" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.7.tgz#a39e4804dacb90202bca76a9e2ac10433ca6a69a" @@ -2131,6 +3161,13 @@ form-data@~2.3.2: combined-stream "1.0.6" mime-types "^2.1.12" +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + integrity sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek= + dependencies: + samsam "~1.1" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2183,12 +3220,17 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.3: +fsevents@^1.0.0, fsevents@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== @@ -2210,6 +3252,11 @@ function.prototype.name@^1.1.0: function-bind "^1.1.1" is-callable "^1.1.3" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2324,6 +3371,29 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -2336,6 +3406,11 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^11.0.1: + version "11.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" + integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg== + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -2374,11 +3449,42 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= +graceful-fs@^4.1.4: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= + +"growl@~> 1.10.0": + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +handlebars@^4.0.1: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" @@ -2468,6 +3574,11 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= + highlight.js@^9.0.0: version "9.12.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" @@ -2543,6 +3654,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^3.3.3, ignore@^3.3.6: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" @@ -2576,7 +3692,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -2586,7 +3702,7 @@ ini@^1.3.2, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^3.2.2: +inquirer@^3.0.6, inquirer@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -2642,6 +3758,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + is-boolean-object@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" @@ -2848,6 +3971,11 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2890,7 +4018,7 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.2: +is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -2900,7 +4028,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -3006,6 +4134,26 @@ istanbul-reports@^1.3.0: dependencies: handlebars "^4.0.3" +istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + 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" + jest-changed-files@^23.4.2: version "23.4.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" @@ -3397,7 +4545,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.7.0: +js-yaml@3.x, js-yaml@^3.11.0, js-yaml@^3.7.0, js-yaml@^3.9.1: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== @@ -3410,7 +4558,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^11.10.0, jsdom@^11.5.1: +jsdom@^11.1.0, jsdom@^11.10.0, jsdom@^11.5.1: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== @@ -3447,6 +4595,11 @@ jsesc@^1.3.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -3462,11 +4615,21 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -3501,6 +4664,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8= + dependencies: + array-includes "^3.0.3" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3549,6 +4719,11 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcov-parse@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= + left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" @@ -3604,7 +4779,7 @@ leven@^2.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -3651,6 +4826,24 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + +lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= + lodash._baseisequal@^3.0.0: version "3.0.7" resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1" @@ -3670,11 +4863,25 @@ lodash._getnative@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.create@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -3737,6 +4944,21 @@ lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.2.1, resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== +lodash@~4.17.2: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + integrity sha1-fD2mL/yzDw9agKJWbKJORdigHzE= + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -3791,6 +5013,17 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +makeshift@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/makeshift/-/makeshift-1.1.0.tgz#03819e68ebb5a0939edc20e7ea230c8818e2b4c4" + integrity sha512-wrL4SLWEDFlGLRHmO4r+6eMlu5z2Aj73CRpB0iDtRSkznFbN8/S4VNI8kxeClIJM5nZi1mrI+HcNegVw5orO3w== + dependencies: + bluebird "^3.4.1" + chalk "^2.0.1" + figures "^2.0.0" + sywac "^1.0.0" + url-parse-as-address "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3887,7 +5120,7 @@ merge@^1.2.0: resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= -micromatch@^2.3.11: +micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -3906,7 +5139,7 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -3947,7 +5180,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -4005,13 +5238,43 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" +mocha@^3.4.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + integrity sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg== + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.8" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + he "1.1.1" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + +mock-local-storage@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mock-local-storage/-/mock-local-storage-1.0.2.tgz#a65a65cddab4707433d52ba4e9f6b63084b8c298" + integrity sha1-plplzdq0cHQz1Suk6fa2MIS4wpg= + dependencies: + core-js "^0.8.3" + +mock-socket@6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-6.0.4.tgz#85f58a0aa83bc1db4ca7d14b42d8f9dd663e7569" + integrity sha1-hfWKCqg7wdtMp9FLQtj53WY+dWk= + modify-filename@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz#9a2dec83806fbb2d975f22beec859ca26b393aa1" @@ -4064,6 +5327,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +native-promise-only@~0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + integrity sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE= + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4094,6 +5362,25 @@ next-tick@1: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nock@9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/nock/-/nock-9.0.7.tgz#cc93481bb15f38bec2a39c4442be07825235b1a1" + integrity sha1-zJNIG7FfOL7Co5xEQr4HglI1saE= + dependencies: + chai ">=1.9.2 <4.0.0" + debug "^2.2.0" + deep-equal "^1.0.0" + json-stringify-safe "^5.0.1" + lodash "~4.17.2" + mkdirp "^0.5.0" + propagate "0.4.0" + qs "^6.0.2" + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -4141,6 +5428,13 @@ nomnom@~1.6.2: colors "0.5.x" underscore "~1.4.4" +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -4159,7 +5453,7 @@ normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -4300,7 +5594,7 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.2" es-abstract "^1.5.1" -object.omit@^2.0.0: +object.omit@^2.0.0, object.omit@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= @@ -4325,7 +5619,7 @@ object.values@^1.0.4: function-bind "^1.1.0" has "^1.0.1" -once@^1.3.0, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -4354,7 +5648,7 @@ optimist@~0.3.5: dependencies: wordwrap "~0.0.2" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -4393,6 +5687,15 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -4496,7 +5799,12 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^2.0.0: +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -4561,6 +5869,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -4568,6 +5883,11 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -4609,7 +5929,7 @@ pretty-format@^23.5.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -private@^0.1.8: +private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -4660,6 +5980,11 @@ prop-types@^15.6.0, prop-types@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +propagate@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/propagate/-/propagate-0.4.0.tgz#f3fcca0a6fe06736a7ba572966069617c130b481" + integrity sha1-8/zKCm/gZzanulcpZgaWF8EwtIE= + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4690,7 +6015,7 @@ q@^1.4.1, q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@~6.5.2: +qs@^6.0.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== @@ -4870,6 +6195,15 @@ readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + realpath-native@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" @@ -4912,6 +6246,16 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -4922,6 +6266,15 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -4937,6 +6290,20 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + registry-auth-token@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" @@ -4952,6 +6319,18 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -4990,7 +6369,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@^2.45.0, request@^2.87.0: +request@^2.45.0, request@^2.85.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -5026,6 +6405,14 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -5033,6 +6420,11 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -5043,12 +6435,12 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7: +resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0, resolve@^1.6.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== @@ -5085,7 +6477,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -5148,6 +6540,16 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +samsam@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + integrity sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc= + +samsam@~1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" + integrity sha1-n1CHQZtNCR8jJXHn+lLpCw9VJiE= + sane@^2.0.0: version "2.5.2" resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" @@ -5174,6 +6576,11 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +semver@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -5242,6 +6649,29 @@ single-line-log@^1.1.2: dependencies: string-width "^1.0.1" +sinon-as-promised@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/sinon-as-promised/-/sinon-as-promised-4.0.2.tgz#120e9ce033daa39648dc429062fe660be1b5b412" + integrity sha1-Eg6c4DPao5ZI3EKQYv5mC+G1tBI= + dependencies: + create-thenable "~1.0.0" + native-promise-only "~0.8.1" + +sinon-chai@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.8.0.tgz#432a9bbfd51a6fc00798f4d2526a829c060687ac" + integrity sha1-Qyqbv9Uab8AHmPTSUmqCnAYGh6w= + +sinon@1.17.7: + version "1.17.7" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" + integrity sha1-RUKk9JugxFwF6y6d2dID4rjv4L8= + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + sisteransi@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" @@ -5252,6 +6682,13 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -5356,11 +6793,18 @@ source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + dependencies: + amdefine ">=0.0.4" + spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -5561,12 +7005,19 @@ sumchecker@^1.2.0: debug "^2.2.0" es6-promise "^4.0.5" +supports-color@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= + dependencies: + has-flag "^1.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.2: +supports-color@^3.1.0, supports-color@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= @@ -5590,6 +7041,23 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= +sywac@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sywac/-/sywac-1.2.1.tgz#528e482b2f2a18e764ffccc59eb40eea16a7f97d" + integrity sha512-bf8agjBAV9mm90k2nWoobe48bO/XugTS86W4dGYTpzVlfFv1cmWsRrQ9hUKIfoDaIRaXIta/BLFINmmxfV+otg== + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + tar@^4: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" @@ -5649,6 +7117,11 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39" integrity sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg== +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -5878,6 +7351,16 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= + typedarray-to-buffer@^3.1.2: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -5945,6 +7428,14 @@ uglify-js@^2.6: optionalDependencies: uglify-to-browserify "~1.0.0" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -5965,6 +7456,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +unique-concat@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/unique-concat/-/unique-concat-0.2.2.tgz#9210f9bdcaacc5e1e3929490d7c019df96f18712" + integrity sha1-khD5vcqsxeHjkpSQ18AZ35bxhxI= + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -5996,6 +7492,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-parse-as-address@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-as-address/-/url-parse-as-address-1.0.0.tgz#fb80901883f338b3cbed3538f5faa26adaf7f2e7" + integrity sha1-+4CQGIPzOLPL7TU49fqiatr38uc= + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -6008,6 +7509,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= + utf8@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" @@ -6031,6 +7537,13 @@ util.promisify@^1.0.0: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" +"util@>=0.10.3 <1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" @@ -6041,6 +7554,13 @@ uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= + dependencies: + user-home "^1.1.1" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -6092,7 +7612,7 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -websocket@^1.0.25, websocket@^1.0.26: +websocket@^1.0.25: version "1.0.26" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" integrity sha512-fjcrYDPIQxpTnqFQ9JjxUQcdvR89MFAOjPBlF+vjOt49w/XW4fJknUoMz/mDIn2eK1AdslVojcaOxOqyZZV8rw== @@ -6133,7 +7653,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.1.1, which@^1.2.12, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -6157,16 +7677,16 @@ wordwrap@0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -6209,6 +7729,13 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" From b9fc223152b99e7da9a70b42344e2b216ca735da Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 13:28:19 +0100 Subject: [PATCH 15/25] Replace format and utils with TS --- jest.config.js | 3 +- packages/api/package.json | 7 +- packages/api/src/contract/contract.js | 360 ++++++----- packages/api/src/format/input.js | 259 -------- .../format/{input.spec.js => input.spec.ts} | 245 ++++---- packages/api/src/format/input.ts | 287 +++++++++ packages/api/src/format/output.js | 463 -------------- packages/api/src/format/output.spec.js | 504 --------------- packages/api/src/format/output.spec.ts | 587 ++++++++++++++++++ packages/api/src/format/output.ts | 556 +++++++++++++++++ packages/api/src/format/types.serialized.ts | 162 +++++ packages/api/src/util/address.js | 22 - packages/api/src/util/address.ts | 6 + packages/api/src/util/decode.js | 102 --- packages/api/src/util/decode.spec.js | 113 ---- packages/api/src/util/decode.spec.ts | 119 ++++ packages/api/src/util/decode.ts | 131 ++++ packages/api/src/util/encode.js | 76 --- packages/api/src/util/encode.spec.js | 96 --- packages/api/src/util/encode.spec.ts | 96 +++ packages/api/src/util/encode.ts | 119 ++++ packages/api/src/util/format.js | 123 ---- packages/api/src/util/format.spec.js | 114 ---- packages/api/src/util/format.spec.ts | 140 +++++ packages/api/src/util/format.ts | 164 +++++ packages/api/src/util/identity.js | 34 - packages/api/src/util/index.js | 51 -- packages/api/src/util/index.ts | 12 + packages/api/src/util/sha3.js | 40 -- packages/api/src/util/sha3.spec.js | 46 -- packages/api/src/util/sha3.spec.ts | 54 ++ packages/api/src/util/sha3.ts | 37 ++ packages/api/src/util/types.js | 70 --- packages/api/src/util/types.spec.js | 120 ---- packages/api/src/util/types.spec.ts | 113 ++++ packages/api/src/util/types.ts | 6 + packages/api/src/util/wei.js | 43 -- packages/api/src/util/wei.spec.js | 57 -- packages/api/src/util/wei.spec.ts | 60 ++ packages/api/src/util/wei.ts | 63 ++ yarn.lock | 32 +- 41 files changed, 3071 insertions(+), 2621 deletions(-) delete mode 100644 packages/api/src/format/input.js rename packages/api/src/format/{input.spec.js => input.spec.ts} (53%) create mode 100644 packages/api/src/format/input.ts delete mode 100644 packages/api/src/format/output.js delete mode 100644 packages/api/src/format/output.spec.js create mode 100644 packages/api/src/format/output.spec.ts create mode 100644 packages/api/src/format/output.ts create mode 100644 packages/api/src/format/types.serialized.ts delete mode 100644 packages/api/src/util/address.js create mode 100644 packages/api/src/util/address.ts delete mode 100644 packages/api/src/util/decode.js delete mode 100644 packages/api/src/util/decode.spec.js create mode 100644 packages/api/src/util/decode.spec.ts create mode 100644 packages/api/src/util/decode.ts delete mode 100644 packages/api/src/util/encode.js delete mode 100644 packages/api/src/util/encode.spec.js create mode 100644 packages/api/src/util/encode.spec.ts create mode 100644 packages/api/src/util/encode.ts delete mode 100644 packages/api/src/util/format.js delete mode 100644 packages/api/src/util/format.spec.js create mode 100644 packages/api/src/util/format.spec.ts create mode 100644 packages/api/src/util/format.ts delete mode 100644 packages/api/src/util/identity.js delete mode 100644 packages/api/src/util/index.js create mode 100644 packages/api/src/util/index.ts delete mode 100644 packages/api/src/util/sha3.js delete mode 100644 packages/api/src/util/sha3.spec.js create mode 100644 packages/api/src/util/sha3.spec.ts create mode 100644 packages/api/src/util/sha3.ts delete mode 100644 packages/api/src/util/types.js delete mode 100644 packages/api/src/util/types.spec.js create mode 100644 packages/api/src/util/types.spec.ts create mode 100644 packages/api/src/util/types.ts delete mode 100644 packages/api/src/util/wei.js delete mode 100644 packages/api/src/util/wei.spec.js create mode 100644 packages/api/src/util/wei.spec.ts create mode 100644 packages/api/src/util/wei.ts diff --git a/jest.config.js b/jest.config.js index b9bcebdb..ebb3e966 100644 --- a/jest.config.js +++ b/jest.config.js @@ -10,6 +10,5 @@ module.exports = { transform: { '^.+\\.tsx?$': 'ts-jest' }, - // testRegex: 'spec\\.(ts|tsx)$' // TODO Skip api/ tests for now, as it's still WIP - testRegex: `packages/(abi|electron|light\.js|light\.js-react)/.*spec\\.(ts|tsx)$` + testRegex: 'spec\\.(ts|tsx)$' }; diff --git a/packages/api/package.json b/packages/api/package.json index c4f85a5d..ecef8875 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -22,7 +22,7 @@ "lint": "npm run lint:css && npm run lint:js", "lint:css": "echo \"WARN: npm run lint:css skipped\"", "lint:js": "eslint src", - "test": "cross-env NODE_ENV=test mocha 'src/*.spec.js' 'src/**/*.spec.js'", + "test": "cross-env NODE_ENV=test mocha -r ts-node/register 'src/*.spec.js' 'src/**/*.spec.js'", "test:coverage": "cross-env NODE_ENV=test istanbul cover _mocha 'src/*.spec.js' 'src/**/*.spec.js' && coveralls < coverage/lcov.info" }, "devDependencies": { @@ -55,13 +55,14 @@ "rimraf": "^2.6.2", "sinon": "1.17.7", "sinon-as-promised": "4.0.2", - "sinon-chai": "2.8.0" + "sinon-chai": "2.8.0", + "ts-node": "^7.0.1" }, "dependencies": { "@parity/abi": "~2.1.4", "@parity/jsonrpc": "2.1.x", "@parity/wordlist": "1.1.x", - "bignumber.js": "4.1.0", + "bignumber.js": "^7", "blockies": "0.0.2", "es6-error": "4.0.2", "es6-promise": "^4.1.1", diff --git a/packages/api/src/contract/contract.js b/packages/api/src/contract/contract.js index 4d7ab53b..9f79fa0e 100644 --- a/packages/api/src/contract/contract.js +++ b/packages/api/src/contract/contract.js @@ -14,12 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -const Abi = require('@parity/abi'); +const Abi = require('@parity/abi').default; let nextSubscriptionId = 0; class Contract { - constructor (api, abi) { + constructor(api, abi) { if (!api) { throw new Error('API instance needs to be provided to Contract'); } @@ -49,12 +49,12 @@ class Contract { this._instance = {}; - this._events.forEach((evt) => { + this._events.forEach(evt => { this._instance[evt.name] = evt; this._instance[evt.signature] = evt; }); - this._functions.forEach((fn) => { + this._functions.forEach(fn => { this._instance[fn.name] = fn; this._instance[fn.signature] = fn; }); @@ -70,55 +70,53 @@ class Contract { } } - get address () { + get address() { return this._address; } - get constructors () { + get constructors() { return this._constructors; } - get events () { + get events() { return this._events; } - get functions () { + get functions() { return this._functions; } - get receipt () { + get receipt() { return this._receipt; } - get instance () { + get instance() { this._instance.address = this._address; return this._instance; } - get api () { + get api() { return this._api; } - get abi () { + get abi() { return this._abi; } - at (address) { + at(address) { this._address = address; return this; } - deployEstimateGas (options, values) { + deployEstimateGas(options, values) { const _options = this._encodeOptions(this.constructors[0], options, values); - return this._api.eth - .estimateGas(_options) - .then((gasEst) => { - return [gasEst, gasEst.mul(1.2)]; - }); + return this._api.eth.estimateGas(_options).then(gasEst => { + return [gasEst, gasEst.mul(1.2)]; + }); } - deploy (options, values, statecb = () => {}, skipGasEstimate = false) { + deploy(options, values, statecb = () => {}, skipGasEstimate = false) { let gasEstPromise; if (skipGasEstimate) { @@ -126,66 +124,72 @@ class Contract { } else { statecb(null, { state: 'estimateGas' }); - gasEstPromise = this.deployEstimateGas(options, values) - .then(([gasEst, gas]) => gas); + gasEstPromise = this.deployEstimateGas(options, values).then( + ([gasEst, gas]) => gas + ); } - return gasEstPromise - .then((_gas) => { - if (_gas) { - options.gas = _gas.toFixed(0); - } + return gasEstPromise.then(_gas => { + if (_gas) { + options.gas = _gas.toFixed(0); + } - const gas = _gas || options.gas; - - statecb(null, { state: 'postTransaction', gas }); - - const encodedOptions = this._encodeOptions(this.constructors[0], options, values); - - return this._api.parity - .postTransaction(encodedOptions) - .then((requestId) => { - if (requestId.length !== 66) { - statecb(null, { state: 'checkRequest', requestId }); - return this._pollCheckRequest(requestId); - } - - return requestId; - }) - .then((txhash) => { - statecb(null, { state: 'getTransactionReceipt', txhash }); - return this._pollTransactionReceipt(txhash, gas); - }) - .then((receipt) => { - if (receipt.gasUsed.eq(gas)) { - throw new Error(`Contract not deployed, gasUsed == ${gas.toFixed(0)}`); - } - - statecb(null, { state: 'hasReceipt', receipt }); - this._receipt = receipt; - this._address = receipt.contractAddress; - return this._address; - }) - .then((address) => { - statecb(null, { state: 'getCode' }); - return this._api.eth.getCode(this._address); - }) - .then((code) => { - if (code === '0x') { - throw new Error('Contract not deployed, getCode returned 0x'); - } - - statecb(null, { state: 'completed' }); - return this._address; - }); - }); + const gas = _gas || options.gas; + + statecb(null, { state: 'postTransaction', gas }); + + const encodedOptions = this._encodeOptions( + this.constructors[0], + options, + values + ); + + return this._api.parity + .postTransaction(encodedOptions) + .then(requestId => { + if (requestId.length !== 66) { + statecb(null, { state: 'checkRequest', requestId }); + return this._pollCheckRequest(requestId); + } + + return requestId; + }) + .then(txhash => { + statecb(null, { state: 'getTransactionReceipt', txhash }); + return this._pollTransactionReceipt(txhash, gas); + }) + .then(receipt => { + if (receipt.gasUsed.eq(gas)) { + throw new Error( + `Contract not deployed, gasUsed == ${gas.toFixed(0)}` + ); + } + + statecb(null, { state: 'hasReceipt', receipt }); + this._receipt = receipt; + this._address = receipt.contractAddress; + return this._address; + }) + .then(address => { + statecb(null, { state: 'getCode' }); + return this._api.eth.getCode(this._address); + }) + .then(code => { + if (code === '0x') { + throw new Error('Contract not deployed, getCode returned 0x'); + } + + statecb(null, { state: 'completed' }); + return this._address; + }); + }); } - parseEventLogs (logs) { + parseEventLogs(logs) { return logs - .map((log) => { + .map(log => { const signature = log.topics[0].substr(2); - const event = this.events.find((evt) => evt.signature === signature); + const event = this.events.find(evt => evt.signature === signature); if (!event) { console.warn(`Unable to find event matching signature ${signature}`); @@ -213,21 +217,21 @@ class Contract { return null; } }) - .filter((log) => log); + .filter(log => log); } - parseTransactionEvents (receipt) { + parseTransactionEvents(receipt) { receipt.logs = this.parseEventLogs(receipt.logs); return receipt; } - _pollCheckRequest (requestId) { + _pollCheckRequest(requestId) { return this._api.pollMethod('parity_checkRequest', requestId); } - _pollTransactionReceipt (txhash, gas) { - return this.api.pollMethod('eth_getTransactionReceipt', txhash, (receipt) => { + _pollTransactionReceipt(txhash, gas) { + return this.api.pollMethod('eth_getTransactionReceipt', txhash, receipt => { if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { return false; } @@ -236,10 +240,12 @@ class Contract { }); } - getCallData (func, options, values) { + getCallData(func, options, values) { let data = options.data; - const tokens = func ? Abi.encodeTokens(func.inputParamTypes(), values) : null; + const tokens = func + ? Abi.encodeTokens(func.inputParamTypes(), values) + : null; const call = tokens ? func.encodeCall(tokens) : null; if (data && data.substr(0, 2) === '0x') { @@ -249,19 +255,22 @@ class Contract { return `0x${data || ''}${call || ''}`; } - _encodeOptions (func, options, values) { + _encodeOptions(func, options, values) { const data = this.getCallData(func, options, values); return Object.assign({}, options, { data }); } - _addOptionsTo (options = {}) { - return Object.assign({ - to: this._address - }, options); + _addOptionsTo(options = {}) { + return Object.assign( + { + to: this._address + }, + options + ); } - _bindFunction (func) { + _bindFunction(func) { func.contract = this; func.call = (_options = {}, values = []) => { @@ -273,23 +282,27 @@ class Contract { let callParams; try { - callParams = this._encodeOptions(func, this._addOptionsTo(options), values); + callParams = this._encodeOptions( + func, + this._addOptionsTo(options), + values + ); } catch (error) { return Promise.reject(error); } return this._api.eth .call(callParams) - .then((encoded) => func.decodeOutput(encoded)) - .then((tokens) => { + .then(encoded => func.decodeOutput(encoded)) + .then(tokens => { if (rawTokens) { return tokens; } - return tokens.map((token) => token.value); + return tokens.map(token => token.value); }) - .then((returns) => returns.length === 1 ? returns[0] : returns) - .catch((error) => { + .then(returns => (returns.length === 1 ? returns[0] : returns)) + .catch(error => { console.warn(`${func.name}.call`, values, error); throw error; }); @@ -300,40 +313,44 @@ class Contract { let _options; try { - _options = this._encodeOptions(func, this._addOptionsTo(options), values); + _options = this._encodeOptions( + func, + this._addOptionsTo(options), + values + ); } catch (error) { return Promise.reject(error); } - return this._api.parity - .postTransaction(_options) - .catch((error) => { - console.warn(`${func.name}.postTransaction`, values, error); - throw error; - }); + return this._api.parity.postTransaction(_options).catch(error => { + console.warn(`${func.name}.postTransaction`, values, error); + throw error; + }); }; func.estimateGas = (options, values = []) => { - const _options = this._encodeOptions(func, this._addOptionsTo(options), values); - - return this._api.eth - .estimateGas(_options) - .catch((error) => { - console.warn(`${func.name}.estimateGas`, values, error); - throw error; - }); + const _options = this._encodeOptions( + func, + this._addOptionsTo(options), + values + ); + + return this._api.eth.estimateGas(_options).catch(error => { + console.warn(`${func.name}.estimateGas`, values, error); + throw error; + }); }; } return func; } - _bindEvent (event) { + _bindEvent(event) { event.subscribe = (options = {}, callback, autoRemove) => { return this._subscribe(event, options, callback, autoRemove); }; - event.unsubscribe = (subscriptionId) => { + event.unsubscribe = subscriptionId => { return this.unsubscribe(subscriptionId); }; @@ -344,7 +361,7 @@ class Contract { return event; } - getAllLogs (event, _options) { + getAllLogs(event, _options) { // Options as first parameter if (!_options && event && event.topics) { return this.getAllLogs(null, event); @@ -357,31 +374,35 @@ class Contract { return this._api.eth .getLogs(options) - .then((logs) => this.parseEventLogs(logs)); + .then(logs => this.parseEventLogs(logs)); } - _findEvent (eventName = null) { + _findEvent(eventName = null) { const event = eventName - ? this._events.find((evt) => evt.name === eventName) + ? this._events.find(evt => evt.name === eventName) : null; if (eventName && !event) { - const events = this._events.map((evt) => evt.name).join(', '); + const events = this._events.map(evt => evt.name).join(', '); - throw new Error(`${eventName} is not a valid eventName, subscribe using one of ${events} (or null to include all)`); + throw new Error( + `${eventName} is not a valid eventName, subscribe using one of ${events} (or null to include all)` + ); } return event; } - _getFilterOptions (event = null, _options = {}) { + _getFilterOptions(event = null, _options = {}) { const optionTopics = _options.topics || []; const signature = (event && event.signature) || null; // If event provided, remove the potential event signature // as the first element of the topics const topics = signature - ? [ signature ].concat(optionTopics.filter((t, index) => index > 0 || t !== signature)) + ? [signature].concat( + optionTopics.filter((t, index) => index > 0 || t !== signature) + ) : optionTopics; const options = Object.assign({}, _options, { @@ -392,13 +413,13 @@ class Contract { return options; } - _createEthFilter (event = null, _options) { + _createEthFilter(event = null, _options) { const options = this._getFilterOptions(event, _options); return this._api.eth.newFilter(options); } - subscribe (eventName = null, options = {}, callback, autoRemove) { + subscribe(eventName = null, options = {}, callback, autoRemove) { try { const event = this._findEvent(eventName); @@ -408,7 +429,7 @@ class Contract { } } - _sendData (subscriptionId, error, logs) { + _sendData(subscriptionId, error, logs) { const { autoRemove, callback } = this._subscriptions[subscriptionId]; let result = true; @@ -423,15 +444,14 @@ class Contract { } } - _subscribe (event = null, _options, callback, autoRemove = false) { + _subscribe(event = null, _options, callback, autoRemove = false) { const subscriptionId = nextSubscriptionId++; const { skipInitFetch } = _options; delete _options['skipInitFetch']; - return this - ._createEthFilter(event, _options) - .then((filterId) => { + return this._createEthFilter(event, _options) + .then(filterId => { this._subscriptions[subscriptionId] = { options: _options, autoRemove, @@ -445,24 +465,22 @@ class Contract { return subscriptionId; } - return this._api.eth - .getFilterLogs(filterId) - .then((logs) => { - this._sendData(subscriptionId, null, this.parseEventLogs(logs)); - this._subscribeToChanges(); - return subscriptionId; - }); + return this._api.eth.getFilterLogs(filterId).then(logs => { + this._sendData(subscriptionId, null, this.parseEventLogs(logs)); + this._subscribeToChanges(); + return subscriptionId; + }); }) - .catch((error) => { + .catch(error => { console.warn('subscribe', event, _options, error); throw error; }); } - unsubscribe (subscriptionId) { + unsubscribe(subscriptionId) { return this._api.eth .uninstallFilter(this._subscriptions[subscriptionId].filterId) - .catch((error) => { + .catch(error => { console.error('unsubscribe', error); }) .then(() => { @@ -471,14 +489,16 @@ class Contract { }); } - _subscribeToChanges () { + _subscribeToChanges() { const subscriptions = Object.values(this._subscriptions); - const pendingSubscriptions = subscriptions - .filter((s) => s.options.toBlock && s.options.toBlock === 'pending'); + const pendingSubscriptions = subscriptions.filter( + s => s.options.toBlock && s.options.toBlock === 'pending' + ); - const otherSubscriptions = subscriptions - .filter((s) => !(s.options.toBlock && s.options.toBlock === 'pending')); + const otherSubscriptions = subscriptions.filter( + s => !(s.options.toBlock && s.options.toBlock === 'pending') + ); if (pendingSubscriptions.length > 0 && !this._subscribedToPendings) { this._subscribedToPendings = true; @@ -491,14 +511,16 @@ class Contract { } } - _unsubscribeFromChanges () { + _unsubscribeFromChanges() { const subscriptions = Object.values(this._subscriptions); - const pendingSubscriptions = subscriptions - .filter((s) => s.options.toBlock && s.options.toBlock === 'pending'); + const pendingSubscriptions = subscriptions.filter( + s => s.options.toBlock && s.options.toBlock === 'pending' + ); - const otherSubscriptions = subscriptions - .filter((s) => !(s.options.toBlock && s.options.toBlock === 'pending')); + const otherSubscriptions = subscriptions.filter( + s => !(s.options.toBlock && s.options.toBlock === 'pending') + ); if (pendingSubscriptions.length === 0 && this._subscribedToPendings) { this._subscribedToPendings = false; @@ -511,59 +533,63 @@ class Contract { } } - _subscribeToBlock () { + _subscribeToBlock() { this._api - .subscribe('eth_blockNumber', (error) => { + .subscribe('eth_blockNumber', error => { if (error) { console.error('::_subscribeToBlock', error, error && error.stack); } - const subscriptions = Object.values(this._subscriptions) - .filter((s) => !(s.options.toBlock && s.options.toBlock === 'pending')); + const subscriptions = Object.values(this._subscriptions).filter( + s => !(s.options.toBlock && s.options.toBlock === 'pending') + ); this._sendSubscriptionChanges(subscriptions); }) - .then((blockSubId) => { + .then(blockSubId => { this._blockSubscriptionId = blockSubId; }) - .catch((e) => { + .catch(e => { console.error('::_subscribeToBlock', e, e && e.stack); }); } - _subscribeToPendings () { - const subscriptions = Object.values(this._subscriptions) - .filter((s) => s.options.toBlock && s.options.toBlock === 'pending'); + _subscribeToPendings() { + const subscriptions = Object.values(this._subscriptions).filter( + s => s.options.toBlock && s.options.toBlock === 'pending' + ); const timeout = () => setTimeout(() => this._subscribeToPendings(), 1000); - this._sendSubscriptionChanges(subscriptions) - .then(() => { - this._pendingsSubscriptionId = timeout(); - }); + this._sendSubscriptionChanges(subscriptions).then(() => { + this._pendingsSubscriptionId = timeout(); + }); } - _sendSubscriptionChanges (subscriptions) { - return Promise - .all( - subscriptions.map((subscription) => { - return this._api.eth.getFilterChanges(subscription.filterId); - }) - ) - .then((logsArray) => { + _sendSubscriptionChanges(subscriptions) { + return Promise.all( + subscriptions.map(subscription => { + return this._api.eth.getFilterChanges(subscription.filterId); + }) + ) + .then(logsArray => { logsArray.forEach((logs, index) => { if (!logs || !logs.length) { return; } try { - this._sendData(subscriptions[index].id, null, this.parseEventLogs(logs)); + this._sendData( + subscriptions[index].id, + null, + this.parseEventLogs(logs) + ); } catch (error) { console.error('_sendSubscriptionChanges', error); } }); }) - .catch((error) => { + .catch(error => { console.error('_sendSubscriptionChanges', error); }); } diff --git a/packages/api/src/format/input.js b/packages/api/src/format/input.js deleted file mode 100644 index 7eafdb36..00000000 --- a/packages/api/src/format/input.js +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const BigNumber = require('bignumber.js'); - -const { isArray, isHex, isInstanceOf, isString } = require('../util/types'); -const { padLeft, toHex } = require('../util/format'); - -function inAddress (address) { - // TODO: address validation if we have upper-lower addresses - return inHex(address); -} - -function inAddresses (addresses) { - return (addresses || []).map(inAddress); -} - -function inBlockNumber (blockNumber) { - if (isString(blockNumber)) { - switch (blockNumber) { - case 'earliest': - case 'latest': - case 'pending': - return blockNumber; - } - } - - return inNumber16(blockNumber); -} - -function inData (data) { - if (data && data.length && !isHex(data)) { - data = data.split('').map((chr) => { - return `0${chr.charCodeAt(0).toString(16)}`.slice(-2); - }).join(''); - } - - return inHex(data); -} - -function inHash (hash) { - return inHex(hash); -} - -function inTopics (topics) { - return (topics || []) - .filter((topic) => topic === null || topic) - .map((topic) => { - if (topic === null) { - return null; - } - - if (Array.isArray(topic)) { - return inTopics(topic); - } - - return padLeft(topic, 32); - }); -} - -function inFilter (options) { - if (options) { - Object.keys(options).forEach((key) => { - switch (key) { - case 'address': - if (isArray(options[key])) { - options[key] = options[key].map(inAddress); - } else { - options[key] = inAddress(options[key]); - } - break; - - case 'fromBlock': - case 'toBlock': - options[key] = inBlockNumber(options[key]); - break; - - case 'limit': - options[key] = inNumber10(options[key]); - break; - - case 'topics': - options[key] = inTopics(options[key]); - } - }); - } - - return options; -} - -function inHex (str) { - return toHex(str); -} - -function inNumber10 (number) { - if (isInstanceOf(number, BigNumber)) { - return number.toNumber(); - } - - return (new BigNumber(number || 0)).toNumber(); -} - -function inNumber16 (number) { - const bn = isInstanceOf(number, BigNumber) - ? number - : (new BigNumber(number || 0)); - - if (!bn.isInteger()) { - throw new Error(`[format/input::inNumber16] the given number is not an integer: ${bn.toFormat()}`); - } - - return inHex(bn.toString(16)); -} - -function inOptionsCondition (condition) { - if (condition) { - if (condition.block) { - condition.block = condition.block ? inNumber10(condition.block) : null; - } else if (condition.time) { - condition.time = inNumber10(Math.floor(condition.time.getTime() / 1000)); - } - } - - return condition; -} - -function inOptions (_options = {}) { - const options = Object.assign({}, _options); - - Object.keys(options).forEach((key) => { - switch (key) { - case 'to': - // Don't encode the `to` option if it's empty - // (eg. contract deployments) - if (options[key]) { - options.to = inAddress(options[key]); - } - break; - - case 'from': - options[key] = inAddress(options[key]); - break; - - case 'condition': - options[key] = inOptionsCondition(options[key]); - break; - - case 'gas': - case 'gasPrice': - options[key] = inNumber16((new BigNumber(options[key])).round()); - break; - - case 'value': - case 'nonce': - options[key] = inNumber16(options[key]); - break; - - case 'data': - options[key] = inData(options[key]); - break; - } - }); - - return options; -} - -function inTraceFilter (filterObject) { - if (filterObject) { - Object.keys(filterObject).forEach((key) => { - switch (key) { - case 'fromAddress': - case 'toAddress': - filterObject[key] = [].concat(filterObject[key]) - .map(address => inAddress(address)); - break; - - case 'toBlock': - case 'fromBlock': - filterObject[key] = inBlockNumber(filterObject[key]); - break; - } - }); - } - - return filterObject; -} - -function inTraceType (whatTrace) { - if (isString(whatTrace)) { - return [whatTrace]; - } - - return whatTrace; -} - -function inDeriveType (derive) { - return derive && derive.type === 'hard' ? 'hard' : 'soft'; -} - -function inDeriveHash (derive) { - const hash = derive && derive.hash ? derive.hash : derive; - const type = inDeriveType(derive); - - return { - hash: inHex(hash), - type - }; -} - -function inDeriveIndex (derive) { - if (!derive) { - return []; - } - - if (!isArray(derive)) { - derive = [derive]; - } - - return derive.map(item => { - const index = inNumber10(item && item.index ? item.index : item); - - return { - index, - type: inDeriveType(item) - }; - }); -} - -module.exports = { - inAddress, - inAddresses, - inBlockNumber, - inData, - inHash, - inTopics, - inFilter, - inHex, - inNumber10, - inNumber16, - inOptionsCondition, - inOptions, - inTraceFilter, - inTraceType, - inDeriveHash, - inDeriveIndex -}; diff --git a/packages/api/src/format/input.spec.js b/packages/api/src/format/input.spec.ts similarity index 53% rename from packages/api/src/format/input.spec.js rename to packages/api/src/format/input.spec.ts index 16985b56..0b9df210 100644 --- a/packages/api/src/format/input.spec.js +++ b/packages/api/src/format/input.spec.ts @@ -1,25 +1,28 @@ // Copyright 2015-2018 Parity Technologies (UK) Ltd. // This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -/* eslint-disable no-unused-expressions */ - -const BigNumber = require('bignumber.js'); - -const { inAddress, inAddresses, inBlockNumber, inData, inFilter, inHash, inHex, inNumber10, inNumber16, inOptions, inTraceType, inDeriveHash, inDeriveIndex, inTopics } = require('./input'); -const { isAddress } = require('../../test/types'); +// +// SPDX-License-Identifier: MIT + +import BigNumber from 'bignumber.js'; +import { isAddress } from '@parity/abi/lib/util/address'; + +import { FilterOptions, Options } from '../types'; +import { + inAddress, + inAddresses, + inBlockNumber, + inData, + inFilter, + inHash, + inHex, + inNumber10, + inNumber16, + inOptions, + inTraceType, + inDeriveHash, + inDeriveIndex, + inTopics +} from './input'; describe('format/input', () => { const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; @@ -28,128 +31,127 @@ describe('format/input', () => { const address = '63cf90d3f0410092fc0fca41846f596223979195'; it('adds the leading 0x as required', () => { - expect(inAddress(address)).to.equal(`0x${address}`); + expect(inAddress(address)).toEqual(`0x${address}`); }); it('returns verified addresses as-is', () => { - expect(inAddress(`0x${address}`)).to.equal(`0x${address}`); + expect(inAddress(`0x${address}`)).toEqual(`0x${address}`); }); it('returns lowercase equivalents', () => { - expect(inAddress(address.toUpperCase())).to.equal(`0x${address}`); + expect(inAddress(address.toUpperCase())).toEqual(`0x${address}`); }); it('returns 0x on null addresses', () => { - expect(inAddress()).to.equal('0x'); + expect(inAddress()).toEqual('0x'); }); }); describe('inAddresses', () => { it('handles empty values', () => { - expect(inAddresses()).to.deep.equal([]); + expect(inAddresses()).toEqual([]); }); it('handles mapping of all addresses in array', () => { const address = '63cf90d3f0410092fc0fca41846f596223979195'; - expect(inAddresses([null, address])).to.deep.equal([ - '0x', - `0x${address}` - ]); + expect(inAddresses([undefined, address])).toEqual(['0x', `0x${address}`]); }); }); describe('inBlockNumber()', () => { it('returns earliest as-is', () => { - expect(inBlockNumber('earliest')).to.equal('earliest'); + expect(inBlockNumber('earliest')).toEqual('earliest'); }); it('returns latest as-is', () => { - expect(inBlockNumber('latest')).to.equal('latest'); + expect(inBlockNumber('latest')).toEqual('latest'); }); it('returns pending as-is', () => { - expect(inBlockNumber('pending')).to.equal('pending'); + expect(inBlockNumber('pending')).toEqual('pending'); }); it('formats existing BigNumber into hex', () => { - expect(inBlockNumber(new BigNumber(0x123456))).to.equal('0x123456'); + expect(inBlockNumber(new BigNumber(0x123456))).toEqual('0x123456'); }); it('formats hex strings into hex', () => { - expect(inBlockNumber('0x123456')).to.equal('0x123456'); + expect(inBlockNumber('0x123456')).toEqual('0x123456'); }); it('formats numbers into hex', () => { - expect(inBlockNumber(0x123456)).to.equal('0x123456'); + expect(inBlockNumber(0x123456)).toEqual('0x123456'); }); }); describe('inData', () => { it('formats to hex', () => { - expect(inData('123456')).to.equal('0x123456'); + expect(inData('123456')).toEqual('0x123456'); }); it('converts a string to a hex representation', () => { - expect(inData('jaco')).to.equal('0x6a61636f'); + expect(inData('jaco')).toEqual('0x6a61636f'); }); }); describe('inHex', () => { it('leaves leading 0x as-is', () => { - expect(inHex('0x123456')).to.equal('0x123456'); + expect(inHex('0x123456')).toEqual('0x123456'); }); it('adds a leading 0x', () => { - expect(inHex('123456')).to.equal('0x123456'); + expect(inHex('123456')).toEqual('0x123456'); }); it('returns uppercase as lowercase (leading 0x)', () => { - expect(inHex('0xABCDEF')).to.equal('0xabcdef'); + expect(inHex('0xABCDEF')).toEqual('0xabcdef'); }); it('returns uppercase as lowercase (no leading 0x)', () => { - expect(inHex('ABCDEF')).to.equal('0xabcdef'); + expect(inHex('ABCDEF')).toEqual('0xabcdef'); }); it('handles empty & null', () => { - expect(inHex()).to.equal('0x'); - expect(inHex('')).to.equal('0x'); + expect(inHex()).toEqual('0x'); + expect(inHex('')).toEqual('0x'); }); }); describe('inHash', () => { it('leaves leading 0x as-is', () => { - expect(inHash('0x123456')).to.equal('0x123456'); + expect(inHash('0x123456')).toEqual('0x123456'); }); }); describe('inFilter', () => { - ['address'].forEach((input) => { + ['address' as keyof FilterOptions].forEach(input => { it(`formats ${input} address as address`, () => { - const block = {}; + const block: FilterOptions = {}; block[input] = address; const formatted = inFilter(block)[input]; - expect(isAddress(formatted)).to.be.true; - expect(formatted).to.equal(address); + expect(isAddress(formatted as string)).toBe(true); + expect(formatted).toEqual(address); }); }); - ['fromBlock', 'toBlock'].forEach((input) => { + (['fromBlock', 'toBlock'] as (keyof FilterOptions)[]).forEach(input => { it(`formats ${input} number as blockNumber`, () => { - const block = {}; + const block: FilterOptions = {}; block[input] = 0x123; const formatted = inFilter(block)[input]; - expect(formatted).to.equal('0x123'); + expect(formatted).toEqual('0x123'); }); }); it('ignores and passes through unknown keys', () => { - expect(inFilter({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + expect(inFilter({ someRandom: 'someRandom' } as any)).toEqual({ + someRandom: 'someRandom' + }); }); it('formats an filter options object with relevant entries converted', () => { @@ -161,7 +163,7 @@ describe('format/input', () => { extraData: 'someExtraStuffInHere', limit: 0x32 }) - ).to.deep.equal({ + ).toEqual({ address: address, fromBlock: 'latest', toBlock: '0x101', @@ -173,61 +175,61 @@ describe('format/input', () => { describe('inNumber10()', () => { it('formats existing BigNumber into number', () => { - expect(inNumber10(new BigNumber(123))).to.equal(123); + expect(inNumber10(new BigNumber(123))).toEqual(123); }); it('formats hex strings into decimal', () => { - expect(inNumber10('0x0a')).to.equal(10); + expect(inNumber10('0x0a')).toEqual(10); }); it('formats numbers into number', () => { - expect(inNumber10(123)).to.equal(123); + expect(inNumber10(123)).toEqual(123); }); it('formats undefined into 0', () => { - expect(inNumber10()).to.equal(0); + expect(inNumber10()).toEqual(0); }); }); describe('inNumber16()', () => { it('formats existing BigNumber into hex', () => { - expect(inNumber16(new BigNumber(0x123456))).to.equal('0x123456'); + expect(inNumber16(new BigNumber(0x123456))).toEqual('0x123456'); }); it('formats hex strings into hex', () => { - expect(inNumber16('0x123456')).to.equal('0x123456'); + expect(inNumber16('0x123456')).toEqual('0x123456'); }); it('formats numbers into hex', () => { - expect(inNumber16(0x123456)).to.equal('0x123456'); + expect(inNumber16(0x123456)).toEqual('0x123456'); }); it('formats undefined into 0', () => { - expect(inNumber16()).to.equal('0x0'); + expect(inNumber16()).toEqual('0x0'); }); }); describe('inOptions', () => { - ['data'].forEach((input) => { + ['data' as keyof Options].forEach(input => { it(`converts ${input} to hex data`, () => { - const block = {}; + const block: Options = {}; block[input] = '1234'; const formatted = inData(block[input]); - expect(formatted).to.equal('0x1234'); + expect(formatted).toEqual('0x1234'); }); }); - ['from', 'to'].forEach((input) => { + (['from', 'to'] as (keyof Options)[]).forEach(input => { it(`formats ${input} address as address`, () => { - const block = {}; + const block: Options = {}; block[input] = address; - const formatted = inOptions(block)[input]; + const formatted = inOptions(block)[input] as string; - expect(isAddress(formatted)).to.be.true; - expect(formatted).to.equal(address); + expect(isAddress(formatted)).toBe(true); + expect(formatted).toEqual(address); }); }); @@ -235,26 +237,30 @@ describe('format/input', () => { const options = { to: '' }; const formatted = inOptions(options); - expect(formatted.to).to.equal(''); + expect(formatted.to).toEqual(undefined); }); - ['gas', 'gasPrice', 'value', 'nonce'].forEach((input) => { - it(`formats ${input} number as hexnumber`, () => { - const block = {}; + (['gas', 'gasPrice', 'value', 'nonce'] as (keyof Options)[]).forEach( + input => { + it(`formats ${input} number as hexnumber`, () => { + const block: Options = {}; - block[input] = 0x123; - const formatted = inOptions(block)[input]; + block[input] = 0x123; + const formatted = inOptions(block)[input]; - expect(formatted).to.equal('0x123'); - }); - }); + expect(formatted).toEqual('0x123'); + }); + } + ); it('passes condition as null when specified as such', () => { - expect(inOptions({ condition: null })).to.deep.equal({ condition: null }); + expect(inOptions({ condition: null })).toEqual({ condition: null }); }); it('ignores and passes through unknown keys', () => { - expect(inOptions({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + expect(inOptions({ someRandom: 'someRandom' } as any)).toEqual({ + someRandom: 'someRandom' + }); }); it('formats an options object with relevant entries converted', () => { @@ -269,7 +275,7 @@ describe('format/input', () => { data: '0123456789', extraData: 'someExtraStuffInHere' }) - ).to.deep.equal({ + ).toEqual({ from: address, to: address, gas: '0x100', @@ -286,39 +292,43 @@ describe('format/input', () => { it('returns array of types as is', () => { const types = ['vmTrace', 'trace', 'stateDiff']; - expect(inTraceType(types)).to.deep.equal(types); + expect(inTraceType(types)).toEqual(types); }); it('formats single string type into array', () => { const type = 'vmTrace'; - expect(inTraceType(type)).to.deep.equal([type]); + expect(inTraceType(type)).toEqual([type]); }); }); describe('inDeriveHash', () => { it('returns derive hash', () => { - expect(inDeriveHash(1)).to.deep.equal({ + expect(inDeriveHash(1)).toEqual({ hash: '0x1', type: 'soft' }); - expect(inDeriveHash(null)).to.deep.equal({ + expect(inDeriveHash(null)).toEqual({ hash: '0x', type: 'soft' }); - expect(inDeriveHash({ - hash: 5 - })).to.deep.equal({ + expect( + inDeriveHash({ + hash: 5 + }) + ).toEqual({ hash: '0x5', type: 'soft' }); - expect(inDeriveHash({ - hash: 5, - type: 'hard' - })).to.deep.equal({ + expect( + inDeriveHash({ + hash: 5, + type: 'hard' + }) + ).toEqual({ hash: '0x5', type: 'hard' }); @@ -327,25 +337,36 @@ describe('format/input', () => { describe('inDeriveIndex', () => { it('returns derive hash', () => { - expect(inDeriveIndex(null)).to.deep.equal([]); - expect(inDeriveIndex([])).to.deep.equal([]); + expect(inDeriveIndex(null)).toEqual([]); + expect(inDeriveIndex([])).toEqual([]); - expect(inDeriveIndex([1])).to.deep.equal([{ - index: 1, - type: 'soft' - }]); + expect(inDeriveIndex([1])).toEqual([ + { + index: 1, + type: 'soft' + } + ]); - expect(inDeriveIndex({ - index: 1 - })).to.deep.equal([{ - index: 1, - type: 'soft' - }]); + expect( + inDeriveIndex({ + index: 1 + }) + ).toEqual([ + { + index: 1, + type: 'soft' + } + ]); - expect(inDeriveIndex([{ - index: 1, - type: 'hard' - }, 5])).to.deep.equal([ + expect( + inDeriveIndex([ + { + index: 1, + type: 'hard' + }, + 5 + ]) + ).toEqual([ { index: 1, type: 'hard' @@ -360,21 +381,21 @@ describe('format/input', () => { describe('inTopics', () => { it('returns empty array when no inputs provided', () => { - expect(inTopics()).to.deep.equal([]); + expect(inTopics()).toEqual([]); }); it('keeps null topic as null', () => { - expect(inTopics([null])).to.deep.equal([null]); + expect(inTopics([null])).toEqual([null]); }); it('pads topics as received', () => { - expect(inTopics(['123'])).to.deep.equal([ + expect(inTopics(['123'])).toEqual([ '0x0000000000000000000000000000000000000000000000000000000000000123' ]); }); it('handles nested arrays', () => { - expect(inTopics([null, '123', ['456', null, '789']])).to.deep.equal([ + expect(inTopics([null, '123', ['456', null, '789']])).toEqual([ null, '0x0000000000000000000000000000000000000000000000000000000000000123', [ diff --git a/packages/api/src/format/input.ts b/packages/api/src/format/input.ts new file mode 100644 index 00000000..972c7f65 --- /dev/null +++ b/packages/api/src/format/input.ts @@ -0,0 +1,287 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import BigNumber from 'bignumber.js'; + +import { + BlockNumber, + Condition, + DeriveObject, + Derive, + FilterObject, + FilterOptions, + Options, + Topic +} from '../types'; +import { isArray, isHex, isInstanceOf, isString } from '../util/types'; +import { padLeft, toHex } from '../util/format'; +import { SerializedCondition, SerializedTransaction } from './types.serialized'; + +/** + * Validate input address. + * + * @param address - Input address to validate. + */ +export const inAddress = (address?: string) => { + // TODO: address validation if we have upper-lower addresses + return inHex(address); +}; + +/** + * Validate input addresses. + * + * @param addresses - Input addresses to validate. + */ +export const inAddresses = (addresses?: (string | undefined)[]) => { + return (addresses || []).map(inAddress); +}; + +export const inBlockNumber = (blockNumber?: BlockNumber) => { + if (isString(blockNumber)) { + switch (blockNumber) { + case 'earliest': + case 'latest': + case 'pending': + return blockNumber; + } + } + + return inNumber16(blockNumber); +}; + +export const inData = (data: string) => { + if (data && data.length && !isHex(data)) { + data = data + .split('') + .map(chr => `0${chr.charCodeAt(0).toString(16)}`.slice(-2)) + .join(''); + } + + return inHex(data); +}; + +export const inHash = (hash: string) => { + return inHex(hash); +}; + +export const inTopics = (topics?: (Topic | Topic[])[]): (string | null)[] => { + if (!topics) { + return [] as string[]; + } + + // @ts-ignore I don't want to deal with resursive nested arrays + // TODO https://stackoverflow.com/questions/52638149/recursive-nested-array-type-can-it-be-done + return topics + .filter((topic: Topic | Topic[]) => topic === null || topic) + .map((topic: Topic | Topic[]) => { + if (topic === null) { + return null; + } + + if (Array.isArray(topic)) { + return inTopics(topic); + } + + return padLeft(topic, 32); + }); +}; + +export const inFilter = (options: FilterOptions) => { + const result: { + [key in keyof FilterOptions]: number | string | string[] | Topic[] + } = {}; + + if (options) { + Object.keys(options).forEach(key => { + switch (key) { + case 'address': + if (isArray(options[key])) { + result[key] = (options[key] as string[]).map(inAddress); + } else { + result[key] = inAddress(options[key] as string); + } + break; + + case 'fromBlock': + case 'toBlock': + result[key] = inBlockNumber(options[key]); + break; + + case 'limit': + result[key] = inNumber10(options[key]); + break; + + case 'topics': + result[key] = inTopics(options[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = options[key]; + } + }); + } + + return result; +}; + +export const inHex = (str?: string) => toHex(str); + +export const inNumber10 = (n?: BlockNumber) => { + if (isInstanceOf(n, BigNumber)) { + return (n as BigNumber).toNumber(); + } + + return new BigNumber(n || 0).toNumber(); +}; + +export const inNumber16 = (n?: BlockNumber) => { + const bn = isInstanceOf(n, BigNumber) + ? (n as BigNumber) + : new BigNumber(n || 0); + + if (!bn.isInteger()) { + throw new Error( + `[format/input::inNumber16] the given number is not an integer: ${bn.toFormat()}` + ); + } + + return inHex(bn.toString(16)); +}; + +export const inOptionsCondition = (condition?: Condition | null) => { + if (condition) { + return { + block: condition.block ? inNumber10(condition.block) : null, + time: condition.time + ? inNumber10(Math.floor(condition.time.getTime() / 1000)) + : null + } as SerializedCondition; + } + + return null; +}; + +export const inOptions = (_options: Options = {}) => { + const options = Object.assign({}, _options); + + const result: SerializedTransaction = {}; + + Object.keys(options).forEach(key => { + switch (key) { + case 'to': + // Don't encode the `to` option if it's empty + // (eg. contract deployments) + if (options[key]) { + result.to = inAddress(options[key]); + } + break; + + case 'from': + result[key] = inAddress(options[key]); + break; + + case 'condition': + result[key] = inOptionsCondition(options[key]); + break; + + case 'gas': + case 'gasPrice': + result[key] = inNumber16( + new BigNumber(options[key] as BigNumber) // TODO Round number + ); + break; + + case 'value': + case 'nonce': + result[key] = inNumber16(options[key]); + break; + + case 'data': + result[key] = inData(options[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = options[key]; + } + }); + + return result; +}; + +export const inTraceFilter = (filterObject: FilterObject) => { + const result: { [key in keyof FilterObject]: string | string[] } = {}; + + if (filterObject) { + Object.keys(filterObject).forEach(key => { + switch (key) { + case 'fromAddress': + case 'toAddress': + result[key] = ([] as string[]) + .concat(filterObject[key] as string) + .map(address => inAddress(address)); + break; + + case 'toBlock': + case 'fromBlock': + result[key] = inBlockNumber(filterObject[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = options[key]; + } + }); + } + + return result; +}; + +export const inTraceType = (whatTrace: string | string[]) => { + if (isString(whatTrace)) { + return [whatTrace]; + } + + return whatTrace; +}; + +export const inDeriveType = (derive?: Derive) => { + return derive && (derive as DeriveObject).type === 'hard' ? 'hard' : 'soft'; +}; + +export const inDeriveHash = (derive?: Derive | string) => { + const hash = + derive && (derive as DeriveObject).hash + ? (derive as DeriveObject).hash + : (derive as string); + const type = inDeriveType(derive as Derive); + + return { + hash: inHex(hash as string), + type + }; +}; + +export const inDeriveIndex = (derive: Derive | Derive[]) => { + if (!derive) { + return []; + } + + const deriveAsArray: Derive[] = isArray(derive) ? derive : [derive]; + + return deriveAsArray.map(item => { + const index = inNumber10( + item && (item as DeriveObject).index + ? (item as DeriveObject).index + : (item as number) + ); + + return { + index, + type: inDeriveType(item) + }; + }); +}; diff --git a/packages/api/src/format/output.js b/packages/api/src/format/output.js deleted file mode 100644 index 4c050d0c..00000000 --- a/packages/api/src/format/output.js +++ /dev/null @@ -1,463 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const BigNumber = require('bignumber.js'); - -const { toChecksumAddress } = require('@parity/abi/lib/util/address'); - -const { isString } = require('../util/types'); - -function outAccountInfo (infos) { - return Object - .keys(infos) - .reduce((ret, _address) => { - const info = infos[_address]; - const address = outAddress(_address); - - ret[address] = { - name: info.name - }; - - if (info.meta) { - ret[address].uuid = info.uuid; - try { - ret[address].meta = JSON.parse(info.meta); - } catch (e) { - console.error(`Couldn't parse meta field of JSON key file ${info.uuid}`); - } - } - - return ret; - }, {}); -} - -function outAddress (address) { - return toChecksumAddress(address); -} - -function outAddresses (addresses) { - return (addresses || []).map(outAddress); -} - -function outBlock (block) { - if (block) { - Object.keys(block).forEach((key) => { - switch (key) { - case 'author': - case 'miner': - block[key] = outAddress(block[key]); - break; - - case 'difficulty': - case 'gasLimit': - case 'gasUsed': - case 'nonce': - case 'number': - case 'totalDifficulty': - block[key] = outNumber(block[key]); - break; - - case 'timestamp': - block[key] = outDate(block[key]); - break; - } - }); - } - - return block; -} - -function outChainStatus (status) { - if (status) { - Object.keys(status).forEach((key) => { - switch (key) { - case 'blockGap': - status[key] = status[key] - ? status[key].map(outNumber) - : status[key]; - break; - } - }); - } - - return status; -} - -function outDate (date) { - if (typeof date.toISOString === 'function') { - return date; - } - - try { - if (typeof date === 'string' && (new Date(date)).toISOString() === date) { - return new Date(date); - } - } catch (error) {} - - return new Date(outNumber(date).toNumber() * 1000); -} - -function outHistogram (histogram) { - if (histogram) { - Object.keys(histogram).forEach((key) => { - switch (key) { - case 'bucketBounds': - case 'counts': - histogram[key] = histogram[key].map(outNumber); - break; - } - }); - } - - return histogram; -} - -function outLog (log) { - Object.keys(log).forEach((key) => { - switch (key) { - case 'blockNumber': - case 'logIndex': - case 'transactionIndex': - log[key] = outNumber(log[key]); - break; - - case 'address': - log[key] = outAddress(log[key]); - break; - } - }); - - return log; -} - -function outHwAccountInfo (infos) { - return Object - .keys(infos) - .reduce((ret, _address) => { - const address = outAddress(_address); - - ret[address] = infos[_address]; - - return ret; - }, {}); -} - -function outNodeKind (info) { - return info; -} - -function outNumber (number) { - return new BigNumber(number || 0); -} - -function outPeer (peer) { - const protocols = Object.keys(peer.protocols) - .reduce((obj, key) => { - if (peer.protocols[key]) { - obj[key] = Object.assign({}, peer.protocols[key], { - difficulty: outNumber(peer.protocols[key].difficulty) - }); - } - - return obj; - }, {}); - - return Object.assign({}, peer, { - protocols - }); -} - -function outPeers (peers) { - return { - active: outNumber(peers.active), - connected: outNumber(peers.connected), - max: outNumber(peers.max), - peers: peers.peers.map((peer) => outPeer(peer)) - }; -} - -function outPrivateReceipt (receipt) { - if (receipt) { - Object.keys(receipt).forEach((key) => { - switch (key) { - case 'status': - receipt[key] = outNumber(receipt[key]); - break; - - case 'contractAddress': - receipt[key] = outAddress(receipt[key]); - break; - } - }); - } - - return receipt; -} - -function outReceipt (receipt) { - if (receipt) { - Object.keys(receipt).forEach((key) => { - switch (key) { - case 'blockNumber': - case 'cumulativeGasUsed': - case 'gasUsed': - case 'transactionIndex': - receipt[key] = outNumber(receipt[key]); - break; - - case 'contractAddress': - receipt[key] = outAddress(receipt[key]); - break; - } - }); - } - - return receipt; -} - -function outRecentDapps (recentDapps) { - if (recentDapps) { - Object.keys(recentDapps).forEach((url) => { - recentDapps[url] = outDate(recentDapps[url]); - }); - } - - return recentDapps; -} - -function outSignerRequest (request) { - if (request) { - Object.keys(request).forEach((key) => { - switch (key) { - case 'id': - request[key] = outNumber(request[key]); - break; - - case 'payload': - request[key].decrypt = outSigningPayload(request[key].decrypt); - request[key].sign = outSigningPayload(request[key].sign); - request[key].signTransaction = outTransaction(request[key].signTransaction); - request[key].sendTransaction = outTransaction(request[key].sendTransaction); - break; - - case 'origin': - const type = Object.keys(request[key])[0]; - const details = request[key][type]; - - request[key] = { type, details }; - break; - } - }); - } - - return request; -} - -function outSyncing (syncing) { - if (syncing && syncing !== 'false') { - Object.keys(syncing).forEach((key) => { - switch (key) { - case 'currentBlock': - case 'highestBlock': - case 'startingBlock': - case 'warpChunksAmount': - case 'warpChunksProcessed': - syncing[key] = outNumber(syncing[key]); - break; - - case 'blockGap': - syncing[key] = syncing[key] ? syncing[key].map(outNumber) : syncing[key]; - break; - } - }); - } - - return syncing; -} - -function outTransactionCondition (condition) { - if (condition) { - if (condition.block) { - condition.block = outNumber(condition.block); - } else if (condition.time) { - condition.time = outDate(condition.time); - } - } - - return condition; -} - -function outTransaction (tx) { - if (tx) { - Object.keys(tx).forEach((key) => { - switch (key) { - case 'blockNumber': - case 'gasPrice': - case 'gas': - case 'nonce': - case 'transactionIndex': - case 'value': - tx[key] = outNumber(tx[key]); - break; - - case 'condition': - tx[key] = outTransactionCondition(tx[key]); - break; - - case 'creates': - case 'from': - case 'to': - tx[key] = outAddress(tx[key]); - break; - } - }); - } - - return tx; -} - -function outSigningPayload (payload) { - if (payload) { - Object.keys(payload).forEach((key) => { - switch (key) { - case 'address': - payload[key] = outAddress(payload[key]); - break; - } - }); - } - - return payload; -} - -function outTrace (trace) { - if (trace) { - if (trace.action) { - Object.keys(trace.action).forEach(key => { - switch (key) { - case 'gas': - case 'value': - case 'balance': - trace.action[key] = outNumber(trace.action[key]); - break; - - case 'from': - case 'to': - case 'address': - case 'refundAddress': - trace.action[key] = outAddress(trace.action[key]); - break; - } - }); - } - - if (trace.result) { - Object.keys(trace.result).forEach(key => { - switch (key) { - case 'gasUsed': - trace.result[key] = outNumber(trace.result[key]); - break; - - case 'address': - trace.action[key] = outAddress(trace.action[key]); - break; - } - }); - } - - if (trace.traceAddress) { - trace.traceAddress.forEach((address, index) => { - trace.traceAddress[index] = outNumber(address); - }); - } - - Object.keys(trace).forEach((key) => { - switch (key) { - case 'subtraces': - case 'transactionPosition': - case 'blockNumber': - trace[key] = outNumber(trace[key]); - break; - } - }); - } - - return trace; -} - -function outTraces (traces) { - if (traces) { - return traces.map(outTrace); - } - - return traces; -} - -function outTraceReplay (trace) { - if (trace) { - Object.keys(trace).forEach((key) => { - switch (key) { - case 'trace': - trace[key] = outTraces(trace[key]); - break; - } - }); - } - - return trace; -} - -function outVaultMeta (meta) { - if (isString(meta)) { - try { - const obj = JSON.parse(meta); - - return obj; - } catch (error) { - return {}; - } - } - - return meta || {}; -} - -module.exports = { - outAccountInfo, - outAddress, - outAddresses, - outBlock, - outChainStatus, - outDate, - outHistogram, - outLog, - outHwAccountInfo, - outNodeKind, - outNumber, - outPeer, - outPeers, - outPrivateReceipt, - outReceipt, - outRecentDapps, - outSignerRequest, - outSyncing, - outTransactionCondition, - outTransaction, - outSigningPayload, - outTrace, - outTraces, - outTraceReplay, - outVaultMeta -}; diff --git a/packages/api/src/format/output.spec.js b/packages/api/src/format/output.spec.js deleted file mode 100644 index ec0bc2af..00000000 --- a/packages/api/src/format/output.spec.js +++ /dev/null @@ -1,504 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -/* eslint-disable no-unused-expressions */ - -const BigNumber = require('bignumber.js'); - -const { outBlock, outAccountInfo, outAddress, outChainStatus, outDate, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeer, outPeers, outReceipt, outRecentDapps, outSyncing, outTransaction, outTrace, outVaultMeta } = require('./output'); -const { isAddress, isBigNumber, isInstanceOf } = require('../../test/types'); - -describe('format/output', () => { - const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; - const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; - - describe('outAccountInfo', () => { - it('returns meta objects parsed', () => { - expect(outAccountInfo( - { '0x63cf90d3f0410092fc0fca41846f596223979195': { - name: 'name', uuid: 'uuid', meta: '{"name":"456"}' } - } - )).to.deep.equal({ - '0x63Cf90D3f0410092FC0fca41846f596223979195': { - name: 'name', uuid: 'uuid', meta: { name: '456' } - } - }); - }); - - it('returns objects without meta & uuid as required', () => { - expect(outAccountInfo( - { '0x63cf90d3f0410092fc0fca41846f596223979195': { name: 'name' } } - )).to.deep.equal({ - '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name' } - }); - }); - }); - - describe('outAddress', () => { - it('retuns the address as checksummed', () => { - expect(outAddress(address)).to.equal(checksum); - }); - - it('retuns the checksum as checksummed', () => { - expect(outAddress(checksum)).to.equal(checksum); - }); - }); - - describe('outBlock', () => { - ['author', 'miner'].forEach((input) => { - it(`formats ${input} address as address`, () => { - const block = {}; - - block[input] = address; - const formatted = outBlock(block)[input]; - - expect(isAddress(formatted)).to.be.true; - expect(formatted).to.equal(checksum); - }); - }); - - ['difficulty', 'gasLimit', 'gasUsed', 'number', 'nonce', 'totalDifficulty'].forEach((input) => { - it(`formats ${input} number as hexnumber`, () => { - const block = {}; - - block[input] = 0x123; - const formatted = outBlock(block)[input]; - - expect(isInstanceOf(formatted, BigNumber)).to.be.true; - expect(formatted.toString(16)).to.equal('123'); - }); - }); - - ['timestamp'].forEach((input) => { - it(`formats ${input} number as Date`, () => { - const block = {}; - - block[input] = 0x57513668; - const formatted = outBlock(block)[input]; - - expect(isInstanceOf(formatted, Date)).to.be.true; - expect(formatted.getTime()).to.equal(1464940136000); - }); - }); - - it('ignores and passes through unknown keys', () => { - expect(outBlock({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); - }); - - it('formats a block with all the info converted', () => { - expect( - outBlock({ - author: address, - miner: address, - difficulty: '0x100', - gasLimit: '0x101', - gasUsed: '0x102', - number: '0x103', - nonce: '0x104', - totalDifficulty: '0x105', - timestamp: '0x57513668', - extraData: 'someExtraStuffInHere' - }) - ).to.deep.equal({ - author: checksum, - miner: checksum, - difficulty: new BigNumber('0x100'), - gasLimit: new BigNumber('0x101'), - gasUsed: new BigNumber('0x102'), - number: new BigNumber('0x103'), - nonce: new BigNumber('0x104'), - totalDifficulty: new BigNumber('0x105'), - timestamp: new Date('2016-06-03T07:48:56.000Z'), - extraData: 'someExtraStuffInHere' - }); - }); - }); - - describe('outChainStatus', () => { - it('formats blockGap values', () => { - const status = { - blockGap: [0x1234, '0x5678'] - }; - - expect(outChainStatus(status)).to.deep.equal({ - blockGap: [new BigNumber(0x1234), new BigNumber(0x5678)] - }); - }); - - it('handles null blockGap values', () => { - const status = { - blockGap: null - }; - - expect(outChainStatus(status)).to.deep.equal(status); - }); - }); - - describe('outDate', () => { - it('converts a second date in unix timestamp', () => { - expect(outDate(0x57513668)).to.deep.equal(new Date('2016-06-03T07:48:56.000Z')); - }); - }); - - describe('outHistogram', () => { - ['bucketBounds', 'counts'].forEach((type) => { - it(`formats ${type} as number arrays`, () => { - expect( - outHistogram({ [type]: [0x123, 0x456, 0x789] }) - ).to.deep.equal({ - [type]: [new BigNumber(0x123), new BigNumber(0x456), new BigNumber(0x789)] - }); - }); - }); - }); - - describe('outHwAccountInfo', () => { - it('returns objects with formatted addresses', () => { - expect(outHwAccountInfo( - { '0x63cf90d3f0410092fc0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } } - )).to.deep.equal({ - '0x63Cf90D3f0410092FC0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } - }); - }); - }); - - describe('outNodeKind', () => { - it('formats the input as received', () => { - const kind = { availability: 'personal', capability: 'full' }; - - expect(outNodeKind(kind)).to.deep.equal(kind); - }); - }); - - describe('outNumber', () => { - it('returns a BigNumber equalling the value', () => { - const bn = outNumber('0x123456'); - - expect(isBigNumber(bn)).to.be.true; - expect(bn.eq(0x123456)).to.be.true; - }); - - it('assumes 0 when ivalid input', () => { - expect(outNumber().eq(0)).to.be.true; - }); - }); - - describe('outPeer', () => { - it('converts all internal numbers to BigNumbers', () => { - expect(outPeer({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: '0x0f', - head: '0x02', - version: 63 - } - } - })).to.deep.equal({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: new BigNumber(15), - head: '0x02', - version: 63 - } - } - }); - }); - - it('does not output null protocols', () => { - expect(outPeer({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - les: null - } - })).to.deep.equal({ - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: {} - }); - }); - }); - - describe('outPeers', () => { - it('converts all internal numbers to BigNumbers', () => { - expect(outPeers({ - active: 789, - connected: '456', - max: 0x7b, - peers: [ - { - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: '0x0f', - head: '0x02', - version: 63 - }, - les: null - } - } - ] - })).to.deep.equal({ - active: new BigNumber(789), - connected: new BigNumber(456), - max: new BigNumber(123), - peers: [ - { - caps: ['par/1'], - id: '0x01', - name: 'Parity', - network: { - localAddress: '10.0.0.1', - remoteAddress: '10.0.0.1' - }, - protocols: { - par: { - difficulty: new BigNumber(15), - head: '0x02', - version: 63 - } - } - } - ] - }); - }); - }); - - describe('outReceipt', () => { - ['contractAddress'].forEach((input) => { - it(`formats ${input} address as address`, () => { - const block = {}; - - block[input] = address; - const formatted = outReceipt(block)[input]; - - expect(isAddress(formatted)).to.be.true; - expect(formatted).to.equal(checksum); - }); - }); - - ['blockNumber', 'cumulativeGasUsed', 'cumulativeGasUsed', 'gasUsed', 'transactionIndex'].forEach((input) => { - it(`formats ${input} number as hexnumber`, () => { - const block = {}; - - block[input] = 0x123; - const formatted = outReceipt(block)[input]; - - expect(isInstanceOf(formatted, BigNumber)).to.be.true; - expect(formatted.toString(16)).to.equal('123'); - }); - }); - - it('ignores and passes through unknown keys', () => { - expect(outReceipt({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); - }); - - it('formats a receipt with all the info converted', () => { - expect( - outReceipt({ - contractAddress: address, - blockNumber: '0x100', - cumulativeGasUsed: '0x101', - gasUsed: '0x102', - transactionIndex: '0x103', - extraData: 'someExtraStuffInHere' - }) - ).to.deep.equal({ - contractAddress: checksum, - blockNumber: new BigNumber('0x100'), - cumulativeGasUsed: new BigNumber('0x101'), - gasUsed: new BigNumber('0x102'), - transactionIndex: new BigNumber('0x103'), - extraData: 'someExtraStuffInHere' - }); - }); - }); - - describe('outRecentDapps', () => { - it('formats the URLs with timestamps', () => { - expect(outRecentDapps({ testing: 0x57513668 })).to.deep.equal({ - testing: new Date('2016-06-03T07:48:56.000Z') - }); - }); - }); - - describe('outSyncing', () => { - ['currentBlock', 'highestBlock', 'startingBlock', 'warpChunksAmount', 'warpChunksProcessed'].forEach((input) => { - it(`formats ${input} numbers as a number`, () => { - expect(outSyncing({ [input]: '0x123' })).to.deep.equal({ - [input]: new BigNumber('0x123') - }); - }); - }); - - it('formats blockGap properly', () => { - expect(outSyncing({ blockGap: [0x123, 0x456] })).to.deep.equal({ - blockGap: [new BigNumber(0x123), new BigNumber(0x456)] - }); - }); - }); - - describe('outTransaction', () => { - ['from', 'to'].forEach((input) => { - it(`formats ${input} address as address`, () => { - const block = {}; - - block[input] = address; - const formatted = outTransaction(block)[input]; - - expect(isAddress(formatted)).to.be.true; - expect(formatted).to.equal(checksum); - }); - }); - - ['blockNumber', 'gasPrice', 'gas', 'nonce', 'transactionIndex', 'value'].forEach((input) => { - it(`formats ${input} number as hexnumber`, () => { - const block = {}; - - block[input] = 0x123; - const formatted = outTransaction(block)[input]; - - expect(isInstanceOf(formatted, BigNumber)).to.be.true; - expect(formatted.toString(16)).to.equal('123'); - }); - }); - - it('passes condition as null when null', () => { - expect(outTransaction({ condition: null })).to.deep.equal({ condition: null }); - }); - - it('ignores and passes through unknown keys', () => { - expect(outTransaction({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); - }); - - it('formats a transaction with all the info converted', () => { - expect( - outTransaction({ - from: address, - to: address, - blockNumber: '0x100', - gasPrice: '0x101', - gas: '0x102', - nonce: '0x103', - transactionIndex: '0x104', - value: '0x105', - extraData: 'someExtraStuffInHere' - }) - ).to.deep.equal({ - from: checksum, - to: checksum, - blockNumber: new BigNumber('0x100'), - gasPrice: new BigNumber('0x101'), - gas: new BigNumber('0x102'), - nonce: new BigNumber('0x103'), - transactionIndex: new BigNumber('0x104'), - value: new BigNumber('0x105'), - extraData: 'someExtraStuffInHere' - }); - }); - }); - - describe('outTrace', () => { - it('ignores and passes through unknown keys', () => { - expect(outTrace({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); - }); - - it('formats a trace with all the info converted', () => { - const formatted = outTrace({ - type: 'call', - action: { - from: address, - to: address, - value: '0x06', - gas: '0x07', - input: '0x1234', - callType: 'call' - }, - result: { - gasUsed: '0x08', - output: '0x5678' - }, - traceAddress: [ '0x2' ], - subtraces: 3, - transactionPosition: '0xb', - transactionHash: '0x000000000000000000000000000000000000000000000000000000000000000c', - blockNumber: '0x0d', - blockHash: '0x000000000000000000000000000000000000000000000000000000000000000e' - }); - - expect(isBigNumber(formatted.action.gas)).to.be.true; - expect(formatted.action.gas.toNumber()).to.equal(7); - expect(isBigNumber(formatted.action.value)).to.be.true; - expect(formatted.action.value.toNumber()).to.equal(6); - - expect(formatted.action.from).to.equal(checksum); - expect(formatted.action.to).to.equal(checksum); - - expect(isBigNumber(formatted.blockNumber)).to.be.true; - expect(formatted.blockNumber.toNumber()).to.equal(13); - expect(isBigNumber(formatted.transactionPosition)).to.be.true; - expect(formatted.transactionPosition.toNumber()).to.equal(11); - }); - }); - - describe('outVaultMeta', () => { - it('returns an exmpt object on null', () => { - expect(outVaultMeta(null)).to.deep.equal({}); - }); - - it('returns the original value if not string', () => { - expect(outVaultMeta({ test: 123 })).to.deep.equal({ test: 123 }); - }); - - it('returns an object from JSON string', () => { - expect(outVaultMeta('{"test":123}')).to.deep.equal({ test: 123 }); - }); - - it('returns an empty object on invalid JSON', () => { - expect(outVaultMeta('{"test"}')).to.deep.equal({}); - }); - }); -}); diff --git a/packages/api/src/format/output.spec.ts b/packages/api/src/format/output.spec.ts new file mode 100644 index 00000000..119ac5fa --- /dev/null +++ b/packages/api/src/format/output.spec.ts @@ -0,0 +1,587 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import BigNumber from 'bignumber.js'; +import { isAddress } from '@parity/abi/lib/util/address'; +import { isInstanceOf } from '@parity/abi/lib/util/types'; + +import { Block, Receipt } from '../types'; +import { + outBlock, + outAccountInfo, + outAddress, + outChainStatus, + outDate, + outHistogram, + outHwAccountInfo, + outNodeKind, + outNumber, + outPeer, + outPeers, + outReceipt, + outSyncing, + outTransaction, + outTrace, + outVaultMeta +} from './output'; +import { + SerializedBlock, + SerializedReceipt, + SerializedTransaction +} from './types.serialized'; + +describe('format/output', () => { + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + + describe('outAccountInfo', () => { + it('returns meta objects parsed', () => { + expect( + outAccountInfo({ + '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', + uuid: 'uuid', + meta: '{"name":"456"}' + } + }) + ).toEqual({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', + uuid: 'uuid', + meta: { name: '456' } + } + }); + }); + + it('returns objects without meta & uuid as required', () => { + expect( + outAccountInfo({ + '0x63cf90d3f0410092fc0fca41846f596223979195': { name: 'name' } + }) + ).toEqual({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name' } + }); + }); + }); + + describe('outAddress', () => { + it('retuns the address as checksummed', () => { + expect(outAddress(address)).toEqual(checksum); + }); + + it('retuns the checksum as checksummed', () => { + expect(outAddress(checksum)).toEqual(checksum); + }); + }); + + describe('outBlock', () => { + ['author', 'miner'].forEach(input => { + it(`formats ${input} address as address`, () => { + const block: SerializedBlock = {}; + + block[input as keyof SerializedBlock] = address; + const formatted = outBlock(block)[input as keyof Block]; + + expect(isAddress(formatted as string)).toBe(true); + expect(formatted).toEqual(checksum); + }); + }); + + [ + 'difficulty', + 'gasLimit', + 'gasUsed', + 'number', + 'nonce', + 'totalDifficulty' + ].forEach(input => { + it(`formats ${input} number as hexnumber`, () => { + const block: SerializedBlock = {}; + + block[input as keyof SerializedBlock] = 0x123; + const formatted = outBlock(block)[input as keyof Block]; + + expect(isInstanceOf(formatted, BigNumber)).toBe(true); + // @ts-ignore + expect(formatted.toString(16)).toEqual('123'); + }); + }); + + ['timestamp'].forEach(input => { + it(`formats ${input} number as Date`, () => { + const block: SerializedBlock = {}; + + block[input as keyof SerializedBlock] = 0x57513668; + const formatted = outBlock(block)[input as keyof Block]; + + expect(isInstanceOf(formatted, Date)).toBe(true); + expect((formatted as Date).getTime()).toEqual(1464940136000); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outBlock({ someRandom: 'someRandom' } as any)).toEqual({ + someRandom: 'someRandom' + }); + }); + + it('formats a block with all the info converted', () => { + expect( + outBlock({ + author: address, + miner: address, + difficulty: '0x100', + gasLimit: '0x101', + gasUsed: '0x102', + number: '0x103', + nonce: '0x104', + totalDifficulty: '0x105', + timestamp: '0x57513668', + extraData: 'someExtraStuffInHere' + }) + ).toEqual({ + author: checksum, + miner: checksum, + difficulty: new BigNumber('0x100'), + gasLimit: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + number: new BigNumber('0x103'), + nonce: new BigNumber('0x104'), + totalDifficulty: new BigNumber('0x105'), + timestamp: new Date('2016-06-03T07:48:56.000Z'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outChainStatus', () => { + it('formats blockGap values', () => { + const status = { + blockGap: [0x1234, '0x5678'] + }; + + expect(outChainStatus(status)).toEqual({ + blockGap: [new BigNumber(0x1234), new BigNumber(0x5678)] + }); + }); + + it('handles null blockGap values', () => { + const status = { + blockGap: undefined + }; + + expect(outChainStatus(status)).toEqual(status); + }); + }); + + describe('outDate', () => { + it('converts a second date in unix timestamp', () => { + expect(outDate(0x57513668)).toEqual(new Date('2016-06-03T07:48:56.000Z')); + }); + }); + + describe('outHistogram', () => { + ['bucketBounds', 'counts'].forEach(type => { + it(`formats ${type} as number arrays`, () => { + expect(outHistogram({ [type]: [0x123, 0x456, 0x789] })).toEqual({ + [type]: [ + new BigNumber(0x123), + new BigNumber(0x456), + new BigNumber(0x789) + ] + }); + }); + }); + }); + + describe('outHwAccountInfo', () => { + it('returns objects with formatted addresses', () => { + expect( + outHwAccountInfo({ + '0x63cf90d3f0410092fc0fca41846f596223979195': { + manufacturer: 'mfg', + name: 'type' + } + }) + ).toEqual({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + manufacturer: 'mfg', + name: 'type' + } + }); + }); + }); + + describe('outNodeKind', () => { + it('formats the input as received', () => { + const kind = { availability: 'personal', capability: 'full' }; + + expect(outNodeKind(kind)).toEqual(kind); + }); + }); + + describe('outNumber', () => { + it('returns a BigNumber equalling the value', () => { + const bn = outNumber('0x123456'); + + expect(isInstanceOf(bn, BigNumber)).toBe(true); + expect(bn.eq(0x123456)).toBe(true); + }); + + it('assumes 0 when ivalid input', () => { + expect(outNumber().eq(0)).toBe(true); + }); + }); + + describe('outPeer', () => { + it('converts all internal numbers to BigNumbers', () => { + expect( + outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + } + } + }) + ).toEqual({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: new BigNumber(15), + head: '0x02', + version: 63 + } + } + }); + }); + + it('does not output null protocols', () => { + expect( + outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + les: null + } + }) + ).toEqual({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: {} + }); + }); + }); + + describe('outPeers', () => { + it('converts all internal numbers to BigNumbers', () => { + expect( + outPeers({ + active: 789, + connected: '456', + max: 0x7b, + peers: [ + { + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + }, + les: null + } + } + ] + }) + ).toEqual({ + active: new BigNumber(789), + connected: new BigNumber(456), + max: new BigNumber(123), + peers: [ + { + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: new BigNumber(15), + head: '0x02', + version: 63 + } + } + } + ] + }); + }); + }); + + describe('outReceipt', () => { + ['contractAddress'].forEach(input => { + it(`formats ${input} address as address`, () => { + const block: SerializedReceipt = {}; + + block[input as keyof SerializedReceipt] = address; + const formatted = outReceipt(block)[input as keyof Receipt]; + + expect(isAddress(formatted as string)).toBe(true); + expect(formatted).toEqual(checksum); + }); + }); + + [ + 'blockNumber', + 'cumulativeGasUsed', + 'cumulativeGasUsed', + 'gasUsed', + 'transactionIndex' + ].forEach(input => { + it(`formats ${input} number as hexnumber`, () => { + const block: SerializedReceipt = {}; + + block[input as keyof SerializedReceipt] = 0x123; + const formatted = outReceipt(block)[input as keyof Receipt]; + + expect(isInstanceOf(formatted, BigNumber)).toBe(true); + // @ts-ignore + expect(formatted.toString(16)).toEqual('123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + // @ts-ignore + expect(outReceipt({ someRandom: 'someRandom' })).toEqual({ + someRandom: 'someRandom' + }); + }); + + it('formats a receipt with all the info converted', () => { + expect( + outReceipt({ + contractAddress: address, + blockNumber: '0x100', + cumulativeGasUsed: '0x101', + gasUsed: '0x102', + transactionIndex: '0x103', + extraData: 'someExtraStuffInHere' + }) + ).toEqual({ + contractAddress: checksum, + blockNumber: new BigNumber('0x100'), + cumulativeGasUsed: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + transactionIndex: new BigNumber('0x103'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outSyncing', () => { + [ + 'currentBlock', + 'highestBlock', + 'startingBlock', + 'warpChunksAmount', + 'warpChunksProcessed' + ].forEach(input => { + it(`formats ${input} numbers as a number`, () => { + expect(outSyncing({ [input]: '0x123' })).toEqual({ + [input]: new BigNumber('0x123') + }); + }); + }); + + it('formats blockGap properly', () => { + expect(outSyncing({ blockGap: [0x123, 0x456] })).toEqual({ + blockGap: [new BigNumber(0x123), new BigNumber(0x456)] + }); + }); + }); + + describe('outTransaction', () => { + ['from', 'to'].forEach(input => { + it(`formats ${input} address as address`, () => { + const block: SerializedTransaction = {}; + + block[input as keyof SerializedTransaction] = address; + const formatted = outTransaction(block)[ + input as keyof SerializedTransaction + ]; + + expect(isAddress(formatted as string)).toBe(true); + expect(formatted).toEqual(checksum); + }); + }); + + [ + 'blockNumber', + 'gasPrice', + 'gas', + 'nonce', + 'transactionIndex', + 'value' + ].forEach(input => { + it(`formats ${input} number as hexnumber`, () => { + const block: SerializedTransaction = {}; + + block[input as keyof SerializedTransaction] = 0x123; + const formatted = outTransaction(block)[ + input as keyof SerializedTransaction + ]; + + expect(isInstanceOf(formatted, BigNumber)).toBe(true); + // @ts-ignore + expect(formatted.toString(16)).toEqual('123'); + }); + }); + + it('passes condition as null when null', () => { + expect(outTransaction({ condition: null })).toEqual({ condition: null }); + }); + + it('ignores and passes through unknown keys', () => { + // @ts-ignore + expect(outTransaction({ someRandom: 'someRandom' })).toEqual({ + someRandom: 'someRandom' + }); + }); + + it('formats a transaction with all the info converted', () => { + expect( + outTransaction({ + from: address, + to: address, + blockNumber: '0x100', + gasPrice: '0x101', + gas: '0x102', + nonce: '0x103', + transactionIndex: '0x104', + value: '0x105', + extraData: 'someExtraStuffInHere' + }) + ).toEqual({ + from: checksum, + to: checksum, + blockNumber: new BigNumber('0x100'), + gasPrice: new BigNumber('0x101'), + gas: new BigNumber('0x102'), + nonce: new BigNumber('0x103'), + transactionIndex: new BigNumber('0x104'), + value: new BigNumber('0x105'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outTrace', () => { + it('ignores and passes through unknown keys', () => { + // @ts-ignore + expect(outTrace({ someRandom: 'someRandom' })).toEqual({ + someRandom: 'someRandom' + }); + }); + + it('formats a trace with all the info converted', () => { + const formatted = outTrace({ + type: 'call', + action: { + from: address, + to: address, + value: '0x06', + gas: '0x07', + input: '0x1234', + callType: 'call' + }, + result: { + gasUsed: '0x08', + output: '0x5678' + }, + traceAddress: ['0x2'], + subtraces: 3, + transactionPosition: '0xb', + transactionHash: + '0x000000000000000000000000000000000000000000000000000000000000000c', + blockNumber: '0x0d', + blockHash: + '0x000000000000000000000000000000000000000000000000000000000000000e' + }); + + // @ts-ignore + expect(isInstanceOf(formatted.action.gas, BigNumber)).toBe(true); + // @ts-ignore + expect(formatted.action.gas.toNumber()).toEqual(7); + // @ts-ignore + expect(isInstanceOf(formatted.action.value, BigNumber)).toBe(true); + // @ts-ignore + expect(formatted.action.value.toNumber()).toEqual(6); + + // @ts-ignore + expect(formatted.action.from).toEqual(checksum); + // @ts-ignore + expect(formatted.action.to).toEqual(checksum); + + // @ts-ignore + expect(isInstanceOf(formatted.blockNumber, BigNumber)).toBe(true); + // @ts-ignore + expect(formatted.blockNumber.toNumber()).toEqual(13); + // @ts-ignore + expect(isInstanceOf(formatted.transactionPosition, BigNumber)).toBe(true); + // @ts-ignore + expect(formatted.transactionPosition.toNumber()).toEqual(11); + }); + }); + + describe('outVaultMeta', () => { + it('returns an exmpt object on null', () => { + expect(outVaultMeta(null)).toEqual({}); + }); + + it('returns the original value if not string', () => { + expect(outVaultMeta({ test: 123 })).toEqual({ test: 123 }); + }); + + it('returns an object from JSON string', () => { + expect(outVaultMeta('{"test":123}')).toEqual({ test: 123 }); + }); + + it('returns an empty object on invalid JSON', () => { + expect(outVaultMeta('{"test"}')).toEqual({}); + }); + }); +}); diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts new file mode 100644 index 00000000..974046bc --- /dev/null +++ b/packages/api/src/format/output.ts @@ -0,0 +1,556 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import BigNumber from 'bignumber.js'; +import { isString } from '@parity/abi/lib/util/types'; +import { toChecksumAddress } from '@parity/abi/lib/util/address'; + +import { + AccountInfo, + Block, + ChainStatus, + Condition, + Histogram, + HwAccountInfo, + Log, + NodeKind, + Peer, + PeerProtocolItem, + PeerProtocol, + Peers, + Receipt, + SignerRequest, + SigningPayload, + Syncing, + Trace, + TraceReplay, + Transaction, + VaultMeta +} from '../types'; +import { + SerializedAccountInfo, + SerializedBlock, + SerializedChainStatus, + SerializedCondition, + SerializedHistogram, + SerializedHwAccountInfo, + SerializedLog, + SerializedPeer, + SerializedPeers, + SerializedReceipt, + SerializedSignerRequest, + SerializedSigningPayload, + SerializedSyncing, + SerializedTrace, + SerializedTraceReplay, + SerializedTransaction, + SerializedVaultMeta, + SerializedNumber +} from './types.serialized'; + +export function outAccountInfo (infos: SerializedAccountInfo) { + return Object.keys(infos).reduce( + (ret, _address) => { + const info = infos[_address]; + const address = outAddress(_address); + + ret[address] = { + name: info.name + }; + + if (info.meta) { + ret[address].uuid = info.uuid; + try { + ret[address].meta = JSON.parse(info.meta); + } catch (e) { + console.error( + `Couldn't parse meta field of JSON key file ${info.uuid}` + ); + } + } + + return ret; + }, + {} as AccountInfo + ); +} + +export function outAddress (address?: string) { + return toChecksumAddress(address); +} + +export function outAddresses (addresses: string[]) { + return (addresses || []).map(outAddress); +} + +export function outBlock (block: SerializedBlock) { + const result: Block = {}; + + if (block) { + Object.keys(block).forEach(key => { + switch (key) { + case 'author': + case 'miner': + result[key] = outAddress(block[key]); + break; + + case 'difficulty': + case 'gasLimit': + case 'gasUsed': + case 'nonce': + case 'number': + case 'totalDifficulty': + result[key] = outNumber(block[key]); + break; + + case 'timestamp': + result[key] = outDate(block[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = block[key]; + } + }); + } + + return result; +} + +export function outChainStatus (status?: SerializedChainStatus) { + const result: ChainStatus = {}; + if (status) { + Object.keys(status).forEach(key => { + switch (key) { + case 'blockGap': + result[key] = status[key] + ? (status[key] as number[]).map(outNumber) + : undefined; + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = status[key]; + } + }); + } + + return result; +} + +export function outDate (date?: number | string | Date) { + if (date instanceof Date && typeof date.toISOString === 'function') { + return date; + } + + try { + if (typeof date === 'string' && new Date(date).toISOString() === date) { + return new Date(date); + } + } catch (error) { + /* Do nothing */ + } + + return new Date(outNumber(date as number).toNumber() * 1000); +} + +export function outHistogram (histogram: SerializedHistogram) { + const result: Histogram = {}; + if (histogram) { + Object.keys(histogram).forEach(key => { + switch (key) { + case 'bucketBounds': + case 'counts': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key] = histogram[key].map(outNumber); + break; + } + }); + } + + return result; +} + +export function outLog (log: SerializedLog) { + const result: Log = {}; + Object.keys(log).forEach(key => { + switch (key) { + case 'blockNumber': + case 'logIndex': + case 'transactionIndex': + result[key] = outNumber(log[key]); + break; + + case 'address': + result[key] = outAddress(log[key]); + break; + } + }); + + return result; +} + +export function outHwAccountInfo (infos: SerializedHwAccountInfo) { + return Object.keys(infos).reduce( + (ret, _address) => { + const address = outAddress(_address); + + ret[address] = infos[_address]; + + return ret; + }, + {} as HwAccountInfo + ); +} + +export function outNodeKind (info: NodeKind) { + return info; +} + +export function outNumber (n?: SerializedNumber) { + return new BigNumber(n || 0); +} + +export function outPeer (peer: SerializedPeer) { + const protocols = Object.keys(peer.protocols).reduce( + (obj, key) => { + if (peer.protocols[key as PeerProtocol]) { + // @ts-ignore + obj[key as PeerProtocol] = Object.assign( + {}, + peer.protocols[key as PeerProtocol], + { + difficulty: outNumber( + // @ts-ignore "Object is possibly 'undefined'." No it's not. + peer.protocols[key as PeerProtocol].difficulty + ) + } + ); + } + + return obj; + }, + {} as { les?: PeerProtocolItem; par?: PeerProtocolItem } + ); + + return { + caps: peer.caps, + id: peer.id, + name: peer.name, + network: peer.network, + protocols + } as Peer; +} + +export function outPeers (peers: SerializedPeers) { + return { + active: outNumber(peers.active), + connected: outNumber(peers.connected), + max: outNumber(peers.max), + peers: peers.peers.map(peer => outPeer(peer)) + } as Peers; +} + +export function outPrivateReceipt (receipt: SerializedReceipt) { + const result: Receipt = {}; + if (receipt) { + Object.keys(receipt).forEach(key => { + switch (key) { + case 'status': + result[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + result[key] = outAddress(receipt[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = receipt[key]; + } + }); + } + + return result; +} + +export function outReceipt (receipt: SerializedReceipt) { + const result: Receipt = {}; + if (receipt) { + Object.keys(receipt).forEach(key => { + switch (key) { + case 'blockNumber': + case 'cumulativeGasUsed': + case 'gasUsed': + case 'transactionIndex': + result[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + result[key] = outAddress(receipt[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = receipt[key]; + } + }); + } + + return result; +} + +export function outSignerRequest (request: SerializedSignerRequest) { + const result: SignerRequest = {}; + + if (request) { + Object.keys(request).forEach(key => { + switch (key) { + case 'id': + result[key] = outNumber(request[key]); + break; + + case 'payload': + result[key] = {}; + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].decrypt = outSigningPayload(request[key].decrypt); + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].sign = outSigningPayload(request[key].sign); + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].signTransaction = outTransaction( + // @ts-ignore "Object is possibly 'undefined'." No it's not. + request[key].signTransaction + ); + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result[key].sendTransaction = outTransaction( + // @ts-ignore "Object is possibly 'undefined'." No it's not. + request[key].sendTransaction + ); + break; + + case 'origin': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + const type = Object.keys(result[key])[0]; + // @ts-ignore "Object is possibly 'undefined'." No it's not. + const details = result[key][type]; + + request[key] = { type, details }; + break; + } + }); + } + + return result; +} + +export function outSyncing (syncing: SerializedSyncing) { + const result: Syncing = {}; + + if (syncing && syncing !== 'false') { + Object.keys(syncing).forEach(key => { + switch (key) { + case 'currentBlock': + case 'highestBlock': + case 'startingBlock': + case 'warpChunksAmount': + case 'warpChunksProcessed': + result[key] = outNumber(syncing[key]); + break; + + case 'blockGap': + result[key] = syncing[key] + ? (syncing[key] as number[]).map(outNumber) + : undefined; + break; + } + }); + } + + return result; +} + +export function outTransactionCondition ( + condition?: SerializedCondition | null +) { + let result: Condition | null = null; + if (condition) { + result = {}; + if (condition.block) { + result.block = outNumber(condition.block); + } else if (condition.time) { + result.time = outDate(condition.time); + } + } + + return result; +} + +export function outTransaction (tx: SerializedTransaction) { + const result: Transaction = {}; + + if (tx) { + Object.keys(tx).forEach(key => { + switch (key) { + case 'blockNumber': + case 'gasPrice': + case 'gas': + case 'nonce': + case 'transactionIndex': + case 'value': + result[key] = outNumber(tx[key]); + break; + + case 'condition': + result[key] = outTransactionCondition(tx[key]); + break; + + case 'creates': + case 'from': + case 'to': + result[key] = outAddress(tx[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = tx[key]; + } + }); + } + + return result; +} + +export function outSigningPayload (payload: SerializedSigningPayload) { + const result: SigningPayload = {}; + if (payload) { + Object.keys(payload).forEach(key => { + switch (key) { + case 'address': + result[key] = outAddress(payload[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = payload[key]; + } + }); + } + + return payload; +} + +export function outTrace (trace: SerializedTrace) { + const result: Trace = {}; + if (trace) { + Object.keys(trace).forEach(key => { + switch (key) { + case 'subtraces': + case 'transactionPosition': + case 'blockNumber': + result[key] = outNumber(trace[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = trace[key]; + } + }); + + if (trace.action) { + result.action = {}; + Object.keys(trace.action).forEach(key => { + switch (key) { + case 'gas': + case 'value': + case 'balance': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.action[key] = outNumber(trace.action[key]); + break; + + case 'from': + case 'to': + case 'address': + case 'refundAddress': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.action[key] = outAddress(trace.action[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result.action[key] = trace.action[key]; + } + }); + } + + if (trace.result) { + result.result = {}; + Object.keys(trace.result).forEach(key => { + switch (key) { + case 'gasUsed': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.result[key] = outNumber(trace.result[key]); + break; + + case 'address': + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.action[key] = outAddress(trace.action[key]); + break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result.result[key] = trace.result[key]; + } + }); + } + + if (trace.traceAddress) { + result.traceAddress = []; + trace.traceAddress.forEach((address, index) => { + // @ts-ignore "Object is possibly 'undefined'." No it's not. + result.traceAddress[index] = outNumber(address); + }); + } + } + + return result; +} + +export function outTraces (traces?: SerializedTrace[]) { + if (traces) { + return traces.map(outTrace); + } + + return traces; +} + +export function outTraceReplay (trace: SerializedTraceReplay) { + const result: TraceReplay = {}; + + if (trace) { + Object.keys(trace).forEach(key => { + switch (key) { + case 'trace': + result[key] = outTraces(trace[key]); + break; + } + }); + } + + return result; +} + +export function outVaultMeta (meta: SerializedVaultMeta) { + if (isString(meta)) { + try { + const obj = JSON.parse(meta); + + return obj as VaultMeta; + } catch (error) { + return {}; + } + } + + return meta || {}; +} diff --git a/packages/api/src/format/types.serialized.ts b/packages/api/src/format/types.serialized.ts new file mode 100644 index 00000000..d64cd5f8 --- /dev/null +++ b/packages/api/src/format/types.serialized.ts @@ -0,0 +1,162 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +export type SerializedNumber = number | string; + +export interface SerializedAccountInfo { + [address: string]: { meta?: string; name: string; uuid?: string }; +} + +export interface SerializedBlock { + author?: string; + miner?: string; + difficulty?: string; + extraData?: string; + gasLimit?: string; + gasUsed?: string; + nonce?: string; + number?: string; + totalDifficulty?: string; + timestamp?: number | string; +} + +export type SerializedBlockGap = (string | number)[]; + +export interface SerializedChainStatus { + blockGap?: SerializedBlockGap | null; +} + +export type SerializedCondition = { + block?: SerializedNumber; + time?: SerializedNumber; +}; + +export interface SerializedHistogram { + bucketBounds?: number[]; + counts?: number[]; +} + +export interface SerializedHwAccountInfo { + [address: string]: { [key: string]: any }; +} + +export interface SerializedLog { + address: string; + blockNumber: SerializedNumber; + logIndex: SerializedNumber; + transactionIndex: SerializedNumber; +} + +export interface SerializedPeer { + caps?: string[]; + id?: string; + name?: string; + network?: { + localAddress: string; + remoteAddress: string; + }; + protocols: { + les?: { + difficulty: SerializedNumber; + head: SerializedNumber; + version: SerializedNumber; + } | null; + par?: { + difficulty: SerializedNumber; + head: SerializedNumber; + version: SerializedNumber; + } | null; + }; +} + +export interface SerializedPeers { + active: SerializedNumber; + connected: SerializedNumber; + max: SerializedNumber; + peers: SerializedPeer[]; +} + +export interface SerializedReceipt { + blockNumber?: SerializedNumber; + contractAddress?: string; + cumulativeGasUsed?: SerializedNumber; + extraData?: string; + gasUsed?: SerializedNumber; + transactionIndex?: SerializedNumber; + status?: SerializedNumber; +} + +export interface SerializedSignerRequest { + id?: SerializedNumber; + origin?: { + [index: string]: string; + }; + payload?: { + decrypt?: SerializedSigningPayload; + sign?: SerializedSigningPayload; + signTransaction?: SerializedTransaction; + sendTransaction?: SerializedTransaction; + }; +} + +export interface SerializedSigningPayload { + address?: string; +} + +export interface SerializedTrace { + action?: { + callType?: string; + gas?: SerializedNumber; + value?: SerializedNumber; + balance?: SerializedNumber; + from?: string; + input?: string; + to?: string; + address?: string; + refundAddress?: string; + }; + blockHash?: string; + blockNumber?: SerializedNumber; + result?: { + address?: string; + gasUsed?: SerializedNumber; + output?: string; + }; + traceAddress?: SerializedNumber[]; + subtraces?: SerializedNumber; + transactionHash?: string; + transactionPosition?: SerializedNumber; + type?: string; +} + +export interface SerializedTraceReplay { + trace?: SerializedTrace[]; +} + +export interface SerializedTransaction { + blockNumber?: SerializedNumber; + creates?: string; + extraData?: string; + to?: string; + from?: string; + condition?: SerializedCondition | null; + gas?: string; + gasPrice?: string; + transactionIndex?: SerializedNumber; + value?: string; + nonce?: string; + data?: string; +} + +export interface SerializedSyncing { + currentBlock?: SerializedNumber; + highestBlock?: SerializedNumber; + startingBlock?: SerializedNumber; + warpChunksAmount?: SerializedNumber; + warpChunksProcessed?: SerializedNumber; + blockGap?: SerializedBlockGap | null; +} + +export type SerializedVaultMeta = string | { [key: string]: any } | null; diff --git a/packages/api/src/util/address.js b/packages/api/src/util/address.js deleted file mode 100644 index a446f9f4..00000000 --- a/packages/api/src/util/address.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { isAddress, toChecksumAddress } = require('@parity/abi/lib/util/address'); - -module.exports = { - isAddress, - toChecksumAddress -}; diff --git a/packages/api/src/util/address.ts b/packages/api/src/util/address.ts new file mode 100644 index 00000000..9f9c88d8 --- /dev/null +++ b/packages/api/src/util/address.ts @@ -0,0 +1,6 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +export { isAddress, toChecksumAddress } from '@parity/abi/lib/util/address'; diff --git a/packages/api/src/util/decode.js b/packages/api/src/util/decode.js deleted file mode 100644 index afcf835a..00000000 --- a/packages/api/src/util/decode.js +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { isHex } = require('./types'); - -const Func = require('@parity/abi/lib/spec/function'); -const { fromParamType, toParamType } = require('@parity/abi/lib/spec/paramType/format'); - -function decodeCallData (data) { - if (!isHex(data)) { - throw new Error('Input to decodeCallData should be a hex value'); - } - - if (data.substr(0, 2) === '0x') { - return decodeCallData(data.slice(2)); - } - - if (data.length < 8) { - throw new Error('Input to decodeCallData should be method signature + data'); - } - - const signature = data.substr(0, 8); - const paramdata = data.substr(8); - - return { - signature: `0x${signature}`, - paramdata: `0x${paramdata}` - }; -} - -function decodeMethodInput (methodAbi, paramdata) { - if (!methodAbi) { - throw new Error('decodeMethodInput should receive valid method-specific ABI'); - } - - if (paramdata && paramdata.length) { - if (!isHex(paramdata)) { - throw new Error('Input to decodeMethodInput should be a hex value'); - } - - if (paramdata.substr(0, 2) === '0x') { - return decodeMethodInput(methodAbi, paramdata.slice(2)); - } - } - - return new Func(methodAbi).decodeInput(paramdata).map((decoded) => decoded.value); -} - -// takes a method in form name(...,types) and returns the inferred abi definition -function methodToAbi (method) { - const length = method.length; - const typesStart = method.indexOf('('); - const typesEnd = method.indexOf(')'); - - if (typesStart === -1) { - throw new Error(`Missing start ( in call to decodeMethod with ${method}`); - } else if (typesEnd === -1) { - throw new Error(`Missing end ) in call to decodeMethod with ${method}`); - } else if (typesEnd < typesStart) { - throw new Error(`End ) is before start ( in call to decodeMethod with ${method}`); - } else if (typesEnd !== length - 1) { - throw new Error(`Extra characters after end ) in call to decodeMethod with ${method}`); - } - - const name = method.substr(0, typesStart); - const types = method.substr(typesStart + 1, length - (typesStart + 1) - 1).split(','); - const inputs = types.filter((_type) => _type.length).map((_type) => { - const type = fromParamType(toParamType(_type)); - - return { type }; - }); - - return { type: 'function', name, inputs }; -} - -function abiDecode (inputTypes, data) { - return decodeMethodInput({ - inputs: inputTypes.map((type) => { - return { type }; - }) - }, data); -} - -module.exports = { - decodeCallData, - decodeMethodInput, - methodToAbi, - abiDecode -}; diff --git a/packages/api/src/util/decode.spec.js b/packages/api/src/util/decode.spec.js deleted file mode 100644 index ed97efb7..00000000 --- a/packages/api/src/util/decode.spec.js +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const BigNumber = require('bignumber.js'); -const { abiDecode, decodeCallData, decodeMethodInput, methodToAbi } = require('./decode'); - -describe('util/decode', () => { - const METH = '0x70a08231'; - const ENCO = '0x70a082310000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; - const DATA = '0x0000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; - - describe('decodeCallData', () => { - it('throws on non-hex inputs', () => { - expect(() => decodeCallData('invalid')).to.throw(/should be a hex value/); - }); - - it('throws when invalid signature length', () => { - expect(() => decodeCallData(METH.slice(-6))).to.throw(/should be method signature/); - }); - - it('splits valid inputs properly', () => { - expect(decodeCallData(ENCO)).to.deep.equal({ - signature: METH, - paramdata: DATA - }); - }); - }); - - describe('decodeMethodInput', () => { - it('expects a valid ABI', () => { - expect(() => decodeMethodInput(null, null)).to.throw(/should receive valid method/); - }); - - it('expects valid hex parameter data', () => { - expect(() => decodeMethodInput({}, 'invalid')).to.throw(/should be a hex value/); - }); - - it('correct decodes null inputs', () => { - expect(decodeMethodInput({}, null)).to.deep.equal([]); - }); - - it('correct decodes empty inputs', () => { - expect(decodeMethodInput({}, '')).to.deep.equal([]); - }); - - it('correctly decodes valid inputs', () => { - expect( - decodeMethodInput({ - type: 'function', - inputs: [ - { type: 'uint' } - ] - }, DATA) - ).to.deep.equal( - [ new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') ] - ); - }); - }); - - describe('methodToAbi', () => { - it('throws when no start ( specified', () => { - expect(() => methodToAbi('invalid,uint,bool)')).to.throw(/Missing start \(/); - }); - - it('throws when no end ) specified', () => { - expect(() => methodToAbi('invalid(uint,bool')).to.throw(/Missing end \)/); - }); - - it('throws when end ) is not in the last position', () => { - expect(() => methodToAbi('invalid(uint,bool)2')).to.throw(/Extra characters after end \)/); - }); - - it('throws when start ( is after end )', () => { - expect(() => methodToAbi('invalid)uint,bool(')).to.throw(/End \) is before start \(/); - }); - - it('throws when invalid types are present', () => { - expect(() => methodToAbi('method(invalidType,bool,uint)')).to.throw(/Cannot convert invalidType/); - }); - - it('returns a valid methodabi for a valid method', () => { - expect(methodToAbi('valid(uint,bool)')).to.deep.equals({ - type: 'function', - name: 'valid', - inputs: [ - { type: 'uint256' }, - { type: 'bool' } - ] - }); - }); - }); - - describe('abiDecode', () => { - it('correctly decodes valid inputs', () => { - expect(abiDecode(['uint'], DATA)).to.deep.equal( - [ new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') ] - ); - }); - }); -}); diff --git a/packages/api/src/util/decode.spec.ts b/packages/api/src/util/decode.spec.ts new file mode 100644 index 00000000..ba272843 --- /dev/null +++ b/packages/api/src/util/decode.spec.ts @@ -0,0 +1,119 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import BigNumber from 'bignumber.js'; +import { + abiDecode, + decodeCallData, + decodeMethodInput, + methodToAbi +} from './decode'; + +describe('util/decode', () => { + const METH = '0x70a08231'; + const ENCO = + '0x70a082310000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + const DATA = + '0x0000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + + describe('decodeCallData', () => { + it('throws on non-hex inputs', () => { + expect(() => decodeCallData('invalid')).toThrow(/should be a hex value/); + }); + + it('throws when invalid signature length', () => { + expect(() => decodeCallData(METH.slice(-6))).toThrow( + /should be method signature/ + ); + }); + + it('splits valid inputs properly', () => { + expect(decodeCallData(ENCO)).toEqual({ + signature: METH, + paramdata: DATA + }); + }); + }); + + describe('decodeMethodInput', () => { + it('expects a valid ABI', () => { + expect(() => decodeMethodInput(null as any, null as any)).toThrow( + /should receive valid method/ + ); + }); + + it('expects valid hex parameter data', () => { + expect(() => decodeMethodInput({}, 'invalid')).toThrow( + /should be a hex value/ + ); + }); + + it('correct decodes null inputs', () => { + expect(decodeMethodInput({})).toEqual([]); + }); + + it('correct decodes empty inputs', () => { + expect(decodeMethodInput({}, '')).toEqual([]); + }); + + it('correctly decodes valid inputs', () => { + expect( + decodeMethodInput( + { + type: 'function', + inputs: [{ type: 'uint' }] + }, + DATA + ) + ).toEqual([new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9')]); + }); + }); + + describe('methodToAbi', () => { + it('throws when no start ( specified', () => { + expect(() => methodToAbi('invalid,uint,bool)')).toThrow( + /Missing start \(/ + ); + }); + + it('throws when no end ) specified', () => { + expect(() => methodToAbi('invalid(uint,bool')).toThrow(/Missing end \)/); + }); + + it('throws when end ) is not in the last position', () => { + expect(() => methodToAbi('invalid(uint,bool)2')).toThrow( + /Extra characters after end \)/ + ); + }); + + it('throws when start ( is after end )', () => { + expect(() => methodToAbi('invalid)uint,bool(')).toThrow( + /End \) is before start \(/ + ); + }); + + it('throws when invalid types are present', () => { + expect(() => methodToAbi('method(invalidType,bool,uint)')).toThrow( + /Cannot convert invalidType/ + ); + }); + + it('returns a valid methodabi for a valid method', () => { + expect(methodToAbi('valid(uint,bool)')).toEqual({ + type: 'function', + name: 'valid', + inputs: [{ type: 'uint256' }, { type: 'bool' }] + }); + }); + }); + + describe('abiDecode', () => { + it('correctly decodes valid inputs', () => { + expect(abiDecode(['uint'], DATA)).toEqual([ + new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') + ]); + }); + }); +}); diff --git a/packages/api/src/util/decode.ts b/packages/api/src/util/decode.ts new file mode 100644 index 00000000..c1ce8a72 --- /dev/null +++ b/packages/api/src/util/decode.ts @@ -0,0 +1,131 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { AbiItem, TokenTypeEnum, TokenValue } from '@parity/abi'; +import { + fromParamType, + toParamType +} from '@parity/abi/lib/spec/paramType/format'; +import Func from '@parity/abi/lib/spec/function'; + +import { isHex } from './types'; + +/** + * Decode call data. + * + * @param data - The call data to decode. + */ +export const decodeCallData = ( + data: string +): { paramdata: string; signature: string } => { + if (!isHex(data)) { + throw new Error('Input to decodeCallData should be a hex value'); + } + + if (data.startsWith('0x')) { + return decodeCallData(data.slice(2)); + } + + if (data.length < 8) { + throw new Error( + 'Input to decodeCallData should be method signature + data' + ); + } + + const signature = data.substr(0, 8); + const paramdata = data.substr(8); + + return { + signature: `0x${signature}`, + paramdata: `0x${paramdata}` + }; +}; + +/** + * Decode the method inputs. + * + * @param methodAbi - The ABI of the method. + * @param paramdata - + */ +export const decodeMethodInput = ( + methodAbi: AbiItem, + paramdata?: string +): TokenValue[] => { + if (!methodAbi) { + throw new Error( + 'decodeMethodInput should receive valid method-specific ABI' + ); + } + + if (paramdata && paramdata.length) { + if (!isHex(paramdata)) { + throw new Error('Input to decodeMethodInput should be a hex value'); + } + + if (paramdata.substr(0, 2) === '0x') { + return decodeMethodInput(methodAbi, paramdata.slice(2)); + } + } + + return new Func(methodAbi) + .decodeInput(paramdata) + .map(decoded => decoded.value) as TokenValue[]; +}; + +/** + * Takes a method in form name(...,types) and returns the inferred abi definition. + * + * @param method - The method to convert to abi. + */ +export const methodToAbi = (method: string) => { + const length = method.length; + const typesStart = method.indexOf('('); + const typesEnd = method.indexOf(')'); + + if (typesStart === -1) { + throw new Error(`Missing start ( in call to decodeMethod with ${method}`); + } else if (typesEnd === -1) { + throw new Error(`Missing end ) in call to decodeMethod with ${method}`); + } else if (typesEnd < typesStart) { + throw new Error( + `End ) is before start ( in call to decodeMethod with ${method}` + ); + } else if (typesEnd !== length - 1) { + throw new Error( + `Extra characters after end ) in call to decodeMethod with ${method}` + ); + } + + const name = method.substr(0, typesStart); + const types = method + .substr(typesStart + 1, length - (typesStart + 1) - 1) + .split(','); + const inputs = types + .filter(_type => _type.length) + .map(_type => { + const type = fromParamType(toParamType(_type)); + + return { type }; + }); + + return { type: 'function', name, inputs }; +}; + +/** + * Decode fata from an ABI. + * + * @param inputTypes - The types of the inputs. + * @param data - The data passed to this ABI. + */ +export const abiDecode = (inputTypes: TokenTypeEnum[], data: string) => { + return decodeMethodInput( + { + inputs: inputTypes.map(type => { + return { type }; + }) + }, + data + ); +}; diff --git a/packages/api/src/util/encode.js b/packages/api/src/util/encode.js deleted file mode 100644 index 89f98a2b..00000000 --- a/packages/api/src/util/encode.js +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const Abi = require('@parity/abi'); -const Func = require('@parity/abi/lib/spec/function'); - -const { abiDecode } = require('./decode'); -const { cleanupValue } = require('./format'); -const { sha3 } = require('./sha3'); - -function encodeMethodCallAbi (methodAbi = {}, values = []) { - const func = new Func(methodAbi); - const tokens = Abi.encodeTokens(func.inputParamTypes(), values); - const call = func.encodeCall(tokens); - - return `0x${call}`; -} - -function abiEncode (methodName, inputTypes, data) { - const result = encodeMethodCallAbi({ - name: methodName || '', - type: 'function', - inputs: inputTypes.map((type) => { - return { type }; - }) - }, data); - - return result; -} - -function abiUnencode (abi, data) { - const callsig = data.substr(2, 8); - const op = abi.find((field) => { - return field.type === 'function' && - abiSignature(field.name, field.inputs.map((input) => input.type)).substr(2, 8) === callsig; - }); - - if (!op) { - console.warn(`Unknown function ID: ${callsig}`); - return null; - } - - let argsByIndex = abiDecode(op.inputs.map((field) => field.type), '0x' + data.substr(10)) - .map((value, index) => cleanupValue(value, op.inputs[index].type)); - const argsByName = op.inputs.reduce((result, field, index) => { - result[field.name] = argsByIndex[index]; - - return result; - }, {}); - - return [op.name, argsByName, argsByIndex]; -} - -function abiSignature (name, inputs) { - return sha3(`${name}(${inputs.join()})`); -} - -module.exports = { - abiEncode, - abiSignature, - abiUnencode, - encodeMethodCallAbi -}; diff --git a/packages/api/src/util/encode.spec.js b/packages/api/src/util/encode.spec.js deleted file mode 100644 index c294f35f..00000000 --- a/packages/api/src/util/encode.spec.js +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -/* eslint-disable no-unused-expressions */ - -const { abiEncode, abiUnencode, abiSignature, encodeMethodCallAbi } = require('./encode'); - -const ABI = { - type: 'function', - name: 'valid', - inputs: [ - { type: 'uint256' }, - { type: 'bool' } - ] -}; - -const RESULT = [ - 'f87fa141', - '0000000000000000000000000000000000000000000000000000000000000123', - '0000000000000000000000000000000000000000000000000000000000000001' -].join(''); -const VARIABLE = [ - '5a6fbce0', - 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', - '0000000000000000000000000000000000000000000000000000000000000040', - '000000000000000000000000000000000000000000000000000000000000000f', - '687474703a2f2f666f6f2e6261722f0000000000000000000000000000000000' -].join(''); - -describe('util/encode', () => { - describe('encodeMethodCallAbi', () => { - it('encodes calls with the correct result', () => { - expect(encodeMethodCallAbi(ABI, [0x123, true])).to.equal(`0x${RESULT}`); - }); - }); - - describe('abiEncode', () => { - it('encodes calls with the correct result', () => { - expect(abiEncode('valid', ['uint256', 'bool'], [0x123, true])).to.equal(`0x${RESULT}`); - }); - - it('encodes variable values', () => { - expect( - abiEncode( - 'hintUrl', ['bytes32', 'string'], ['0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', 'http://foo.bar/'] - ) - ).to.equal(`0x${VARIABLE}`); - }); - - it('encodes only the data with null name', () => { - expect( - abiEncode(null, ['uint256', 'bool'], [0x123, true]) - ).to.equal(`0x${RESULT.substr(8)}`); - }); - }); - - describe('abiUnencode', () => { - it('decodes data correctly from abi', () => { - expect( - abiUnencode([{ - name: 'test', - type: 'function', - inputs: [ - { type: 'uint', name: 'arga' } - ] - }], '0x1acb6f7700000000000000000000000000000038') - ).to.deep.equal(['test', { arga: 56 }, [56]]); - }); - - it('returns null when function not found', () => { - expect(abiUnencode([], '0x12345678')).to.be.null; - }); - }); - - // Same example as in abi/util/signature.spec.js - describe('abiSignature', () => { - it('encodes baz(uint32,bool) correctly', () => { - expect( - abiSignature('baz', ['uint32', 'bool']) - ).to.equal('0xcdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2'); - }); - }); -}); diff --git a/packages/api/src/util/encode.spec.ts b/packages/api/src/util/encode.spec.ts new file mode 100644 index 00000000..fb318b37 --- /dev/null +++ b/packages/api/src/util/encode.spec.ts @@ -0,0 +1,96 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { + abiEncode, + abiUnencode, + abiSignature, + encodeMethodCallAbi +} from './encode'; +import { AbiItem } from '@parity/abi'; + +const ABI: AbiItem = { + type: 'function', + name: 'valid', + inputs: [{ type: 'uint256' }, { type: 'bool' }] +}; + +const RESULT = [ + 'f87fa141', + '0000000000000000000000000000000000000000000000000000000000000123', + '0000000000000000000000000000000000000000000000000000000000000001' +].join(''); +const VARIABLE = [ + '5a6fbce0', + 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + '0000000000000000000000000000000000000000000000000000000000000040', + '000000000000000000000000000000000000000000000000000000000000000f', + '687474703a2f2f666f6f2e6261722f0000000000000000000000000000000000' +].join(''); + +describe('util/encode', () => { + describe('encodeMethodCallAbi', () => { + it('encodes calls with the correct result', () => { + expect(encodeMethodCallAbi(ABI, [0x123, true])).toEqual(`0x${RESULT}`); + }); + }); + + describe('abiEncode', () => { + it('encodes calls with the correct result', () => { + expect(abiEncode('valid', ['uint256', 'bool'], [0x123, true])).toEqual( + `0x${RESULT}` + ); + }); + + it('encodes variable values', () => { + expect( + abiEncode( + 'hintUrl', + ['bytes32', 'string'], + [ + '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + 'http://foo.bar/' + ] + ) + ).toEqual(`0x${VARIABLE}`); + }); + + it('encodes only the data with null name', () => { + expect(abiEncode(undefined, ['uint256', 'bool'], [0x123, true])).toEqual( + `0x${RESULT.substr(8)}` + ); + }); + }); + + describe('abiUnencode', () => { + it('decodes data correctly from abi', () => { + expect( + abiUnencode( + [ + { + name: 'test', + type: 'function', + inputs: [{ type: 'uint', name: 'arga' }] + } + ], + '0x1acb6f7700000000000000000000000000000038' + ) + ).toEqual(['test', { arga: 56 }, [56]]); + }); + + it('returns null when function not found', () => { + expect(abiUnencode([], '0x12345678')).toBe(null); + }); + }); + + // Same example as in abi/util/signature.spec.js + describe('abiSignature', () => { + it('encodes baz(uint32,bool) correctly', () => { + expect(abiSignature('baz', ['uint32', 'bool'])).toEqual( + '0xcdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2' + ); + }); + }); +}); diff --git a/packages/api/src/util/encode.ts b/packages/api/src/util/encode.ts new file mode 100644 index 00000000..ae4ddb24 --- /dev/null +++ b/packages/api/src/util/encode.ts @@ -0,0 +1,119 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import Abi, { + AbiItem, + AbiObject, + TokenTypeEnum, + TokenValue +} from '@parity/abi'; +import Func from '@parity/abi/lib/spec/function'; + +import { abiDecode } from './decode'; +import { cleanupValue } from './format'; +import { sha3 } from './sha3'; + +/** + * Encode a method call. + * + * @param methodAbi - The method's ABI. + * @param values - The values that are passed to this method. + */ +export const encodeMethodCallAbi = ( + methodAbi: AbiItem, + values: TokenValue[] = [] +) => { + const func = new Func(methodAbi); + const tokens = Abi.encodeTokens(func.inputParamTypes(), values); + const call = func.encodeCall(tokens); + + return `0x${call}`; +}; + +/** + * Formats correctly a method call to be passed to {@link encodeMethodCallAbi}. + * + * @param methodName - The method name to encode. + * @param inputTypes - The method's inputs types. + * @param data - The data that is passed to this method. + */ +export const abiEncode = ( + methodName: string | undefined, + inputTypes: TokenTypeEnum[], + data: TokenValue[] +) => { + const result = encodeMethodCallAbi( + { + name: methodName || '', + type: 'function', + inputs: inputTypes.map(type => { + return { type }; + }) + }, + data + ); + + return result; +}; + +/** + * Unencode a method. + * + * @param abi - The Abi to unencode. + * @param data - The data passed to this method. + */ +export const abiUnencode = (abi: AbiObject, data: string) => { + const callsig = data.substr(2, 8); + const op = abi.find(field => { + return ( + field.type === 'function' && + !!field.inputs && + abiSignature(field.name, field.inputs.map(input => input.type)).substr( + 2, + 8 + ) === callsig + ); + }); + + if (!op || !op.inputs) { + console.warn(`Unknown function ID: ${callsig}`); + return null; + } + + const argsByIndex = abiDecode( + op.inputs.map(field => field.type), + '0x' + data.substr(10) + ).map( + (value, index) => + cleanupValue(value as string, (op.inputs as any)[index].type) // TODO Remove `as any` here + ); + const argsByName = op.inputs.reduce( + (result, field, index) => { + if (!field.name) { + throw new Error( + `abiUnencode: input at index ${index} with type ${ + field.type + } doesn't have a name.` + ); + } + result[field.name] = argsByIndex[index]; + + return result; + }, + {} as { [index: string]: TokenValue } + ); + + return [op.name, argsByName, argsByIndex]; +}; + +/** + * Get the signature of an Abi method. + * + * @param name - The name of the method. + * @param inputs - The inputs' types of this method. + */ +export const abiSignature = (name: string | undefined, inputs: string[]) => { + return sha3(`${name}(${inputs.join()})`); +}; diff --git a/packages/api/src/util/format.js b/packages/api/src/util/format.js deleted file mode 100644 index 12a1db18..00000000 --- a/packages/api/src/util/format.js +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { range } = require('lodash'); - -function bytesToHex (bytes) { - return '0x' + Buffer.from(bytes).toString('hex'); -} - -function cleanupValue (value, type) { - // TODO: make work with arbitrary depth arrays - if (value instanceof Array && type.match(/bytes[0-9]+/)) { - // figure out if it's an ASCII string hiding in there: - let ascii = ''; - - for (let index = 0, ended = false; index < value.length && ascii !== null; ++index) { - const val = value[index]; - - if (val === 0) { - ended = true; - } else { - ascii += String.fromCharCode(val); - } - - if ((ended && val !== 0) || (!ended && (val < 32 || val >= 128))) { - ascii = null; - } - } - - value = ascii === null - ? bytesToHex(value) - : ascii; - } - - if (type.substr(0, 4) === 'uint' && +type.substr(4) <= 48) { - value = +value; - } - - return value; -} - -function hexToBytes (hex) { - const raw = toHex(hex).slice(2); - const bytes = []; - - for (let i = 0; i < raw.length; i += 2) { - bytes.push(parseInt(raw.substr(i, 2), 16)); - } - - return bytes; -} - -function hexToAscii (hex) { - const bytes = hexToBytes(hex); - const str = bytes.map((byte) => String.fromCharCode(byte)).join(''); - - return str; -} - -function bytesToAscii (bytes) { - return bytes.map((b) => String.fromCharCode(b % 512)).join(''); -} - -function asciiToHex (string) { - let result = '0x'; - - for (let i = 0; i < string.length; ++i) { - result += ('0' + string.charCodeAt(i).toString(16)).substr(-2); - } - - return result; -} - -function padRight (input, length) { - const hexLength = length * 2; - const value = toHex(input).substr(2, hexLength); - - return '0x' + value + range(hexLength - value.length).map(() => '0').join(''); -} - -function padLeft (input, length) { - const hexLength = length * 2; - const value = toHex(input).substr(2, hexLength); - - return '0x' + range(hexLength - value.length).map(() => '0').join('') + value; -} - -function toHex (str) { - if (str && str.toString) { - str = str.toString(16); - } - - if (str && str.substr(0, 2) === '0x') { - return str.toLowerCase(); - } - - return `0x${(str || '').toLowerCase()}`; -} - -module.exports = { - asciiToHex, - bytesToAscii, - bytesToHex, - cleanupValue, - hexToAscii, - hexToBytes, - padLeft, - padRight, - toHex -}; diff --git a/packages/api/src/util/format.spec.js b/packages/api/src/util/format.spec.js deleted file mode 100644 index 9d8da384..00000000 --- a/packages/api/src/util/format.spec.js +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { bytesToHex, cleanupValue, hexToBytes, hexToAscii, bytesToAscii, asciiToHex, padLeft, padRight } = require('./format'); - -describe('util/format', () => { - describe('bytesToHex', () => { - it('correctly converts an empty array', () => { - expect(bytesToHex([])).to.equal('0x'); - }); - - it('correctly converts a non-empty array', () => { - expect(bytesToHex([0, 15, 16])).to.equal('0x000f10'); - }); - }); - - describe('cleanupValue', () => { - it('returns unknown values as the original', () => { - expect(cleanupValue('original', 'unknown')).to.equal('original'); - }); - - it('returns ascii arrays as ascii', () => { - expect(cleanupValue([97, 115, 99, 105, 105, 0], 'bytes32')).to.equal('ascii'); - }); - - it('returns non-ascii arrays as hex strings', () => { - expect(cleanupValue([97, 200, 0, 0], 'bytes4')).to.equal('0x61c80000'); - }); - - it('returns uint (>48) as the original', () => { - expect(cleanupValue('original', 'uint49')).to.equal('original'); - }); - - it('returns uint (<=48) as the number value', () => { - expect(cleanupValue('12345', 'uint48')).to.equal(12345); - }); - }); - - describe('hexToBytes', () => { - it('correctly converts an empty string', () => { - expect(hexToBytes('')).to.deep.equal([]); - expect(hexToBytes('0x')).to.deep.equal([]); - }); - - it('correctly converts a non-empty string', () => { - expect(hexToBytes('0x000f10')).to.deep.equal([0, 15, 16]); - }); - }); - - describe('asciiToHex', () => { - it('correctly converts an empty string', () => { - expect(asciiToHex('')).to.equal('0x'); - }); - - it('correctly converts a non-empty string', () => { - expect(asciiToHex('abc')).to.equal('0x616263'); - expect(asciiToHex('a\nb')).to.equal('0x610a62'); - }); - - it('correctly converts where charCode < 0x10', () => { - expect( - asciiToHex( - [32, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0].map((v) => String.fromCharCode(v)).join('') - ) - ).to.equal('0x20100f0e0d0c0b0a09080706050403020100'); - }); - }); - - describe('hexToAscii', () => { - it('correctly converts an empty string', () => { - expect(hexToAscii('')).to.equal(''); - expect(hexToAscii('0x')).to.equal(''); - }); - - it('correctly converts a non-empty string', () => { - expect(hexToAscii('0x616263')).to.equal('abc'); - }); - }); - - describe('bytesToAscii', () => { - it('correctly converts an empty string', () => { - expect(bytesToAscii([])).to.equal(''); - }); - - it('correctly converts a non-empty string', () => { - expect(bytesToAscii([97, 98, 99])).to.equal('abc'); - }); - }); - - describe('padLeft', () => { - it('correctly pads to the number of hex digits', () => { - expect(padLeft('ab', 4)).to.equal('0x000000ab'); - }); - }); - - describe('padRight', () => { - it('correctly pads to the number of hex digits', () => { - expect(padRight('ab', 4)).to.equal('0xab000000'); - }); - }); -}); diff --git a/packages/api/src/util/format.spec.ts b/packages/api/src/util/format.spec.ts new file mode 100644 index 00000000..8b3d20e4 --- /dev/null +++ b/packages/api/src/util/format.spec.ts @@ -0,0 +1,140 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { + bytesToHex, + cleanupValue, + hexToBytes, + hexToAscii, + bytesToAscii, + asciiToHex, + padLeft, + padRight +} from './format'; + +describe('util/format', () => { + /** + * @test {bytesToHex} + */ + describe('bytesToHex', () => { + it('correctly converts an empty array', () => { + expect(bytesToHex([])).toEqual('0x'); + }); + + it('correctly converts a non-empty array', () => { + expect(bytesToHex([0, 15, 16])).toEqual('0x000f10'); + }); + }); + + /** + * @test {cleanupValue} + */ + describe('cleanupValue', () => { + it('returns unknown values as the original', () => { + expect(cleanupValue('original', 'unknown')).toEqual('original'); + }); + + it('returns ascii arrays as ascii', () => { + expect(cleanupValue([97, 115, 99, 105, 105, 0], 'bytes32')).toEqual( + 'ascii' + ); + }); + + it('returns non-ascii arrays as hex strings', () => { + expect(cleanupValue([97, 200, 0, 0], 'bytes4')).toEqual('0x61c80000'); + }); + + it('returns uint (>48) as the original', () => { + expect(cleanupValue('original', 'uint49')).toEqual('original'); + }); + + it('returns uint (<=48) as the number value', () => { + expect(cleanupValue('12345', 'uint48')).toEqual(12345); + }); + }); + + /** + * @test {hexToBytes} + */ + describe('hexToBytes', () => { + it('correctly converts an empty string', () => { + expect(hexToBytes('')).toEqual([]); + expect(hexToBytes('0x')).toEqual([]); + }); + + it('correctly converts a non-empty string', () => { + expect(hexToBytes('0x000f10')).toEqual([0, 15, 16]); + }); + }); + + /** + * @test {asciiToHex} + */ + describe('asciiToHex', () => { + it('correctly converts an empty string', () => { + expect(asciiToHex('')).toEqual('0x'); + }); + + it('correctly converts a non-empty string', () => { + expect(asciiToHex('abc')).toEqual('0x616263'); + expect(asciiToHex('a\nb')).toEqual('0x610a62'); + }); + + it('correctly converts where charCode < 0x10', () => { + expect( + asciiToHex( + [32, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] + .map(v => String.fromCharCode(v)) + .join('') + ) + ).toEqual('0x20100f0e0d0c0b0a09080706050403020100'); + }); + }); + + /** + * @test {hexToAscii} + */ + describe('hexToAscii', () => { + it('correctly converts an empty string', () => { + expect(hexToAscii('')).toEqual(''); + expect(hexToAscii('0x')).toEqual(''); + }); + + it('correctly converts a non-empty string', () => { + expect(hexToAscii('0x616263')).toEqual('abc'); + }); + }); + + /** + * @test {bytesToAscii} + */ + describe('bytesToAscii', () => { + it('correctly converts an empty string', () => { + expect(bytesToAscii([])).toEqual(''); + }); + + it('correctly converts a non-empty string', () => { + expect(bytesToAscii([97, 98, 99])).toEqual('abc'); + }); + }); + + /** + * @test {padLeft} + */ + describe('padLeft', () => { + it('correctly pads to the number of hex digits', () => { + expect(padLeft('ab', 4)).toEqual('0x000000ab'); + }); + }); + + /** + * @test {padRight} + */ + describe('padRight', () => { + it('correctly pads to the number of hex digits', () => { + expect(padRight('ab', 4)).toEqual('0xab000000'); + }); + }); +}); diff --git a/packages/api/src/util/format.ts b/packages/api/src/util/format.ts new file mode 100644 index 00000000..f7e800bf --- /dev/null +++ b/packages/api/src/util/format.ts @@ -0,0 +1,164 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { Bytes } from '../types'; +import { range } from 'lodash'; + +/** + * Convert a bytes array to a hexadecimal string. + * + * @param bytes - The bytes array to convert to hexadecimal. + */ +export const bytesToHex = (bytes: Bytes) => { + return '0x' + Buffer.from(bytes).toString('hex'); +}; + +/** + * Clean the value if it's cleanable: + * - ASCII arrays are returned as ASCII strings + * - non-ASCII arrays are converted to hex + * - uint (<=48) are converted to numbers + * + * @param value - The value to clean. + * @param type - The type of the value. + */ +export const cleanupValue = (value: string | number | Bytes, type: string) => { + // TODO: make work with arbitrary depth arrays + if (value instanceof Array && type.match(/bytes[0-9]+/)) { + // figure out if it's an ASCII string hiding in there: + let ascii: string | null = ''; + let ended = false; + + for (let index = 0; index < value.length && ascii !== null; ++index) { + const val = value[index]; + + if (val === 0) { + ended = true; + } else { + ascii += String.fromCharCode(val); + } + + if ((ended && val !== 0) || (!ended && (val < 32 || val >= 128))) { + ascii = null; + } + } + + value = ascii === null ? bytesToHex(value) : ascii; + } + + if (type.substr(0, 4) === 'uint' && +type.substr(4) <= 48) { + value = +value; + } + + return value; +}; + +/** + * Convert a hexadecimal string to a bytes array. + * + * @param hex - The hex string to convert. + */ +export const hexToBytes = (hex: string) => { + const raw = toHex(hex).slice(2); + const bytes = []; + + for (let i = 0; i < raw.length; i += 2) { + bytes.push(parseInt(raw.substr(i, 2), 16)); + } + + return bytes; +}; + +/** + * Convert a hexadecimal string to an ASCII string. + * + * @param hex - The hex string to convert. + */ +export const hexToAscii = (hex: string) => { + const bytes = hexToBytes(hex); + const str = bytes.map(byte => String.fromCharCode(byte)).join(''); + + return str; +}; + +/** + * Convert a bytes array to an ASCII string. + * + * @param bytes - The bytes array to convert. + */ +export const bytesToAscii = (bytes: Bytes) => + bytes.map(b => String.fromCharCode(b % 512)).join(''); + +/** + * Convert an ASCII string to a hexadecimal string. + * + * @param string - The ASCII string to convert. + */ +export const asciiToHex = (baseString: string) => { + let result = '0x'; + + for (let i = 0; i < baseString.length; ++i) { + result += ('0' + baseString.charCodeAt(i).toString(16)).substr(-2); + } + + return result; +}; + +/** + * Pad the input string with `length` zeros on the right. + * + * @param input - The input string to pad. + * @param length - The number of zeros to pad. + */ +export const padRight = (input: string, length: number) => { + const hexLength = length * 2; + const value = toHex(input).substr(2, hexLength); + + return ( + '0x' + + value + + range(hexLength - value.length) + .map(() => '0') + .join('') + ); +}; + +/** + * Pad the input string with `length` zeros on the left. + * + * @param input - The input string to pad. + * @param length - The number of zeros to pad. + */ +export const padLeft = (input: string | undefined, length: number) => { + const hexLength = length * 2; + const value = toHex(input).substr(2, hexLength); + + return ( + '0x' + + range(hexLength - value.length) + .map(() => '0') + .join('') + + value + ); +}; + +/** + * Convert a string to hexadecimal. + * + * @param str - The string to convert. + */ +export const toHex = (str?: string) => { + if (str && str.toString) { + // TODO string has no toString(16) + // @ts-ignore + str = str.toString(16); + } + + if (str && str.substr(0, 2) === '0x') { + return str.toLowerCase(); + } + + return `0x${(str || '').toLowerCase()}`; +}; diff --git a/packages/api/src/util/identity.js b/packages/api/src/util/identity.js deleted file mode 100644 index 37d7f4bb..00000000 --- a/packages/api/src/util/identity.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const blockies = require('blockies'); - -// jsdom doesn't have all the browser features, blockies fail -const TEST_ENV = process.env.NODE_ENV === 'test'; - -function createIdentityImg (address, scale = 8) { - return TEST_ENV - ? 'test-createIdentityImg' - : blockies({ - seed: (address || '').toLowerCase(), - size: 8, - scale - }).toDataURL(); -} - -module.exports = { - createIdentityImg -}; diff --git a/packages/api/src/util/index.js b/packages/api/src/util/index.js deleted file mode 100644 index be8adfe6..00000000 --- a/packages/api/src/util/index.js +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { isAddress, toChecksumAddress } = require('./address'); -const { abiDecode, decodeCallData, decodeMethodInput, methodToAbi } = require('./decode'); -const { abiEncode, abiUnencode, abiSignature, encodeMethodCallAbi } = require('./encode'); -const { bytesToHex, hexToAscii, asciiToHex, cleanupValue, hexToBytes } = require('./format'); -const { fromWei, toWei } = require('./wei'); -const { sha3 } = require('./sha3'); -const { isArray, isFunction, isHex, isInstanceOf, isString } = require('./types'); -const { createIdentityImg } = require('./identity'); - -module.exports = { - abiDecode, - abiEncode, - abiUnencode, - abiSignature, - cleanupValue, - isAddressValid: isAddress, - isArray, - isFunction, - isHex, - isInstanceOf, - isString, - bytesToHex, - hexToAscii, - hexToBytes, - asciiToHex, - createIdentityImg, - decodeCallData, - decodeMethodInput, - encodeMethodCallAbi, - methodToAbi, - fromWei, - toChecksumAddress, - toWei, - sha3 -}; diff --git a/packages/api/src/util/index.ts b/packages/api/src/util/index.ts new file mode 100644 index 00000000..cef9293c --- /dev/null +++ b/packages/api/src/util/index.ts @@ -0,0 +1,12 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +export * from './address'; +export * from './decode'; +export * from './encode'; +export * from './format'; +export * from './sha3'; +export * from './types'; +export * from './wei'; diff --git a/packages/api/src/util/sha3.js b/packages/api/src/util/sha3.js deleted file mode 100644 index 0048eb28..00000000 --- a/packages/api/src/util/sha3.js +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { keccak_256 } = require('js-sha3'); // eslint-disable-line - -const { hexToBytes } = require('./format'); -const { isHex } = require('./types'); - -function sha3 (value, options) { - const forceHex = options && options.encoding === 'hex'; - - if (forceHex || (!options && isHex(value))) { - const bytes = hexToBytes(value); - - return sha3(bytes); - } - - const hash = keccak_256(value); - - return `0x${hash}`; -} - -sha3.text = (val) => sha3(val, { encoding: 'raw' }); - -module.exports = { - sha3 -}; diff --git a/packages/api/src/util/sha3.spec.js b/packages/api/src/util/sha3.spec.js deleted file mode 100644 index 49926659..00000000 --- a/packages/api/src/util/sha3.spec.js +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { sha3 } = require('./sha3'); - -describe('util/sha3', () => { - describe('sha3', () => { - it('constructs a correct sha3 value', () => { - expect(sha3('jacogr')).to.equal('0x2f4ff4b5a87abbd2edfed699db48a97744e028c7f7ce36444d40d29d792aa4dc'); - }); - - it('constructs a correct sha3 encoded as hex', () => { - const key = '000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298' + '0000000000000000000000000000000000000000000000000000000000000001'; - - expect(sha3(key, { encoding: 'hex' })).to.equal('0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9'); - expect(sha3(`0x${key}`, { encoding: 'hex' })).to.equal('0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9'); - }); - - it('constructs a correct sha3 from Uint8Array', () => { - expect(sha3('01020304', { encoding: 'hex' })).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); - expect(sha3(Uint8Array.from([1, 2, 3, 4]))).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); - }); - - it('should interpret as bytes by default', () => { - expect(sha3('0x01020304')).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); - }); - - it('should force text if option is passed', () => { - expect(sha3('0x01020304', { encoding: 'raw' })).to.equal('0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869'); - expect(sha3.text('0x01020304')).to.equal('0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869'); - }); - }); -}); diff --git a/packages/api/src/util/sha3.spec.ts b/packages/api/src/util/sha3.spec.ts new file mode 100644 index 00000000..830e1510 --- /dev/null +++ b/packages/api/src/util/sha3.spec.ts @@ -0,0 +1,54 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { sha3, sha3Text } from './sha3'; + +describe('util/sha3', () => { + describe('sha3', () => { + it('constructs a correct sha3 value', () => { + expect(sha3('jacogr')).toEqual( + '0x2f4ff4b5a87abbd2edfed699db48a97744e028c7f7ce36444d40d29d792aa4dc' + ); + }); + + it('constructs a correct sha3 encoded as hex', () => { + const key = + '000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298' + + '0000000000000000000000000000000000000000000000000000000000000001'; + + expect(sha3(key, { encoding: 'hex' })).toEqual( + '0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9' + ); + expect(sha3(`0x${key}`, { encoding: 'hex' })).toEqual( + '0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9' + ); + }); + + it('constructs a correct sha3 from Uint8Array', () => { + expect(sha3('01020304', { encoding: 'hex' })).toEqual( + '0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b' + ); + // @ts-ignore TODO Add Uint8Array as Bytes type too + expect(sha3(Uint8Array.from([1, 2, 3, 4]))).toEqual( + '0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b' + ); + }); + + it('should interpret as bytes by default', () => { + expect(sha3('0x01020304')).toEqual( + '0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b' + ); + }); + + it('should force text if option is passed', () => { + expect(sha3('0x01020304', { encoding: 'raw' })).toEqual( + '0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869' + ); + expect(sha3Text('0x01020304')).toEqual( + '0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869' + ); + }); + }); +}); diff --git a/packages/api/src/util/sha3.ts b/packages/api/src/util/sha3.ts new file mode 100644 index 00000000..8d901cb9 --- /dev/null +++ b/packages/api/src/util/sha3.ts @@ -0,0 +1,37 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { keccak_256 } from 'js-sha3'; + +import { hexToBytes } from './format'; +import { isHex } from './types'; +import { Bytes } from '../types'; + +type Encoding = 'hex' | 'raw'; + +/** + * + * @param value - The value to hash + * @param options - Set the encoding in the options, encoding can be `'hex'` + * or `'raw'`. + */ +export const sha3 = ( + value: string | Bytes, + options?: { encoding: Encoding } +): string => { + const forceHex = options && options.encoding === 'hex'; + + if (forceHex || (!options && isHex(value))) { + const bytes = hexToBytes(value as string); + + return sha3(bytes); + } + + const hash = keccak_256(value); + + return `0x${hash}`; +}; + +export const sha3Text = (val: string) => sha3(val, { encoding: 'raw' }); diff --git a/packages/api/src/util/types.js b/packages/api/src/util/types.js deleted file mode 100644 index a9a70d86..00000000 --- a/packages/api/src/util/types.js +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const HEXDIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; - -function isArray (test) { - return Object.prototype.toString.call(test) === '[object Array]'; -} - -function isError (test) { - return Object.prototype.toString.call(test) === '[object Error]'; -} - -function isFunction (test) { - return Object.prototype.toString.call(test) === '[object Function]'; -} - -function isHex (_test) { - if (!isString(_test)) { - return false; - } - - if (_test.substr(0, 2) === '0x') { - return isHex(_test.slice(2)); - } - - const test = _test.toLowerCase(); - let hex = true; - - for (let index = 0; hex && index < test.length; index++) { - hex = HEXDIGITS.includes(test[index]); - } - - return hex; -} - -function isObject (test) { - return Object.prototype.toString.call(test) === '[object Object]'; -} - -function isString (test) { - return Object.prototype.toString.call(test) === '[object String]'; -} - -function isInstanceOf (test, clazz) { - return test instanceof clazz; -} - -module.exports = { - isArray, - isError, - isFunction, - isHex, - isInstanceOf, - isObject, - isString -}; diff --git a/packages/api/src/util/types.spec.js b/packages/api/src/util/types.spec.js deleted file mode 100644 index 66e8e23c..00000000 --- a/packages/api/src/util/types.spec.js +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -/* eslint-disable no-unused-expressions */ - -const sinon = require('sinon'); - -const { isArray, isError, isFunction, isHex, isInstanceOf, isObject, isString } = require('./types'); -const Eth = require('../rpc/eth'); - -describe('util/types', () => { - describe('isArray', () => { - it('correctly identifies null as false', () => { - expect(isArray(null)).to.be.false; - }); - - it('correctly identifies empty array as true', () => { - expect(isArray([])).to.be.true; - }); - - it('correctly identifies array as true', () => { - expect(isArray([1, 2, 3])).to.be.true; - }); - }); - - describe('isError', () => { - it('correctly identifies null as false', () => { - expect(isError(null)).to.be.false; - }); - - it('correctly identifies Error as true', () => { - expect(isError(new Error('an error'))).to.be.true; - }); - }); - - describe('isFunction', () => { - it('correctly identifies null as false', () => { - expect(isFunction(null)).to.be.false; - }); - - it('correctly identifies function as true', () => { - expect(isFunction(sinon.stub())).to.be.true; - }); - }); - - describe('isHex', () => { - it('correctly identifies hex by leading 0x', () => { - expect(isHex('0x123')).to.be.true; - }); - - it('correctly identifies hex without leading 0x', () => { - expect(isHex('123')).to.be.true; - }); - - it('correctly identifies non-hex values', () => { - expect(isHex('123j')).to.be.false; - }); - - it('correctly indentifies non-string values', () => { - expect(isHex(false)).to.be.false; - expect(isHex()).to.be.false; - expect(isHex([1, 2, 3])).to.be.false; - }); - }); - - describe('isInstanceOf', () => { - it('correctly identifies build-in instanceof', () => { - expect(isInstanceOf(new String('123'), String)).to.be.true; // eslint-disable-line no-new-wrappers - }); - - it('correctly identifies own instanceof', () => { - expect(isInstanceOf(new Eth({}), Eth)).to.be.true; - }); - - it('correctly reports false for own', () => { - expect(isInstanceOf({}, Eth)).to.be.false; - }); - }); - - describe('isObject', () => { - it('correctly identifies empty object as object', () => { - expect(isObject({})).to.be.true; - }); - - it('correctly identifies non-empty object as object', () => { - expect(isObject({ data: '123' })).to.be.true; - }); - - it('correctly identifies Arrays as non-objects', () => { - expect(isObject([1, 2, 3])).to.be.false; - }); - - it('correctly identifies Strings as non-objects', () => { - expect(isObject('123')).to.be.false; - }); - }); - - describe('isString', () => { - it('correctly identifies empty string as string', () => { - expect(isString('')).to.be.true; - }); - - it('correctly identifies string as string', () => { - expect(isString('123')).to.be.true; - }); - }); -}); diff --git a/packages/api/src/util/types.spec.ts b/packages/api/src/util/types.spec.ts new file mode 100644 index 00000000..9f04621a --- /dev/null +++ b/packages/api/src/util/types.spec.ts @@ -0,0 +1,113 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { + isArray, + isError, + isFunction, + isHex, + isInstanceOf, + isObject, + isString +} from './types'; +const Eth = require('../rpc/eth'); + +describe('util/types', () => { + describe('isArray', () => { + it('correctly identifies null as false', () => { + expect(isArray(null)).toBe(false); + }); + + it('correctly identifies empty array as true', () => { + expect(isArray([])).toBe(true); + }); + + it('correctly identifies array as true', () => { + expect(isArray([1, 2, 3])).toBe(true); + }); + }); + + describe('isError', () => { + it('correctly identifies null as false', () => { + expect(isError(null)).toBe(false); + }); + + it('correctly identifies Error as true', () => { + expect(isError(new Error('an error'))).toBe(true); + }); + }); + + describe('isFunction', () => { + it('correctly identifies null as false', () => { + expect(isFunction(null)).toBe(false); + }); + + it('correctly identifies function as true', () => { + expect(isFunction(jest.fn())).toBe(true); + }); + }); + + describe('isHex', () => { + it('correctly identifies hex by leading 0x', () => { + expect(isHex('0x123')).toBe(true); + }); + + it('correctly identifies hex without leading 0x', () => { + expect(isHex('123')).toBe(true); + }); + + it('correctly identifies non-hex values', () => { + expect(isHex('123j')).toBe(false); + }); + + it('correctly indentifies non-string values', () => { + expect(isHex(false)).toBe(false); + expect(isHex(undefined)).toBe(false); + expect(isHex([1, 2, 3])).toBe(false); + }); + }); + + describe('isInstanceOf', () => { + it('correctly identifies build-in instanceof', () => { + expect(isInstanceOf(new String('123'), String)).toBe(true); + }); + + it('correctly identifies own instanceof', () => { + expect(isInstanceOf(new Eth({}), Eth)).toBe(true); + }); + + it('correctly reports false for own', () => { + expect(isInstanceOf({}, Eth)).toBe(false); + }); + }); + + describe('isObject', () => { + it('correctly identifies empty object as object', () => { + expect(isObject({})).toBe(true); + }); + + it('correctly identifies non-empty object as object', () => { + expect(isObject({ data: '123' })).toBe(true); + }); + + it('correctly identifies Arrays as non-objects', () => { + expect(isObject([1, 2, 3])).toBe(false); + }); + + it('correctly identifies Strings as non-objects', () => { + expect(isObject('123')).toBe(false); + }); + }); + + describe('isString', () => { + it('correctly identifies empty string as string', () => { + expect(isString('')).toBe(true); + }); + + it('correctly identifies string as string', () => { + expect(isString('123')).toBe(true); + }); + }); +}); diff --git a/packages/api/src/util/types.ts b/packages/api/src/util/types.ts new file mode 100644 index 00000000..46615966 --- /dev/null +++ b/packages/api/src/util/types.ts @@ -0,0 +1,6 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +export * from '@parity/abi/lib/util/types'; diff --git a/packages/api/src/util/wei.js b/packages/api/src/util/wei.js deleted file mode 100644 index d52111ff..00000000 --- a/packages/api/src/util/wei.js +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const BigNumber = require('bignumber.js'); - -const UNITS = ['wei', 'ada', 'babbage', 'shannon', 'szabo', 'finney', 'ether', 'kether', 'mether', 'gether', 'tether']; - -function _getUnitMultiplier (unit) { - const position = UNITS.indexOf(unit.toLowerCase()); - - if (position === -1) { - throw new Error(`Unknown unit ${unit} passed to wei formatter`); - } - - return Math.pow(10, position * 3); -} - -function fromWei (value, unit = 'ether') { - return new BigNumber(value).div(_getUnitMultiplier(unit)); -} - -function toWei (value, unit = 'ether') { - return new BigNumber(value).mul(_getUnitMultiplier(unit)); -} - -module.exports = { - _getUnitMultiplier, - fromWei, - toWei -}; diff --git a/packages/api/src/util/wei.spec.js b/packages/api/src/util/wei.spec.js deleted file mode 100644 index e45fe12f..00000000 --- a/packages/api/src/util/wei.spec.js +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015-2018 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -const { _getUnitMultiplier, fromWei, toWei } = require('./wei'); - -describe('util/wei', () => { - describe('_getUnitMultiplier', () => { - it('returns 10^0 for wei', () => { - expect(_getUnitMultiplier('wei')).to.equal(Math.pow(10, 0)); - }); - - it('returns 10^15 for finney', () => { - expect(_getUnitMultiplier('finney')).to.equal(Math.pow(10, 15)); - }); - - it('returns 10^18 for ether', () => { - expect(_getUnitMultiplier('ether')).to.equal(Math.pow(10, 18)); - }); - - it('throws an error on invalid units', () => { - expect(() => _getUnitMultiplier('invalid')).to.throw(/passed to wei formatter/); - }); - }); - - describe('fromWei', () => { - it('formats into ether when nothing specified', () => { - expect(fromWei('1230000000000000000').toString()).to.equal('1.23'); - }); - - it('formats into finney when specified', () => { - expect(fromWei('1230000000000000000', 'finney').toString()).to.equal('1230'); - }); - }); - - describe('toWei', () => { - it('formats from ether when nothing specified', () => { - expect(toWei(1.23).toString()).to.equal('1230000000000000000'); - }); - - it('formats from finney when specified', () => { - expect(toWei(1230, 'finney').toString()).to.equal('1230000000000000000'); - }); - }); -}); diff --git a/packages/api/src/util/wei.spec.ts b/packages/api/src/util/wei.spec.ts new file mode 100644 index 00000000..8941c780 --- /dev/null +++ b/packages/api/src/util/wei.spec.ts @@ -0,0 +1,60 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import { EtherDenomination } from '../types'; +import { _getUnitMultiplier, fromWei, toWei } from './wei'; + +describe('util/wei', () => { + /** + * @test {_getUnitMultiplier} + */ + describe('_getUnitMultiplier', () => { + it('returns 10^0 for wei', () => { + expect(_getUnitMultiplier('wei')).toEqual(Math.pow(10, 0)); + }); + + it('returns 10^15 for finney', () => { + expect(_getUnitMultiplier('finney')).toEqual(Math.pow(10, 15)); + }); + + it('returns 10^18 for ether', () => { + expect(_getUnitMultiplier('ether')).toEqual(Math.pow(10, 18)); + }); + + it('throws an error on invalid units', () => { + expect(() => _getUnitMultiplier('invalid' as EtherDenomination)).toThrow( + /passed to wei formatter/ + ); + }); + }); + + /** + * @test {fromWei} + */ + describe('fromWei', () => { + it('formats into ether when nothing specified', () => { + expect(fromWei('1230000000000000000').toString()).toEqual('1.23'); + }); + + it('formats into finney when specified', () => { + expect(fromWei('1230000000000000000', 'finney').toString()).toEqual( + '1230' + ); + }); + }); + + /** + * @test {toWei} + */ + describe('toWei', () => { + it('formats from ether when nothing specified', () => { + expect(toWei(1.23).toString()).toEqual('1230000000000000000'); + }); + + it('formats from finney when specified', () => { + expect(toWei(1230, 'finney').toString()).toEqual('1230000000000000000'); + }); + }); +}); diff --git a/packages/api/src/util/wei.ts b/packages/api/src/util/wei.ts new file mode 100644 index 00000000..ac54742a --- /dev/null +++ b/packages/api/src/util/wei.ts @@ -0,0 +1,63 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Parity. +// +// SPDX-License-Identifier: MIT + +import BigNumber from 'bignumber.js'; + +import { EtherDenomination } from '../types'; + +const UNITS: EtherDenomination[] = [ + 'wei', + 'ada', + 'babbage', + 'shannon', + 'szabo', + 'finney', + 'ether', + 'kether', + 'mether', + 'gether', + 'tether' +]; + +/** + * Returns the multiplication factor from wei to another ether denomination. + * + * @param unit - An ether denomiation. + * @example + * _getUnitMultiplier('wei'); // 1 + * _getUnitMultiplier('ether'); // 10^^18 + * @ignore + */ +export const _getUnitMultiplier = (unit: EtherDenomination) => { + const position = UNITS.indexOf(unit.toLowerCase() as EtherDenomination); + + if (position === -1) { + throw new Error(`Unknown unit ${unit} passed to wei formatter`); + } + + return Math.pow(10, position * 3); +}; + +/** + * Convert from wei to another ether denomination. + * + * @param value - The value in wei. + * @param unit - The ether denomination to convert to. + */ +export const fromWei = ( + value: string | number | BigNumber, + unit: EtherDenomination = 'ether' +) => new BigNumber(value).dividedBy(_getUnitMultiplier(unit)); + +/** + * Convert a value from an ether denomination to wei. + * + * @param value - The value in the ether denomination. + * @param unit - The ether denomination to convert to. + */ +export const toWei = ( + value: string | number | BigNumber, + unit: EtherDenomination = 'ether' +) => new BigNumber(value).multipliedBy(_getUnitMultiplier(unit)); diff --git a/yarn.lock b/yarn.lock index 80dff594..8e4abf61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -443,7 +443,7 @@ array.prototype.flat@^1.2.1: es-abstract "^1.10.0" function-bind "^1.1.1" -arrify@^1.0.1: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -1321,7 +1321,7 @@ bignumber.js@4.1.0: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== -bignumber.js@7.2.1, bignumber.js@^7.2.1: +bignumber.js@7.2.1, bignumber.js@^7, bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== @@ -1426,7 +1426,7 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -buffer-from@^1.0.0: +buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -2314,7 +2314,7 @@ diff@3.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= -diff@^3.2.0: +diff@^3.1.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== @@ -5006,6 +5006,11 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-error@^1.1.1: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -7252,6 +7257,20 @@ ts-jest@^23.0.0: fs-extra "6.0.1" lodash "^4.17.10" +ts-node@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + tslib@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" @@ -7847,3 +7866,8 @@ yauzl@2.4.1: integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= dependencies: fd-slicer "~1.0.1" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= From 5158e699580240d981813ab74b9afc98a130f9ab Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 13:42:48 +0100 Subject: [PATCH 16/25] Fix bugs --- packages/api/src/contract/contract.js | 2 +- packages/api/src/contract/contract.spec.js | 2 +- packages/api/src/format/output.ts | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/api/src/contract/contract.js b/packages/api/src/contract/contract.js index 9f79fa0e..b391ca52 100644 --- a/packages/api/src/contract/contract.js +++ b/packages/api/src/contract/contract.js @@ -112,7 +112,7 @@ class Contract { const _options = this._encodeOptions(this.constructors[0], options, values); return this._api.eth.estimateGas(_options).then(gasEst => { - return [gasEst, gasEst.mul(1.2)]; + return [gasEst, gasEst.multipliedBy(1.2)]; }); } diff --git a/packages/api/src/contract/contract.spec.js b/packages/api/src/contract/contract.spec.js index 8311849f..bf17461d 100644 --- a/packages/api/src/contract/contract.spec.js +++ b/packages/api/src/contract/contract.spec.js @@ -19,7 +19,7 @@ const BigNumber = require('bignumber.js'); const sinon = require('sinon'); -const Abi = require('@parity/abi'); +const Abi = require('@parity/abi').default; const { TEST_HTTP_URL, mockHttp } = require('../../test/mockRpc'); diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts index 974046bc..19b00b04 100644 --- a/packages/api/src/format/output.ts +++ b/packages/api/src/format/output.ts @@ -186,6 +186,10 @@ export function outLog (log: SerializedLog) { case 'address': result[key] = outAddress(log[key]); break; + + default: + // @ts-ignore Here, we explicitly pass down extra keys, if they exist + result[key] = log[key]; } }); From c9364ac31bc72426811cc73509c27f054682ba37 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 13:54:45 +0100 Subject: [PATCH 17/25] Make building api work --- packages/api/package.json | 2 +- packages/api/tsconfig.json | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index ecef8875..ba585164 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -17,7 +17,7 @@ "access": "public" }, "scripts": { - "build": "rimraf lib && babel src --out-dir lib --ignore *.spec.js", + "build": "rimraf lib && tsc", "ci:makeshift": "makeshift", "lint": "npm run lint:css && npm run lint:js", "lint:css": "echo \"WARN: npm run lint:css skipped\"", diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 2b874ca4..d660d140 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -1,7 +1,10 @@ { + "extends": "../../tsconfig.json", "compilerOptions": { + "allowJs": true, + "declaration": false, "outDir": "./lib" }, - "extends": "../../tsconfig.json", - "include": ["./src"] + "include": ["src/**/*"], + "exclude": ["src/**/*.spec.js"] } From d0071725432e90c26a7a609678e81e1f526df7fe Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 14:03:50 +0100 Subject: [PATCH 18/25] Make correct dependencies --- packages/api/package.json | 4 +- packages/contracts/package.json | 6 +- packages/electron/package.json | 2 +- packages/light.js-react/package.json | 6 +- packages/light.js/package.json | 6 +- yarn.lock | 1515 ++++++++++++-------------- 6 files changed, 722 insertions(+), 817 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index ba585164..b4b915ff 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -59,9 +59,7 @@ "ts-node": "^7.0.1" }, "dependencies": { - "@parity/abi": "~2.1.4", - "@parity/jsonrpc": "2.1.x", - "@parity/wordlist": "1.1.x", + "@parity/abi": "^3.0.0", "bignumber.js": "^7", "blockies": "0.0.2", "es6-error": "4.0.2", diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 6e56889d..f7d2444d 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,7 +1,7 @@ { "name": "@parity/contracts", "description": "Parity's contracts as ES6 classes.", - "version": "1.0.0", + "version": "3.0.0", "author": "Parity Team ", "license": "MIT", "repository": "https://github.com/paritytech/js-libs/tree/master/packages/contracts", @@ -22,8 +22,8 @@ "test": "jest" }, "dependencies": { - "@parity/abi": "^2.1.4", - "@parity/api": "^2.1.24", + "@parity/abi": "^3.0.0", + "@parity/api": "^3.0.0", "bignumber.js": "^7.2.1" } } diff --git a/packages/electron/package.json b/packages/electron/package.json index 7db94da8..5670cae9 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,7 +1,7 @@ { "name": "@parity/electron", "description": "Control the Parity Ethereum node from Electron.", - "version": "1.0.2", + "version": "3.0.0", "author": "Parity Team ", "license": "MIT", "repository": "https://github.com/paritytech/js-libs/tree/master/packages/electron", diff --git a/packages/light.js-react/package.json b/packages/light.js-react/package.json index fb2fee72..f8e375ac 100644 --- a/packages/light.js-react/package.json +++ b/packages/light.js-react/package.json @@ -1,7 +1,7 @@ { "name": "@parity/light.js-react", "description": "A HOC to easily use @parity/light.js with React.", - "version": "1.0.0", + "version": "3.0.0", "author": "Parity Team ", "license": "MIT", "repository": "https://github.com/paritytech/js-libs/tree/master/packages/light.js-react", @@ -30,7 +30,7 @@ "symbol-observable": "^1.2.0" }, "devDependencies": { - "@parity/light.js": "^1.0.0", + "@parity/light.js": "^3.0.0", "@types/enzyme": "^3.1.13", "@types/enzyme-adapter-react-16": "^1.0.3", "@types/recompose": "^0.26.4", @@ -41,7 +41,7 @@ "react-dom": "^16.4.2" }, "peerDependencies": { - "@parity/light.js": "^1.0.0", + "@parity/light.js": "^3.0.0", "rxjs": "^6.2.1" } } diff --git a/packages/light.js/package.json b/packages/light.js/package.json index de823313..bcd9bf87 100644 --- a/packages/light.js/package.json +++ b/packages/light.js/package.json @@ -1,7 +1,7 @@ { "name": "@parity/light.js", "description": "A high-level reactive JS library optimized for light clients", - "version": "1.0.10", + "version": "3.0.0", "author": "Parity Team ", "license": "MIT", "repository": "https://github.com/paritytech/js-libs/tree/master/packages/light.js", @@ -26,8 +26,8 @@ "test": "jest" }, "dependencies": { - "@parity/abi": "^2.1.4", - "@parity/api": "^2.1.23", + "@parity/abi": "^3.0.0", + "@parity/api": "^3.0.0", "async-retry": "^1.2.3", "bignumber.js": "^7.2.1", "debug": "^3.1.0", diff --git a/yarn.lock b/yarn.lock index 8e4abf61..22578478 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,20 +3,20 @@ "@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz#5c2154415d6c09959a71845ef519d11157e95d10" - integrity sha512-qhQo3GqwqMUv03SxxjcEkWtlkEDvFYrBKbJUn4Dtd9amC2cLkJ3me4iYUVSBbVXWbfbVRalEeVBHzX4aQYKnBg== + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: - "@babel/highlight" "7.0.0-rc.1" + "@babel/highlight" "^7.0.0" -"@babel/highlight@7.0.0-rc.1": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.1.tgz#e0ca4731fa4786f7b9500421d6ff5e5a7753e81e" - integrity sha512-5PgPDV6F5s69XNznTcP0za3qH7qgBkr9DVQTXfZtpF+3iEyuIZB1Mjxu52F5CFxgzQUQJoBYHVxtH4Itdb5MgA== +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: chalk "^2.0.0" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^4.0.0" "@babel/runtime@7.0.0-beta.56": version "7.0.0-beta.56" @@ -25,51 +25,6 @@ dependencies: regenerator-runtime "^0.12.0" -"@forked/turndown@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@forked/turndown/-/turndown-4.0.4.tgz#26d0a26ad6bcdfd467b33aa83e8c81c8d39d5a43" - integrity sha512-GPmVBlNBCdi6GqDTvlRD2lRF3OXd7MBR6smUC5PbkMmh3eKlayGfoxi4CQ5ggnJi9nPZfBZ+85dho6zx6cyf2g== - dependencies: - jsdom "^11.10.0" - -"@parity/abi@^2.1.4", "@parity/abi@~2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@parity/abi/-/abi-2.1.4.tgz#23e2b9e6d37a54035b76d941d6d74b9c5d21fb99" - integrity sha512-4yPqCYXlLhb9jmmAg+0SkA/2Rmf1ZvPzmGF3WBKvgrAjWPAvj5hZYW5rquRqrP3L22KfG+7A9RAw3aZYp45AMQ== - dependencies: - bignumber.js "4.1.0" - js-sha3 "0.5.5" - utf8 "^2.1.2" - -"@parity/api@^2.1.23", "@parity/api@^2.1.24": - version "2.1.24" - resolved "https://registry.yarnpkg.com/@parity/api/-/api-2.1.24.tgz#e04ca177598354b435b83c8cfe7c7c3672bf3e44" - integrity sha512-jJ93cyC5eZC9pQY/FXcSyQiFHNzg5wFzrVLB+RVfbKbIqCWmOAhlv+rssN35qPZ4ccehIGgFB5i7rkpfSajzkQ== - dependencies: - "@parity/abi" "~2.1.4" - "@parity/jsonrpc" "2.1.x" - "@parity/wordlist" "1.1.x" - bignumber.js "4.1.0" - blockies "0.0.2" - es6-error "4.0.2" - es6-promise "^4.1.1" - eventemitter3 "^2.0.2" - isomorphic-fetch "^2.2.1" - js-sha3 "0.5.5" - lodash "^4.17.4" - store "^2.0.12" - websocket "^1.0.25" - -"@parity/jsonrpc@2.1.x": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@parity/jsonrpc/-/jsonrpc-2.1.6.tgz#260bbe7dfcec18d59f0bf1668dfd6021452d6452" - integrity sha512-9RLsnAmgpl07EwDSDGu+OYW8xZ4cKDPQ/Zhxy4h6LXuPwTsF1eCWc0M3R8201/U+OrDUK/G6RXoUfoKnUpO+LA== - -"@parity/wordlist@1.1.x": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@parity/wordlist/-/wordlist-1.1.0.tgz#9e9ed3ab7837f5633b5844e60a355e9e63e427ae" - integrity sha1-np7Tq3g39WM7WETmCjVenmPkJ64= - "@types/async-retry@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@types/async-retry/-/async-retry-1.2.1.tgz#fa9ac165907a8ee78f4924f4e393b656c65b5bb4" @@ -81,9 +36,9 @@ integrity sha1-K+TcUdvn8yfQO1MxT724bvOL/Lg= "@types/cheerio@*": - version "0.22.8" - resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.8.tgz#5702f74f78b73e13f1eb1bd435c2c9de61a250d4" - integrity sha512-LzF540VOFabhS2TR2yYFz2Mu/fTfkA+5AwYddtJbOJGwnYrr2e7fHadT7/Z3jNGJJdCRlO3ySxmW26NgRdwhNA== + version "0.22.9" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.9.tgz#b5990152604c2ada749b7f88cab3476f21f39d7b" + integrity sha512-q6LuBI0t5u04f0Q4/R+cGBqIbZMtJkVvCSF+nTfFBBdQqQvJR/mNHeWjRkszyLl7oyf2rDoKUYMEjTw5AV0hiw== "@types/debug@^0.0.30": version "0.0.30" @@ -98,9 +53,9 @@ "@types/enzyme" "*" "@types/enzyme@*", "@types/enzyme@^3.1.13": - version "3.1.13" - resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.13.tgz#4bbc5c81fa40c9fc7efee25c4a23cb37119a33ea" - integrity sha512-TwzKKiX5sGh/WweucxPXb8zjMLlLekGtBQw0ihk1HSj14zZuioG3Gql3jbxxb1YDRLbT4WQyzWG/h4Y7eCdw1g== + version "3.1.15" + resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.15.tgz#fc9a9695ba9f90cd50c4967e64a8c66ec96913d1" + integrity sha512-6b4JWgV+FNec1c4+8HauGbXg5gRc1oQK93t2+4W+bHjG/PzO+iPvagY6d6bXAZ+t+ps51Zb2F9LQ4vl0S0Epog== dependencies: "@types/cheerio" "*" "@types/react" "*" @@ -118,9 +73,9 @@ "@types/node" "*" "@types/glob@*": - version "5.0.35" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a" - integrity sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg== + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== dependencies: "@types/events" "*" "@types/minimatch" "*" @@ -137,19 +92,19 @@ integrity sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ== "@types/jest@^23.1.6": - version "23.3.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf" - integrity sha512-/UMY+2GkOZ27Vrc51pqC5J8SPd39FKt7kkoGAtWJ8s4msj0b15KehDWIiJpWY3/7tLxBQLLzJhIBhnEsXdzpgw== + version "23.3.9" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.9.tgz#c16b55186ee73ae65e001fbee69d392c51337ad1" + integrity sha512-wNMwXSUcwyYajtbayfPp55tSayuDVU6PfY5gzvRSj80UvxdXEJOVPnUVajaOp7NgXLm+1e2ZDLULmpsU9vDvQw== "@types/lodash@^4.14.110": - version "4.14.116" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" - integrity sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg== + version "4.14.118" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.118.tgz#247bab39bfcc6d910d4927c6e06cbc70ec376f27" + integrity sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw== "@types/marked@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.4.0.tgz#057a6165703e7419217f8ffc6887747f980b6315" - integrity sha512-xkURX55US18wHme+O2UlqJf3Fo7FqT5VAL+OJ/zK+jP2NX57naryDHoiqt/pMIwZjDc62sRvXUWuQQxQiBdheQ== + version "0.4.2" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.4.2.tgz#64a89e53ea37f61cc0f3ee1732c555c2dbf6452f" + integrity sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg== "@types/memoizee@^0.4.2": version "0.4.2" @@ -162,34 +117,32 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "10.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.7.1.tgz#b704d7c259aa40ee052eec678758a68d07132a2e" - integrity sha512-EGoI4ylB/lPOaqXqtzAyL8HcgOuCtH2hkEaLmkueOYufsTFWBn4VCvlCDC2HW8Q+9iF+QVC3sxjDKQYjHQeZ9w== + version "10.12.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.10.tgz#4fa76e6598b7de3f0cb6ec3abacc4f59e5b3a2ce" + integrity sha512-8xZEYckCbUVgK8Eg7lf5Iy4COKJ5uXlnIOnePN0WUwSQggy9tolM+tDJf7wMOnT/JT/W9xDYIaYggt3mRV2O5w== "@types/node@^8.0.24": - version "8.10.29" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.29.tgz#b3a13b58dd7b0682bf1b42022bef4a5a9718f687" - integrity sha512-zbteaWZ2mdduacm0byELwtRyhYE40aK+pAanQk415gr1eRuu67x7QGOLmn8jz5zI8LDK7d0WI/oT6r5Trz4rzQ== + version "8.10.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.38.tgz#e05c201a668492e534b48102aca0294898f449f6" + integrity sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A== "@types/prop-types@*": - version "15.5.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3" - integrity sha512-mOrlCEdwX3seT3n0AXNt4KNPAZZxcsABUHwBgFXOt+nvFUXkxCAO6UBJHPrDxWEa2KDMil86355fjo8jbZ+K0Q== - dependencies: - "@types/react" "*" + version "15.5.6" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.6.tgz#9c03d3fed70a8d517c191b7734da2879b50ca26c" + integrity sha512-ZBFR7TROLVzCkswA3Fmqq+IIJt62/T7aY/Dmz+QkU7CaW2QFqAitCE8Ups7IzmGhcN1YWMBT4Qcoc07jU9hOJQ== "@types/react@*": - version "16.4.11" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.11.tgz#330f3d864300f71150dc2d125e48644c098f8770" - integrity sha512-1DQnmwO8u8N3ucvRX2ZLDEjQ2VctkAvL/rpbm2ev4uaZA0z4ysU+I0tk+K8ZLblC6p7MCgFyF+cQlSNIPUHzeQ== + version "16.7.7" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.7.7.tgz#1e5e23e7dd922968ed4b484cdec00a5402c9f31b" + integrity sha512-dJiq7CKxD1XJ/GqmbnsQisFnzG4z5lntKBw9X9qeSrguxFbrrhGa8cK9s0ONBp8wL1EfGfofEDVhjen26U46pw== dependencies: "@types/prop-types" "*" csstype "^2.2.0" "@types/recompose@^0.26.4": - version "0.26.4" - resolved "https://registry.yarnpkg.com/@types/recompose/-/recompose-0.26.4.tgz#93dd6c4e28857cd799e9a807a470f66a40c49c3f" - integrity sha512-QOLPlsBxn/yOxSv4Au66kd8KvYZRCgZA3vV5pNZ6YTEY4GeDHNoYL+sCnbzGIcmWDYoN7PUNZSopaGhvHQperw== + version "0.26.5" + resolved "https://registry.yarnpkg.com/@types/recompose/-/recompose-0.26.5.tgz#8496b63c535a60c3584b8b0aca54bfb86679ed70" + integrity sha512-Il5stz/Z3pVIMl48pyggl6nnhRLQ8N8YN8hi0Anm0M5UjVh2uMSY0ah2vzwZZKxnca4NzyJArloSjsJ9fL2vWw== dependencies: "@types/react" "*" @@ -207,18 +160,13 @@ integrity sha512-pRs2gYF5yoKYrgSaira0DJqVg2tFuF+Qjp838xS7K+mJyY2jJzjsrl6y17GbIa4uMRogMbxs+ghNCvKg6XyNrA== JSONStream@^1.0.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.4.tgz#615bb2adb0cd34c8f4c447b5f6512fa1d8f16a2e" - integrity sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg== + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= - abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -235,11 +183,12 @@ abbrev@1.0.x: integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== dependencies: - acorn "^5.0.0" + acorn "^6.0.1" + acorn-walk "^6.0.1" acorn-jsx@^3.0.0: version "3.0.1" @@ -248,21 +197,26 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.0.0, acorn@^5.5.3: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" - integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== - -acorn@^5.5.0: +acorn@^5.5.0, acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== +acorn@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" + integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" @@ -283,14 +237,15 @@ ajv@^5.2.3, ajv@^5.3.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= +ajv@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" + integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" amdefine@>=0.0.4: version "1.0.1" @@ -340,12 +295,12 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= dependencies: - default-require-extensions "^2.0.0" + default-require-extensions "^1.0.0" aproba@^1.0.3: version "1.2.0" @@ -490,21 +445,14 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async-retry@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.1.tgz#308c6c4e1d91e63397a4676290334ae9bda7bcb1" - integrity sha512-FadV8UDcyZDjzb6eV7MCJj0bfrNjwKw7/X0QHPFCbYP6T20FXgZCYXpJKlQC8RxEQP1E6Xs8pNHdh3bcrZAuAw== - dependencies: - retry "0.10.1" - -async-retry@^1.2.3: +async-retry@^1.2.1, async-retry@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" integrity sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q== dependencies: retry "0.12.0" -async@1.x, async@^1.4.0, async@^1.5.0: +async@1.x, async@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= @@ -522,9 +470,9 @@ asynckit@^0.4.0: integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - integrity sha1-ri1acpR38onWDdf5amMUoi3Wwio= + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== aws-sign2@~0.7.0: version "0.7.0" @@ -538,7 +486,7 @@ aws4@^1.8.0: axios@^0.18.0: version "0.18.0" - resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= dependencies: follow-redirects "^1.3.0" @@ -746,10 +694,10 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^23.4.2: - version "23.4.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.2.tgz#f276de67798a5d68f2d6e87ff518c2f6e1609877" - integrity sha512-wg1LJ2tzsafXqPFVgAsYsMCVD5U7kwJZAvbZIxVm27iOewsQw1BR7VZifDlMTEWVo3wasoPPyMdKXWCsfFPr3Q== +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== dependencies: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^23.2.0" @@ -1316,11 +1264,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bignumber.js@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" - integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== - bignumber.js@7.2.1, bignumber.js@^7, bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" @@ -1347,19 +1290,19 @@ boolbase@~1.0.0: integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= boom@7.x.x: - version "7.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-7.2.0.tgz#2bff24a55565767fde869ec808317eb10c48e966" - integrity sha1-K/8kpVVldn/ehp7ICDF+sQxI6WY= + version "7.2.2" + resolved "https://registry.yarnpkg.com/boom/-/boom-7.2.2.tgz#ac92101451aa5cea901aed07d881dd32b4f08345" + integrity sha512-IFUbOa8PS7xqmhIjpeStwT3d09hGkNYQ6aj2iELSTxcVs2u0aKn1NzhkdUQSzsRg1FVkj3uit3I6mXQCBixw+A== dependencies: - hoek "5.x.x" + hoek "6.x.x" bounce@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/bounce/-/bounce-1.2.0.tgz#e3bac68c73fd256e38096551efc09f504873c8c8" - integrity sha512-8syCGe8B2/WC53118/F/tFy5aW00j+eaGPXmAUP7iBhxc+EBZZxS1vKelWyBCH6IqojgS2t1gF0glH30qAJKEw== + version "1.2.3" + resolved "https://registry.yarnpkg.com/bounce/-/bounce-1.2.3.tgz#2b286d36eb21d5f08fe672dd8cd37a109baad121" + integrity sha512-3G7B8CyBnip5EahCZJjnvQ1HLyArC6P5e+xcolo13BVI9ogFaDOsNMAE7FIWliHtIkYI8/nTRCvCY9tZa3Mu4g== dependencies: boom "7.x.x" - hoek "5.x.x" + hoek "6.x.x" brace-expansion@^1.1.7: version "1.1.11" @@ -1395,9 +1338,9 @@ braces@^2.3.1: to-regex "^3.0.1" browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== browser-resolve@^1.11.3: version "1.11.3" @@ -1419,6 +1362,13 @@ browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -1426,7 +1376,7 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -buffer-from@^1.0.0, buffer-from@^1.1.0: +buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -1490,11 +1440,6 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -1518,23 +1463,15 @@ capture-exit@^1.2.0: rsvp "^3.3.3" capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - integrity sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0= + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chai-as-promised@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-6.0.0.tgz#1a02a433a6f24dafac63b9c96fa1684db1aa8da6" @@ -1621,15 +1558,15 @@ chokidar@^1.6.1: optionalDependencies: fsevents "^1.0.0" -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== -ci-info@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.3.0.tgz#ea8219b0355a58692b762baf1cdd76ceb4503283" - integrity sha512-mPdvoljUhH3Feai3dakD3bwYl/8I0tSo16Ge2W+tY88yfYDKGVnXV2vFxZC8VGME01CYp+DaAZnE93VHYVapnA== +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== circular-json-es6@^2.0.1: version "2.0.2" @@ -1663,15 +1600,6 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -1695,11 +1623,6 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -closest-file-data@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a" - integrity sha1-l1+HwTLymdJKA3W59jyj+4j3Kzo= - cmd-shim@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" @@ -1727,16 +1650,16 @@ collection-visit@^1.0.0: object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" - integrity sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg== + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "1.1.1" + color-name "1.1.3" -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" - integrity sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok= +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@0.5.x: version "0.5.1" @@ -1751,17 +1674,17 @@ columnify@^1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@1.0.6, combined-stream@~1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.7.tgz#16828f0c3ff2b0c58805861ef211b64fc15692a8" - integrity sha512-doWDvhXCcW5LK0cIUWrOQ8oMFXJv3lEQCkJpGVjM8v9SV0uhqYXB943538tEA2CiaWqSyuYUGAm5ezDwEx9xlw== + version "1.2.8" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" + integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw== command-join@^2.0.0: version "2.0.0" @@ -1775,12 +1698,12 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0: +commander@^2.11.0, commander@^2.12.1: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commander@^2.12.1, commander@~2.17.1: +commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== @@ -1793,11 +1716,6 @@ compare-func@^1.3.1: array-ify "^1.0.0" dot-prop "^3.0.0" -compare-versions@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" - integrity sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ== - component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -1995,12 +1913,7 @@ conventional-recommended-bump@^1.2.1: meow "^3.3.0" object-assign "^4.0.1" -convert-source-map@^1.4.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= - -convert-source-map@^1.5.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -2098,9 +2011,9 @@ css-select@~1.2.0: nth-check "~1.0.1" css-what@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" - integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= + version "2.1.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" + integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.4" @@ -2108,16 +2021,16 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== cssstyle@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.0.0.tgz#79b16d51ec5591faec60e688891f15d2a5705129" - integrity sha512-Bpuh47j2mRMY60X90mXaJAEtJwxvA2roZzbgwAXYhMbmwmakdRr4Cq9L5SkleKJNLOKqHIa2YWyOXDX3VgggSQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" + integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== dependencies: cssom "0.3.x" csstype@^2.2.0: - version "2.5.6" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788" - integrity sha512-tKPyhy0FmfYD2KQYXD5GzkvAYLYj96cMLXr648CKGd3wBe0QqoPipImjGiLze9c8leJK8J3n7ap90tpk3E6HGQ== + version "2.5.7" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.7.tgz#bf9235d5872141eccfb2d16d82993c6b149179ff" + integrity sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw== currently-unhandled@^0.4.1: version "0.4.1" @@ -2148,13 +2061,13 @@ dashdash@^1.12.0: assert-plus "^1.0.0" data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" dateformat@^3.0.0: version "3.0.3" @@ -2175,13 +2088,20 @@ debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6. dependencies: ms "2.0.0" -debug@^3.1.0: +debug@=3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + decamelize-keys@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -2190,7 +2110,7 @@ decamelize-keys@^1.0.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2234,12 +2154,12 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -default-require-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= dependencies: - strip-bom "^3.0.0" + strip-bom "^2.0.0" defaults@^1.0.3: version "1.0.3" @@ -2355,7 +2275,12 @@ dom-serializer@0, dom-serializer@~0.1.0: domelementtype "~1.1.1" entities "~1.1.1" -domelementtype@1, domelementtype@^1.3.0: +domelementtype@1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479" + integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA== + +domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= @@ -2450,9 +2375,9 @@ electron-to-chromium@^1.3.47: integrity sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw== electron@^2.0.2: - version "2.0.8" - resolved "https://registry.yarnpkg.com/electron/-/electron-2.0.8.tgz#6ec7113b356e09cc9899797e0d41ebff8163e962" - integrity sha512-pbeGFbwijb5V3Xy/KMcwIp59eA9igg2br+7EHbbwQoa3HRDF5JjTrciX7OiscCA52+ze2n4q38S4lXPqRitgIA== + version "2.0.14" + resolved "https://registry.yarnpkg.com/electron/-/electron-2.0.14.tgz#fad6766645e7c0cd10b4ae822d3167959735a870" + integrity sha512-8HLVZuscZxVhoMUL6RlF5kMcwGUAMWw5HNwrEmRgzZyBIBbdCO4aMo9z0qknnPTUDROz8xXZFNhFvBXDu61g5Q== dependencies: "@types/node" "^8.0.24" electron-download "^3.0.1" @@ -2466,37 +2391,37 @@ encoding@^0.1.11: iconv-lite "~0.4.13" entities@^1.1.1, entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== enzyme-adapter-react-16@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.2.0.tgz#c6e80f334e0a817873262d7d01ee9e4747e3c97e" - integrity sha512-UgBra+xZFVFbU5Tw7Inw0bPrNJhM2ru4vCoO7preX6sOicXuDbOH927QJx4pk6m6vatd8jnPXTF6/GCjzytJTg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.7.0.tgz#90344395a89624edbe7f0e443bc19fef62bf1f9f" + integrity sha512-rDr0xlnnFPffAPYrvG97QYJaRl9unVDslKee33wTStsBEwZTkESX1H7VHGT5eUc6ifNzPgOJGvSh2zpHT4gXjA== dependencies: - enzyme-adapter-utils "^1.5.0" + enzyme-adapter-utils "^1.9.0" function.prototype.name "^1.1.0" object.assign "^4.1.0" object.values "^1.0.4" prop-types "^15.6.2" - react-is "^16.4.2" - react-reconciler "^0.7.0" + react-is "^16.6.1" react-test-renderer "^16.0.0-0" -enzyme-adapter-utils@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.5.0.tgz#a020ab3ae79bb1c85e1d51f48f35e995e0eed810" - integrity sha512-cLUaPYU8GEzAHi/1hiO+ylz4QiQWI8eb9SysAk8Tbul2O918dRf4cfD4s2BjijtwSvhapkOsPW9XRix1EXlJ1Q== +enzyme-adapter-utils@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.9.0.tgz#3997c20f3387fdcd932b155b3740829ea10aa86c" + integrity sha512-uMe4xw4l/Iloh2Fz+EO23XUYMEQXj5k/5ioLUXCNOUCI8Dml5XQMO9+QwUq962hBsY5qftfHHns+d990byWHvg== dependencies: function.prototype.name "^1.1.0" object.assign "^4.1.0" prop-types "^15.6.2" + semver "^5.6.0" -enzyme-matchers@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-6.0.3.tgz#187fb322ed70d38e6160251bc398a53aec1cfc7e" - integrity sha512-yC43t4u6v/etHCapCukLt7Y9HWZ+QKN/3ozoO6DqqAF3BMzIvyEQUELrI17gi/l0Cv6B46STSI3MCIJJR1NmnQ== +enzyme-matchers@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-6.1.2.tgz#cd70e45dbcff34d47406797998d55d06ceb822de" + integrity sha512-cP9p+HMOZ1ZXQ+k2H4dCkxmTZzIvpEy5zv0ZjgoBl6D0U43v+bJGH5IeWHdIovCzgJ0dVcMCKJ6lNu83lYUCAA== dependencies: circular-json-es6 "^2.0.1" deep-equal-ident "^1.1.1" @@ -2509,9 +2434,9 @@ enzyme-to-json@^3.3.0: lodash "^4.17.4" enzyme@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.4.2.tgz#17bcbec411b6b874c508d31edb51aaf431e88ae7" - integrity sha512-2DQLUk9iLJOKCm3R91IVz62zNaIa3mMU1kLKWfLVp9w9/fxurw8eSBVVXhU8xA4Ymlyxito1BPz7Q7Rs73q5zw== + version "3.7.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.7.0.tgz#9b499e8ca155df44fef64d9f1558961ba1385a46" + integrity sha512-QLWx+krGK6iDNyR1KlH5YPZqxZCQaVF6ike1eDJAOg0HvSkSCVImPsdWaNw6v+VrnK92Kg8jIOYhuOSS9sBpyg== dependencies: array.prototype.flat "^1.2.1" cheerio "^1.0.0-rc.2" @@ -2522,7 +2447,8 @@ enzyme@^3.4.2: is-number-object "^1.0.3" is-string "^1.0.4" is-subset "^0.1.1" - lodash "^4.17.4" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" object-inspect "^1.6.0" object-is "^1.0.1" object.assign "^4.1.0" @@ -2530,6 +2456,7 @@ enzyme@^3.4.2: object.values "^1.0.4" raf "^3.4.0" rst-selector-parser "^2.2.3" + string.prototype.trim "^1.1.2" error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" @@ -2538,7 +2465,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: +es-abstract@^1.10.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== @@ -2550,15 +2477,15 @@ es-abstract@^1.10.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: is-regex "^1.0.4" es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - integrity sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0= + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.46" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== @@ -2582,9 +2509,9 @@ es6-iterator@^2.0.1, es6-iterator@~2.0.3: es6-symbol "^3.1.1" es6-promise@^4.0.5, es6-promise@^4.1.1: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" - integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" @@ -2915,15 +2842,15 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.5.0.tgz#18999a0eef8f8acf99023fde766d9c323c2562ed" - integrity sha512-aG083W63tBloy8YgafWuC44EakjYe0Q6Mg35aujBPvyNU38DvLat9BVzOihNP2NZDLaCJiFNe0vejbtO6knnlA== +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== dependencies: ansi-styles "^3.2.0" - jest-diff "^23.5.0" + jest-diff "^23.6.0" jest-get-type "^22.1.0" - jest-matcher-utils "^23.5.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" @@ -3017,7 +2944,12 @@ fast-deep-equal@^1.0.0: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= -fast-json-stable-stringify@^2.0.0: +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= @@ -3034,7 +2966,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.1, fbjs@^0.8.16: +fbjs@^0.8.1: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= @@ -3129,11 +3061,11 @@ flat-cache@^1.2.1: write "^0.2.1" follow-redirects@^1.3.0: - version "1.5.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.7.tgz#a39e4804dacb90202bca76a9e2ac10433ca6a69a" - integrity sha512-NONJVIFiX7Z8k2WxfqBjtwqMifx7X42ORLFrOZ2LTKGj71G3C0kfdyTqGqr8fx5zSX6Foo/D95dgGWbPUiwnew== + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== dependencies: - debug "^3.1.0" + debug "=3.1.0" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -3153,12 +3085,12 @@ forever-agent@~0.6.1: integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "1.0.6" + combined-stream "^1.0.6" mime-types "^2.1.12" formatio@1.1.1: @@ -3175,15 +3107,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-extra@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" - integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -3205,9 +3128,9 @@ fs-extra@^4.0.1: universalify "^0.1.0" fs-extra@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" - integrity sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ== + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3238,7 +3161,7 @@ fsevents@^1.0.0, fsevents@^1.2.3: nan "^2.9.2" node-pre-gyp "^0.10.0" -function-bind@^1.1.0, function-bind@^1.1.1: +function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -3395,9 +3318,9 @@ glob@^5.0.15: path-is-absolute "^1.0.0" glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3444,12 +3367,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -graceful-fs@^4.1.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -3474,7 +3392,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.1: +handlebars@^4.0.1, handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== @@ -3485,28 +3403,17 @@ handlebars@^4.0.1: optionalDependencies: uglify-js "^3.1.4" -handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" - integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA== + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - ajv "^5.3.0" + ajv "^6.5.5" har-schema "^2.0.0" has-ansi@^2.0.0: @@ -3580,14 +3487,14 @@ he@1.1.1: integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= highlight.js@^9.0.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" - integrity sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4= + version "9.13.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" + integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A== -hoek@5.x.x: - version "5.0.4" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" - integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w== +hoek@6.x.x: + version "6.0.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.0.3.tgz#7884360426d927865a0a1251fc9c59313af5b798" + integrity sha512-TU6RyZ/XaQCTWRLrdqZZtZqwxUVr6PDMfi6MlWNURZ7A6czanQqX4pFE1mdOUQR9FdPCsZ0UzL8jI/izZ+eBSQ== hoist-non-react-statics@^2.3.1: version "2.5.5" @@ -3620,16 +3527,16 @@ html-encoding-sniffer@^1.0.2: whatwg-encoding "^1.0.1" htmlparser2@^3.9.1: - version "3.9.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" - integrity sha1-G9+HrMoPP55T+k/M6w9LTLsAszg= + version "3.10.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" + integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== dependencies: domelementtype "^1.3.0" domhandler "^2.3.0" domutils "^1.5.1" entities "^1.1.1" inherits "^2.0.1" - readable-stream "^2.0.2" + readable-stream "^3.0.6" http-signature@~1.2.0: version "1.2.0" @@ -3640,10 +3547,10 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -3782,17 +3689,17 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3, is-callable@^1.1.4: +is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-ci@^1.0.10: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.0.tgz#3f4a08d6303a09882cef3f0fb97439c5f5ce2d53" - integrity sha512-plgvKjQtalH2P3Gytb7L61Lmz95g2DlpzFiQyRSFew8WoJKxtKRzrZMeyRN2supblm3Psc8OQGy7Xjb6XG11jw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== dependencies: - ci-info "^1.3.0" + ci-info "^1.5.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -3996,10 +3903,12 @@ is-subset@^0.1.1: resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - integrity sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" is-text-path@^1.0.0: version "1.0.1" @@ -4064,73 +3973,72 @@ isstream@~0.1.2: integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-api@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" - integrity sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g== + version "1.3.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" + integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA== dependencies: async "^2.1.4" - compare-versions "^3.1.0" fileset "^2.0.2" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.3.0" + istanbul-lib-coverage "^1.2.1" + istanbul-lib-hook "^1.2.2" + istanbul-lib-instrument "^1.10.2" + istanbul-lib-report "^1.1.5" + istanbul-lib-source-maps "^1.2.6" + istanbul-reports "^1.5.1" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - integrity sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A== - -istanbul-lib-hook@^1.2.0: +istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" - integrity sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg== + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + +istanbul-lib-hook@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== dependencies: - append-transform "^1.0.0" + append-transform "^0.4.0" -istanbul-lib-instrument@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" - integrity sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ== +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" semver "^5.3.0" -istanbul-lib-report@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" - integrity sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA== +istanbul-lib-report@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== dependencies: - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" - integrity sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA== +istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== dependencies: debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" - integrity sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA== +istanbul-reports@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== dependencies: handlebars "^4.0.3" @@ -4161,10 +4069,10 @@ jest-changed-files@^23.4.2: dependencies: throat "^4.0.0" -jest-cli@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.5.0.tgz#d316b8e34a38a610a1efc4f0403d8ef8a55e4492" - integrity sha512-Kxi2QH8s6NkpPgboza/plpmQ2bjUQ+MwYv7vM5rDwJz/x+NB4YoLXFikPXLWNP0JuYpMvYwITKneFljnNKhq2Q== +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" + integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -4178,18 +4086,18 @@ jest-cli@^23.5.0: istanbul-lib-instrument "^1.10.1" istanbul-lib-source-maps "^1.2.4" jest-changed-files "^23.4.2" - jest-config "^23.5.0" + jest-config "^23.6.0" jest-environment-jsdom "^23.4.0" jest-get-type "^22.1.0" - jest-haste-map "^23.5.0" + jest-haste-map "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" - jest-resolve-dependencies "^23.5.0" - jest-runner "^23.5.0" - jest-runtime "^23.5.0" - jest-snapshot "^23.5.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.5.0" + jest-validate "^23.6.0" jest-watcher "^23.4.0" jest-worker "^23.2.0" micromatch "^2.3.11" @@ -4203,35 +4111,35 @@ jest-cli@^23.5.0: which "^1.2.12" yargs "^11.0.0" -jest-config@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.5.0.tgz#3770fba03f7507ee15f3b8867c742e48f31a9773" - integrity sha512-JENhQpLaVwXWPLUkhPYgIfecHKsU8GR1vj79rS4n0LSRsHx/U2wItZKoKAd5vtt2J58JPxRq4XheG79jd4fI7Q== +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== dependencies: babel-core "^6.0.0" - babel-jest "^23.4.2" + babel-jest "^23.6.0" chalk "^2.0.1" glob "^7.1.1" jest-environment-jsdom "^23.4.0" jest-environment-node "^23.4.0" jest-get-type "^22.1.0" - jest-jasmine2 "^23.5.0" + jest-jasmine2 "^23.6.0" jest-regex-util "^23.3.0" - jest-resolve "^23.5.0" + jest-resolve "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.5.0" + jest-validate "^23.6.0" micromatch "^2.3.11" - pretty-format "^23.5.0" + pretty-format "^23.6.0" -jest-diff@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.5.0.tgz#250651a433dd0050290a07642946cc9baaf06fba" - integrity sha512-Miz8GakJIz443HkGpVOAyHQgSYqcgs2zQmDJl4oV7DYrFotchdoQvxceF6LhfpRBV1LOUGcFk5Dd/ffSXVwMsA== +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^22.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-docblock@^23.2.0: version "23.2.0" @@ -4240,18 +4148,18 @@ jest-docblock@^23.2.0: dependencies: detect-newline "^2.1.0" -jest-each@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.5.0.tgz#77f7e2afe6132a80954b920006e78239862b10ba" - integrity sha512-8BgebQgAJmWXpYp4Qt9l3cn1Xei0kZ7JL4cs/NXh7750ATlPGzRRYbutFVJTk5B/Lt3mjHP3G3tLQLyBOCSHGA== +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== dependencies: chalk "^2.0.1" - pretty-format "^23.5.0" + pretty-format "^23.6.0" -jest-environment-enzyme@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/jest-environment-enzyme/-/jest-environment-enzyme-6.0.3.tgz#5c9172b709aadf21674ef2504bccea230a921e98" - integrity sha512-4U7BQkWypRSB8hYazFQ0TpHVkp0nzlS+5/qFnaj/1CzA58PvQfcQwj1k40sRSxIICEgAp3NLcNtgXHsYh3+9+Q== +jest-environment-enzyme@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/jest-environment-enzyme/-/jest-environment-enzyme-6.1.2.tgz#2612805a3cc0fa6934f9c3e62cf6255077d1b16b" + integrity sha512-WHeBKgBYOdryuOTEoK55lJwjg7Raery1OgXHLwukI3mSYgOkm2UrCDDT+vneqVgy7F8KuRHyStfD+TC/m2b7Kg== dependencies: jest-environment-jsdom "^22.4.1" @@ -4282,23 +4190,23 @@ jest-environment-node@^23.4.0: jest-util "^23.4.0" jest-enzyme@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/jest-enzyme/-/jest-enzyme-6.0.3.tgz#c2121bb66d16cacba4721a5ae670a74c3be0e51e" - integrity sha512-Rd0vAlwRZoTgfC063/XiMiMDd2+1pF5Vp7p5KDZWKf9TM9QJPYntaxY+2tAqy5IS5ic2SiPfbGpp7KfYxoo1tA== + version "6.1.2" + resolved "https://registry.yarnpkg.com/jest-enzyme/-/jest-enzyme-6.1.2.tgz#89da43da19b4d8ddbfb49e153c2884f22954d330" + integrity sha512-+ds7r2ru3QkNJxelQ2tnC6d33pjUSsZHPD3v4TlnHlNMuGX3UKdxm5C46yZBvJICYBvIF+RFKBhLMM4evNM95Q== dependencies: - enzyme-matchers "^6.0.3" + enzyme-matchers "^6.1.2" enzyme-to-json "^3.3.0" - jest-environment-enzyme "^6.0.3" + jest-environment-enzyme "^6.1.2" jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== -jest-haste-map@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.5.0.tgz#d4ca618188bd38caa6cb20349ce6610e194a8065" - integrity sha512-bt9Swigb6KZ6ZQq/fQDUwdUeHenVvZ6G/lKwJjwRGp+Fap8D4B3bND3FaeJg7vXVsLX8hXshRArbVxLop/5wLw== +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" + integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg== dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" @@ -4309,39 +4217,39 @@ jest-haste-map@^23.5.0: micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.5.0.tgz#05fe7f1788e650eeb5a03929e6461ea2e9f3db53" - integrity sha512-xMgvDUvgqKpilsGnneC9Qr+uIlROxKI3UoJcHZeUlu6AKpQyEkGh0hKbfM0NaEjX5sy7WeFQEhcp/AiWlHcc0A== +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== dependencies: babel-traverse "^6.0.0" chalk "^2.0.1" co "^4.6.0" - expect "^23.5.0" + expect "^23.6.0" is-generator-fn "^1.0.0" - jest-diff "^23.5.0" - jest-each "^23.5.0" - jest-matcher-utils "^23.5.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" - jest-snapshot "^23.5.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" -jest-leak-detector@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.5.0.tgz#14ac2a785bd625160a2ea968fd5d98b7dcea3e64" - integrity sha512-40VsHQCIEslxg91Zg5NiZGtPeWSBLXiD6Ww+lhHlIF6u8uSQ+xgiD6NbWHFOYs1VBRI+V/ym7Q1aOtVg9tqMzQ== +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg== dependencies: - pretty-format "^23.5.0" + pretty-format "^23.6.0" -jest-matcher-utils@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.5.0.tgz#0e2ea67744cab78c9ab15011c4d888bdd3e49e2a" - integrity sha512-hmQUKUKYOExp3T8dNYK9A9copCFYKoRLcY4WDJJ0Z2u3oF6rmAhHuZtmpHBuGpASazobBxm3TXAfAXDvz2T7+Q== +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-message-util@^22.4.3: version "22.4.3" @@ -4380,46 +4288,46 @@ jest-regex-util@^23.3.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= -jest-resolve-dependencies@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.5.0.tgz#10c4d135beb9d2256de1fedc7094916c3ad74af7" - integrity sha512-APZc/CjfzL8rH/wr+Gh7XJJygYaDjMQsWaJy4ZR1WaHWKude4WcfdU8xjqaNbx5NsVF2P2tVvsLbumlPXCdJOw== +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" + integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA== dependencies: jest-regex-util "^23.3.0" - jest-snapshot "^23.5.0" + jest-snapshot "^23.6.0" -jest-resolve@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.5.0.tgz#3b8e7f67e84598f0caf63d1530bd8534a189d0e6" - integrity sha512-CRPc0ebG3baNKz/QicIy5rGfzYpMNm8AjEl/tDQhehq/QC4ttyauZdvAXel3qo+4Gri9ljajnxW+hWyxZbbcnQ== +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== dependencies: browser-resolve "^1.11.3" chalk "^2.0.1" realpath-native "^1.0.0" -jest-runner@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.5.0.tgz#570f7a044da91648b5bb9b6baacdd511076c71d7" - integrity sha512-cpBvkBTVmW1ab1thbtoh2m6VnnM0BYKhj3MEzbOTZjPfzoIjUVIxLUTDobVNOvEK7aTEb/2oiPlNoOTSNJx8mw== +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA== dependencies: exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^23.5.0" + jest-config "^23.6.0" jest-docblock "^23.2.0" - jest-haste-map "^23.5.0" - jest-jasmine2 "^23.5.0" - jest-leak-detector "^23.5.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" jest-message-util "^23.4.0" - jest-runtime "^23.5.0" + jest-runtime "^23.6.0" jest-util "^23.4.0" jest-worker "^23.2.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.5.0.tgz#eb503525a196dc32f2f9974e3482d26bdf7b63ce" - integrity sha512-WzzYxYtoU8S1MJns0G4E3BsuFUTFBiu1qsk3iC9OTugzNQcQKt0BoOGsT7wXCKqkw/09QdV77vvaeJXST2Efgg== +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" + integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw== dependencies: babel-core "^6.0.0" babel-plugin-istanbul "^4.1.6" @@ -4428,14 +4336,14 @@ jest-runtime@^23.5.0: exit "^0.1.2" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.11" - jest-config "^23.5.0" - jest-haste-map "^23.5.0" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" - jest-resolve "^23.5.0" - jest-snapshot "^23.5.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.5.0" + jest-validate "^23.6.0" micromatch "^2.3.11" realpath-native "^1.0.0" slash "^1.0.0" @@ -4448,20 +4356,20 @@ jest-serializer@^23.0.1: resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= -jest-snapshot@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.5.0.tgz#cc368ebd8513e1175e2a7277f37a801b7358ae79" - integrity sha512-NYg8MFNVyPXmnnihiltasr4t1FJEXFbZFaw1vZCowcnezIQ9P1w+yxTwjWT564QP24Zbn5L9cjxLs8d6K+pNlw== +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== dependencies: babel-types "^6.0.0" chalk "^2.0.1" - jest-diff "^23.5.0" - jest-matcher-utils "^23.5.0" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" - jest-resolve "^23.5.0" + jest-resolve "^23.6.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" semver "^5.5.0" jest-util@^22.4.3: @@ -4491,15 +4399,15 @@ jest-util@^23.4.0: slash "^1.0.0" source-map "^0.6.0" -jest-validate@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.5.0.tgz#f5df8f761cf43155e1b2e21d6e9de8a2852d0231" - integrity sha512-XmStdYhfdiDKacXX5sNqEE61Zz4/yXaPcDsKvVA0429RBu2pkQyIltCVG7UitJIEAzSs3ociQTdyseAW8VGPiA== +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" leven "^2.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-watcher@^23.4.0: version "23.4.0" @@ -4518,12 +4426,12 @@ jest-worker@^23.2.0: merge-stream "^1.0.1" jest@^23.4.1: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-23.5.0.tgz#80de353d156ea5ea4a7332f7962ac79135fbc62e" - integrity sha512-+X3Fk4rD8dTnHoIxHJymZthbtYllvSOnXAApQltvyLkHsv+fqyC/SZptUJDbXkFsqZJyyIXMySkdzerz3fv4oQ== + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" + integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw== dependencies: import-local "^1.0.0" - jest-cli "^23.5.0" + jest-cli "^23.6.0" js-sha3@0.5.5: version "0.5.5" @@ -4535,16 +4443,16 @@ js-sha3@0.7.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a" integrity sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA== -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@3.x, js-yaml@^3.11.0, js-yaml@^3.7.0, js-yaml@^3.9.1: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" @@ -4558,7 +4466,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^11.1.0, jsdom@^11.10.0, jsdom@^11.5.1: +jsdom@^11.1.0, jsdom@^11.5.1, jsdom@^11.9.0: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== @@ -4610,6 +4518,11 @@ json-schema-traverse@^0.3.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -4630,6 +4543,13 @@ json3@3.3.2: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= +json5@2.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -4703,14 +4623,9 @@ klaw@^1.0.0: graceful-fs "^4.1.9" kleur@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.1.tgz#7cc64b0d188d0dcbc98bdcdfdda2cc10619ddce8" - integrity sha512-Zq/jyANIJ2uX8UZjWlqLwbyhcxSXJtT/Y89lClyeZd3l++3ztL1I5SSCYrbcbwSunTjC88N3WuMk0kRDQD6gzA== - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + version "2.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" + integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== lcid@^1.0.0: version "1.0.0" @@ -4882,6 +4797,11 @@ lodash.create@3.1.1: lodash._basecreate "^3.0.0" lodash._isiterateecall "^3.0.0" +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -4905,6 +4825,11 @@ lodash.isequal@^3.0: lodash._baseisequal "^3.0.0" lodash._bindcallback "^3.0.0" +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.istypedarray@^3.0.0: version "3.0.6" resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" @@ -4939,12 +4864,7 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" -lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== - -lodash@~4.17.2: +lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.2: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -4959,11 +4879,6 @@ lolex@1.3.2: resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" integrity sha1-fD2mL/yzDw9agKJWbKJORdigHzE= -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4985,12 +4900,12 @@ lowercase-keys@^1.0.0: integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== + version "4.1.4" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.4.tgz#51cc46e8e6d9530771c857e24ccc720ecdbcc031" + integrity sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA== dependencies: pseudomap "^1.0.2" - yallist "^2.1.2" + yallist "^3.0.2" lru-queue@0.1: version "0.1.0" @@ -5006,7 +4921,7 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-error@^1.1.1: +make-error@1.x, make-error@^1.1.1: version "1.3.5" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== @@ -5121,9 +5036,9 @@ merge-stream@^1.0.1: readable-stream "^2.0.1" merge@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" @@ -5144,7 +5059,7 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5163,22 +5078,17 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" -mime-db@^1.28.0: - version "1.36.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" - integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== - -mime-db@~1.35.0: - version "1.35.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" - integrity sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg== +mime-db@^1.28.0, mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" - integrity sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw== + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== dependencies: - mime-db "~1.35.0" + mime-db "~1.37.0" mimic-fn@^1.0.0: version "1.2.0" @@ -5220,18 +5130,18 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" - integrity sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w== +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - integrity sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA== +minizlib@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== dependencies: minipass "^2.2.1" @@ -5243,7 +5153,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -5305,15 +5215,20 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.3.3, nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== +nan@^2.11.0, nan@^2.9.2: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== nanomatch@^1.2.9: version "1.2.13" @@ -5354,9 +5269,9 @@ nearley@^2.7.10: semver "^5.4.1" needle@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" - integrity sha512-mW7W8dKuVYefCpNzE3Z7xUmPI9wSrSL/1qH31YGMxmSOAnjatS3S9Zv3cmiHrhx3Jkp1SrWWBdOFXjfF48Uq3A== + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -5400,12 +5315,12 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== + version "5.3.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01" + integrity sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q== dependencies: growly "^1.3.0" - semver "^5.4.1" + semver "^5.5.0" shellwords "^0.1.1" which "^1.3.0" @@ -5471,9 +5386,9 @@ npm-bundled@^1.0.1: integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== npm-packlist@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" - integrity sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5496,9 +5411,9 @@ npmlog@^4.0.2, npmlog@^4.1.2: set-blocking "~2.0.0" nth-check@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" - integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" @@ -5521,9 +5436,9 @@ number-is-nan@^1.0.0: integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.8.tgz#e3603579b7e162b3dbedae4fb24e46f771d8fa24" - integrity sha512-7RZ+qbFGiVc6v14Y8DSZjPN1wZPOaMbiiP4tzf5eNuyOITAeOIA3cMhjuKUypVIqBgCSg1KaSyAv8Ocq/0ZJ1A== + version "2.0.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" + integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== oauth-sign@~0.9.0: version "0.9.0" @@ -5926,10 +5841,10 @@ pretty-bytes@^1.0.2: get-stdin "^4.0.1" meow "^3.1.0" -pretty-format@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.5.0.tgz#0f9601ad9da70fe690a269cd3efca732c210687c" - integrity sha512-iFLvYTXOn+C/s7eV+pr4E8DD7lYa2/klXMEz+lvH14qSDWAJ7S+kFmMe1SIWesATHQxopHTxRcB2nrpExhzaBA== +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" @@ -5953,9 +5868,9 @@ progress-stream@^1.1.0: through2 "~0.2.3" progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= + version "2.0.1" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" + integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== promise-any@^0.2.0: version "0.2.0" @@ -5977,7 +5892,7 @@ prompts@^0.1.9: kleur "^2.0.1" sisteransi "^0.1.1" -prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -6031,9 +5946,9 @@ quick-lru@^1.0.0: integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= raf@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" - integrity sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw== + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" @@ -6051,9 +5966,9 @@ randexp@0.4.6: ret "~0.1.10" randomatic@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" - integrity sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: is-number "^4.0.0" kind-of "^6.0.0" @@ -6070,54 +5985,44 @@ rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.2.7: strip-json-comments "~2.0.1" react-dom@^16.4.2: - version "16.4.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4" - integrity sha512-Usl73nQqzvmJN+89r97zmeUpQDKDlh58eX6Hbs/ERdDHzeBzWy+ENk7fsGQ+5KxArV1iOFPT46/VneklK9zoWw== + version "16.6.3" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0" + integrity sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.11.2" -react-is@^16.4.2: - version "16.4.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88" - integrity sha512-rI3cGFj/obHbBz156PvErrS5xc6f1eWyTwyV4mo0vF2lGgXgS+mm7EKD5buLJq6jNgIagQescGSVG2YzgXt8Yg== +react-is@^16.6.1, react-is@^16.6.3: + version "16.6.3" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" + integrity sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA== react-lifecycles-compat@^3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-reconciler@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d" - integrity sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg== - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - react-test-renderer@^16.0.0-0: - version "16.4.2" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e" - integrity sha512-vdTPnRMDbxfv4wL4lzN4EkVGXyYs7LE2uImOsqh1FKiP6L5o1oJl8nore5sFi9vxrP9PK3l4rgb/fZ4PVUaWSA== + version "16.6.3" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.6.3.tgz#5f3a1a7d5c3379d46f7052b848b4b72e47c89f38" + integrity sha512-B5bCer+qymrQz/wN03lT0LppbZUDRq6AMfzMKrovzkGzfO81a9T+PWQW6MzkWknbwODQH/qpJno/yFQLX5IWrQ== dependencies: - fbjs "^0.8.16" object-assign "^4.1.1" - prop-types "^15.6.0" - react-is "^16.4.2" + prop-types "^15.6.2" + react-is "^16.6.3" + scheduler "^0.11.2" react@^16.4.2: - version "16.4.2" - resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f" - integrity sha512-dMv7YrbxO4y2aqnvA7f/ik9ibeLSHQJTI6TrYAenPSaQ6OXfb+Oti+oJiy8WBxgRzlKatYqtCjphTgDSCEiWFg== + version "16.6.3" + resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c" + integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.11.2" read-cmd-shim@^1.0.1: version "1.0.1" @@ -6177,7 +6082,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -6190,6 +6095,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a" + integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -6210,9 +6124,9 @@ readdirp@^2.0.0: readable-stream "^2.0.2" realpath-native@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" - integrity sha512-W14EcXuqUvKP8dkWkD7B95iMy77lpMnlFXbbk409bQtNCbeu0kvRE5reo+yIZ3JXxg6frbGsz2DLQ39lrCB40g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" + integrity sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g== dependencies: util.promisify "^1.0.0" @@ -6342,9 +6256,9 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" @@ -6445,7 +6359,7 @@ resolve@1.1.7, resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0, resolve@^1.6.0: +resolve@1.x, resolve@^1.1.6, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0, resolve@^1.6.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== @@ -6465,23 +6379,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= - retry@0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -6522,9 +6424,9 @@ rx-lite@*, rx-lite@^4.0.8: integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= rxjs@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" - integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ== + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== dependencies: tslib "^1.9.0" @@ -6576,10 +6478,18 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +scheduler@^0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.2.tgz#a8db5399d06eba5abac51b705b7151d2319d33d3" + integrity sha512-+WCP3s3wOaW4S7C1tl3TEXp4l9lJn0ZK8G3W3WKRWmw77Z2cIFUW2MiNTMHn5sCjxN+t7N43HAOOgMjyAg5hlg== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== semver@5.3.0: version "5.3.0" @@ -6629,9 +6539,9 @@ shebang-regex@^1.0.0: integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" - integrity sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ== + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -6725,13 +6635,13 @@ snapdragon@^0.8.1: use "^3.1.0" sntp@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-3.0.1.tgz#1aa9088d3eb844ea8c0980fce1877884d4117d09" - integrity sha512-k2SIWd9c1dBRDLalpr2Ioc64bPxTpmUwSsQi+w7CLdizUIvGrbUZloEHw5I6VeqCKNWjL9p7n+LdtD5XQXJMbw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-3.0.2.tgz#3f0b5de6115681dce82a9478691f0e5c552de5a3" + integrity sha512-MCAPpBPFjNp1fwDVCLSRuWuH9gONtb2R+lS1esC6Mp8lP6jy60FVUtP/Qr0jBvcWAVbhzx06y1b6ptXiy32dug== dependencies: boom "7.x.x" bounce "1.x.x" - hoek "5.x.x" + hoek "6.x.x" teamwork "3.x.x" sort-keys-length@^1.0.0: @@ -6774,9 +6684,9 @@ source-map-support@^0.4.15: source-map "^0.5.6" source-map-support@^0.5.6: - version "0.5.8" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.8.tgz#04f5581713a8a65612d0175fbf3a01f80a162613" - integrity sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg== + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6786,14 +6696,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -6811,17 +6714,17 @@ source-map@~0.2.0: amdefine ">=0.0.4" spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - integrity sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g== + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - integrity sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== spdx-expression-parse@^3.0.0: version "3.0.0" @@ -6832,9 +6735,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - integrity sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" + integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== speedometer@~0.1.2: version "0.1.4" @@ -6868,25 +6771,24 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" - integrity sha1-xvxhZIo9nE52T9P8306hBeSSupg= + version "1.15.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" + integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - safer-buffer "^2.0.2" - optionalDependencies: 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" stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA= + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== static-extend@^0.1.1: version "0.1.2" @@ -6931,18 +6833,27 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string.prototype.trim@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" -string_decoder@~1.1.1: +string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -7030,9 +6941,9 @@ supports-color@^3.1.0, supports-color@^3.1.2: has-flag "^1.0.0" supports-color@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" @@ -7064,22 +6975,22 @@ table@4.0.2: string-width "^2.1.1" tar@^4: - version "4.4.6" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" - integrity sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg== + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== dependencies: - chownr "^1.0.1" + chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" + minipass "^2.3.4" + minizlib "^1.1.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" yallist "^3.0.2" teamwork@3.x.x: - version "3.0.1" - resolved "https://registry.yarnpkg.com/teamwork/-/teamwork-3.0.1.tgz#ff38c7161f41f8070b7813716eb6154036ece196" - integrity sha512-hEkJIpDOfOYe9NYaLFk00zQbzZeKNCY8T2pRH3I13Y1mJwxaSQ6NEsjY5rCp+11ezCiZpWGoGFTbOuhg4qKevQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/teamwork/-/teamwork-3.0.3.tgz#0c08748efe00c32c1eaf1128ef7f07ba0c7cc4ea" + integrity sha512-OCB56z+G70iA1A1OFoT+51TPzfcgN0ks75uN3yhxA+EU66WTz2BevNDK4YzMqfaL5tuAvxy4iFUn35/u8pxMaQ== temp-dir@^1.0.0: version "1.0.0" @@ -7107,20 +7018,20 @@ tempfile@^1.1.1: uuid "^2.0.1" test-exclude@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" - integrity sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ== + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== dependencies: arrify "^1.0.1" - micromatch "^3.1.8" + micromatch "^2.3.11" object-assign "^4.1.0" read-pkg-up "^1.0.1" require-main-filename "^1.0.1" text-extensions@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39" - integrity sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg== + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== text-table@~0.2.0: version "0.2.0" @@ -7138,11 +7049,11 @@ throttleit@0.0.2: integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= through2@^2.0.0, through2@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - readable-stream "^2.1.5" + readable-stream "~2.3.6" xtend "~4.0.1" through2@~0.2.3: @@ -7164,11 +7075,11 @@ timed-out@^4.0.0: integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-ext@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" - integrity sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== dependencies: - es5-ext "~0.10.14" + es5-ext "~0.10.46" next-tick "1" tmp@^0.0.33: @@ -7249,13 +7160,19 @@ trim-right@^1.0.1: integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= ts-jest@^23.0.0: - version "23.1.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.3.tgz#33e3187d3ef0d42adada6347acf2c3539ac56107" - integrity sha512-nb0wF7zBsmjQUmumrxiW7HQLfYdFosdZfozh+JRLgDcIjOTKe3Vpf1T9Jlp8JBi7OvZ7OFKjpXIwjL7tyliU9Q== - dependencies: - closest-file-data "^0.1.4" - fs-extra "6.0.1" - lodash "^4.17.10" + version "23.10.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5" + integrity sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" ts-node@^7.0.1: version "7.0.1" @@ -7345,9 +7262,9 @@ tsutils@^2.27.2: tslib "^1.8.1" tsutils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.0.0.tgz#0c5070a17a0503e056da038c48b5a1870a50a9ad" - integrity sha512-LjHBWR0vWAUHWdIAoTjoqi56Kz+FDKBgVEuL+gVPG/Pv7QW5IdaDDeK9Txlr6U0Cmckp5EgCIq1T25qe3J6hyw== + version "3.5.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.1.tgz#2219e5f0ad728aef94bd6634a5b4d8ce6b2e2eea" + integrity sha512-g9kwRQRpVDhjS3qfrDsnYv7QkBtsNRm1Ln5539hq9Y2ysndnlaWf8+3zTdaa1YB5ko7dpV9XATlP0KmYPsLc+Q== dependencies: tslib "^1.8.1" @@ -7358,6 +7275,13 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +turndown@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/turndown/-/turndown-5.0.1.tgz#ba92dec646a1db5ea4d8fba162d2f2b62a8d8536" + integrity sha512-OuNongGmx5vo1TWuSFmVa4Rkm/HxFNPU3dyP9OpOMF2RFTtl0RU+QLIIROcDvXWauFJaLpZaZeVMAsL8vrt3Tw== + dependencies: + jsdom "^11.9.0" + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -7380,7 +7304,7 @@ type-detect@^1.0.0: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= -typedarray-to-buffer@^3.1.2: +typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -7398,11 +7322,11 @@ typedoc-default-themes@^0.5.0: integrity sha1-bcJDPnjti+qOiHo6zeLzF4W9Yic= typedoc-plugin-markdown@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-1.1.13.tgz#434ae963156cefaba9dfe3330ce6abf1406ee08d" - integrity sha512-k7kTOy7UfbKfRIQ0VIFqWsjddQFYLsby+cOUHHagR1jZnyeEOq5VvOPT4J5lwoySXCxKCjVrfzxoiAktgbVU9A== + version "1.1.19" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-1.1.19.tgz#f0c2e0a390932f80e85a393961849d0e9d372561" + integrity sha512-dk1J9NHW3c1cMmcmTrw55U7ke6zadB3hZL7y7tkLQ6FeJGkz6SEMuexjVOq5rltuW7JeLqt1ngNKAwG9dXiMgQ== dependencies: - "@forked/turndown" "^4.0.4" + turndown "^5.0.1" typedoc@^0.12.0: version "0.12.0" @@ -7427,25 +7351,20 @@ typedoc@^0.12.0: typedoc-default-themes "^0.5.0" typescript "3.0.x" -typescript@3.0.x, typescript@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb" - integrity sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg== +typescript@3.0.x: + version "3.0.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" + integrity sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg== -ua-parser-js@^0.7.18: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" - integrity sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA== +typescript@^3.0.1: + version "3.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" + integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" +ua-parser-js@^0.7.18: + version "0.7.19" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" + integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== uglify-js@^3.1.4: version "3.4.9" @@ -7455,11 +7374,6 @@ uglify-js@^3.1.4: commander "~2.17.1" source-map "~0.6.1" -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - underscore@~1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" @@ -7506,6 +7420,13 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -7533,17 +7454,12 @@ user-home@^1.1.1: resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= -utf8@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" - integrity sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY= - utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -7632,33 +7548,33 @@ webidl-conversions@^4.0.2: integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== websocket@^1.0.25: - version "1.0.26" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" - integrity sha512-fjcrYDPIQxpTnqFQ9JjxUQcdvR89MFAOjPBlF+vjOt49w/XW4fJknUoMz/mDIn2eK1AdslVojcaOxOqyZZV8rw== + version "1.0.28" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.28.tgz#9e5f6fdc8a3fe01d4422647ef93abdd8d45a78d3" + integrity sha512-00y/20/80P7H4bCYkzuuvvfDvh+dgtXi5kzDf3UcZwN6boTYaKvsrtZ5lIYm1Gsg48siMErd9M4zjSYfYFHTrA== dependencies: debug "^2.2.0" - nan "^2.3.3" - typedarray-to-buffer "^3.1.2" + nan "^2.11.0" + typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621" - integrity sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg== + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: - iconv-lite "0.4.23" + iconv-lite "0.4.24" whatwg-fetch@>=0.10.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^6.4.0, whatwg-url@^6.4.1: +whatwg-url@^6.4.1: version "6.5.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== @@ -7667,6 +7583,15 @@ whatwg-url@^6.4.0, whatwg-url@^6.4.1: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -7686,16 +7611,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= - wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -7789,15 +7704,17 @@ yaeti@^0.0.6: resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@10.x: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" yargs-parser@^7.0.0: version "7.0.0" @@ -7850,16 +7767,6 @@ yargs@^8.0.2: y18n "^3.2.1" yargs-parser "^7.0.0" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" From 90e3890e669913e4a93d8f58d7572f725a941a05 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 15:03:30 +0100 Subject: [PATCH 19/25] Fix bug syncing --- packages/api/src/format/output.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/api/src/format/output.ts b/packages/api/src/format/output.ts index 19b00b04..d5221d85 100644 --- a/packages/api/src/format/output.ts +++ b/packages/api/src/format/output.ts @@ -349,10 +349,11 @@ export function outSignerRequest (request: SerializedSignerRequest) { return result; } -export function outSyncing (syncing: SerializedSyncing) { - const result: Syncing = {}; +export function outSyncing (syncing: SerializedSyncing | false) { + let result: Syncing | false = false; if (syncing && syncing !== 'false') { + result = {}; Object.keys(syncing).forEach(key => { switch (key) { case 'currentBlock': @@ -360,11 +361,11 @@ export function outSyncing (syncing: SerializedSyncing) { case 'startingBlock': case 'warpChunksAmount': case 'warpChunksProcessed': - result[key] = outNumber(syncing[key]); + (result as Syncing)[key] = outNumber(syncing[key]); break; case 'blockGap': - result[key] = syncing[key] + (result as Syncing)[key] = syncing[key] ? (syncing[key] as number[]).map(outNumber) : undefined; break; From e7a61c9ef7afcb6f38d31f0ee8b716bb0cca3e1c Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 15:21:16 +0100 Subject: [PATCH 20/25] Fix bugs across packages --- package.json | 3 +- packages/light.js-react/package.json | 4 +- packages/light.js/example/package.json | 6 +- .../light.js/example/src/BalanceOf/Balance.js | 4 +- .../BalanceOfAddress/BalanceOfAddress.js | 5 +- .../example/src/BlockNumber/BlockNumber.js | 5 +- .../example/src/PeerCount/PeerCount.js | 5 +- packages/light.js/example/src/hoc | 1 - packages/light.js/example/src/index.js | 5 +- packages/light.js/example/src/light.js | 1 - packages/light.js/example/yarn.lock | 1217 +++++++++++++++-- packages/light.js/package.json | 4 +- yarn.lock | 26 +- 13 files changed, 1168 insertions(+), 118 deletions(-) delete mode 120000 packages/light.js/example/src/hoc delete mode 120000 packages/light.js/example/src/light.js diff --git a/package.json b/package.json index 717ba8ef..d8ba9092 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "scripts": { "build": "lerna exec yarn build --stream", "lint": "tslint 'packages/**/*.ts'", - "test": "jest", + "postinstall": "yarn build", + "test": "jest && lerna exec --package api yarn test", "update-docs": "scripts/update-docs.sh" }, "devDependencies": { diff --git a/packages/light.js-react/package.json b/packages/light.js-react/package.json index f8e375ac..ae7b40eb 100644 --- a/packages/light.js-react/package.json +++ b/packages/light.js-react/package.json @@ -26,7 +26,7 @@ "test": "jest" }, "dependencies": { - "recompose": "^0.28.2", + "recompose": "^0.30.0", "symbol-observable": "^1.2.0" }, "devDependencies": { @@ -42,6 +42,6 @@ }, "peerDependencies": { "@parity/light.js": "^3.0.0", - "rxjs": "^6.2.1" + "rxjs": "~6.2.2" } } diff --git a/packages/light.js/example/package.json b/packages/light.js/example/package.json index 5d0db9bf..2c37de67 100644 --- a/packages/light.js/example/package.json +++ b/packages/light.js/example/package.json @@ -9,12 +9,14 @@ "eject": "react-scripts eject" }, "dependencies": { - "@parity/api": "^2.1.24", + "@parity/api": "../../", + "@parity/light.js": "../../", + "@parity/light.js-react": "../../", "react": "^16.3.2", "react-dom": "^16.3.2", "react-router-dom": "^4.3.1", "react-scripts": "1.1.4", - "rxjs": "^6.2.2", + "rxjs": "~6.2.2", "symbol-observable": "^1.2.0" }, "devDependencies": { diff --git a/packages/light.js/example/src/BalanceOf/Balance.js b/packages/light.js/example/src/BalanceOf/Balance.js index 33a156d3..60a8005d 100644 --- a/packages/light.js/example/src/BalanceOf/Balance.js +++ b/packages/light.js/example/src/BalanceOf/Balance.js @@ -4,10 +4,10 @@ // SPDX-License-Identifier: MIT import React, { Component } from 'react'; +import { defaultAccount$ } from '@parity/light.js'; +import light from '@parity/light.js-react'; import BalanceOfAddress from './BalanceOfAddress'; -import { defaultAccount$ } from '../light.js'; -import light from '../hoc'; @light({ defaultAccount: defaultAccount$ diff --git a/packages/light.js/example/src/BalanceOf/BalanceOfAddress/BalanceOfAddress.js b/packages/light.js/example/src/BalanceOf/BalanceOfAddress/BalanceOfAddress.js index 722ec9fe..2fea3aa4 100644 --- a/packages/light.js/example/src/BalanceOf/BalanceOfAddress/BalanceOfAddress.js +++ b/packages/light.js/example/src/BalanceOf/BalanceOfAddress/BalanceOfAddress.js @@ -5,9 +5,8 @@ import React, { Component } from 'react'; import { map } from 'rxjs/operators'; - -import { balanceOf$, withoutLoading } from '../../light.js'; -import light from '../../hoc'; +import { balanceOf$, withoutLoading } from '@parity/light.js'; +import light from '@parity/light.js-react'; @light({ balance: ownProps => diff --git a/packages/light.js/example/src/BlockNumber/BlockNumber.js b/packages/light.js/example/src/BlockNumber/BlockNumber.js index 6c54d8bb..740a0cac 100644 --- a/packages/light.js/example/src/BlockNumber/BlockNumber.js +++ b/packages/light.js/example/src/BlockNumber/BlockNumber.js @@ -4,9 +4,8 @@ // SPDX-License-Identifier: MIT import React, { Component } from 'react'; - -import { blockNumber$ } from '../light.js'; -import light from '../hoc'; +import { blockNumber$ } from '@parity/light.js'; +import light from '@parity/light.js-react'; @light({ blockNumber: blockNumber$ diff --git a/packages/light.js/example/src/PeerCount/PeerCount.js b/packages/light.js/example/src/PeerCount/PeerCount.js index 72d142ec..b6a86e95 100644 --- a/packages/light.js/example/src/PeerCount/PeerCount.js +++ b/packages/light.js/example/src/PeerCount/PeerCount.js @@ -4,9 +4,8 @@ // SPDX-License-Identifier: MIT import React, { Component } from 'react'; - -import { peerCount$, withoutLoading } from '../light.js/index.js'; -import light from '../hoc'; +import { peerCount$, withoutLoading } from '@parity/light.js'; +import light from '@parity/light.js-react'; @light({ peerCount: () => peerCount$().pipe(withoutLoading()) diff --git a/packages/light.js/example/src/hoc b/packages/light.js/example/src/hoc deleted file mode 120000 index ef37044b..00000000 --- a/packages/light.js/example/src/hoc +++ /dev/null @@ -1 +0,0 @@ -../../../light.js-react/lib \ No newline at end of file diff --git a/packages/light.js/example/src/index.js b/packages/light.js/example/src/index.js index 3398dadd..2a39a470 100644 --- a/packages/light.js/example/src/index.js +++ b/packages/light.js/example/src/index.js @@ -3,12 +3,13 @@ // // SPDX-License-Identifier: MIT +import 'symbol-observable'; // TODO Remove this once https://github.com/acdlite/recompose/pull/660 is merged + import React from 'react'; import ReactDOM from 'react-dom'; -import 'symbol-observable'; // TODO Remove this once https://github.com/acdlite/recompose/pull/660 is merged +import light from '@parity/light.js'; import App from './App'; -import light from './light.js'; import provider from './provider'; light.setProvider(provider); diff --git a/packages/light.js/example/src/light.js b/packages/light.js/example/src/light.js deleted file mode 120000 index 58677ddb..00000000 --- a/packages/light.js/example/src/light.js +++ /dev/null @@ -1 +0,0 @@ -../../lib \ No newline at end of file diff --git a/packages/light.js/example/yarn.lock b/packages/light.js/example/yarn.lock index c4bf3ada..3998bb77 100644 --- a/packages/light.js/example/yarn.lock +++ b/packages/light.js/example/yarn.lock @@ -2,51 +2,29 @@ # yarn lockfile v1 -"@parity/abi@~2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@parity/abi/-/abi-2.1.4.tgz#23e2b9e6d37a54035b76d941d6d74b9c5d21fb99" - dependencies: - bignumber.js "4.1.0" - js-sha3 "0.5.5" - utf8 "^2.1.2" - -"@parity/api@^2.1.24": - version "2.1.24" - resolved "https://registry.yarnpkg.com/@parity/api/-/api-2.1.24.tgz#e04ca177598354b435b83c8cfe7c7c3672bf3e44" - dependencies: - "@parity/abi" "~2.1.4" - "@parity/jsonrpc" "2.1.x" - "@parity/wordlist" "1.1.x" - bignumber.js "4.1.0" - blockies "0.0.2" - es6-error "4.0.2" - es6-promise "^4.1.1" - eventemitter3 "^2.0.2" - isomorphic-fetch "^2.2.1" - js-sha3 "0.5.5" - lodash "^4.17.4" - store "^2.0.12" - websocket "^1.0.25" +"@parity/api@../../": + version "0.0.0" -"@parity/jsonrpc@2.1.x": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@parity/jsonrpc/-/jsonrpc-2.1.6.tgz#260bbe7dfcec18d59f0bf1668dfd6021452d6452" +"@parity/light.js-react@../../": + version "0.0.0" -"@parity/wordlist@1.1.x": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@parity/wordlist/-/wordlist-1.1.0.tgz#9e9ed3ab7837f5633b5844e60a355e9e63e427ae" +"@parity/light.js@../../": + version "0.0.0" abab@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@~1.3.4, accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: mime-types "~2.1.18" negotiator "0.6.1" @@ -54,48 +32,58 @@ accepts@~1.3.4, accepts@~1.3.5: acorn-dynamic-import@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ= dependencies: acorn "^4.0.3" acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= dependencies: acorn "^4.0.4" acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= dependencies: acorn "^3.0.4" acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= acorn@^4.0.3, acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= acorn@^5.0.0, acorn@^5.5.0: version "5.5.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" + integrity sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ== address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" + integrity sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg== ajv-keywords@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= ajv-keywords@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -105,6 +93,7 @@ ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.0: ajv@^6.0.1: version "6.4.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" + integrity sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y= dependencies: fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" @@ -114,6 +103,7 @@ ajv@^6.0.1: align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -122,50 +112,61 @@ align-text@^0.1.1, align-text@^0.1.3: alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= dependencies: string-width "^2.0.0" ansi-escapes@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= ansi-regex@^2.0.0, ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.0.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" @@ -173,6 +174,7 @@ anymatch@^1.3.0: anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" @@ -180,16 +182,19 @@ anymatch@^2.0.0: append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= dependencies: default-require-extensions "^1.0.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -197,12 +202,14 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" aria-query@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" + integrity sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4= dependencies: ast-types-flow "0.0.7" commander "^2.11.0" @@ -210,44 +217,54 @@ aria-query@^0.7.0: arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= array-includes@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= dependencies: define-properties "^1.1.2" es-abstract "^1.7.0" @@ -255,40 +272,49 @@ array-includes@^3.0.3: array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= array-reduce@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" @@ -297,50 +323,61 @@ asn1.js@^4.0.0: asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= dependencies: util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= ast-types-flow@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.1.2, async@^2.1.4, async@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== dependencies: lodash "^4.14.0" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + integrity sha1-ri1acpR38onWDdf5amMUoi3Wwio= autoprefixer@7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.6.tgz#fb933039f74af74a83e71225ce78d9fd58ba84d7" + integrity sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA== dependencies: browserslist "^2.5.1" caniuse-lite "^1.0.30000748" @@ -352,6 +389,7 @@ autoprefixer@7.1.6: autoprefixer@^6.3.1: version "6.7.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= dependencies: browserslist "^1.7.6" caniuse-db "^1.0.30000634" @@ -363,20 +401,24 @@ autoprefixer@^6.3.1: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + integrity sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w== axobject-query@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" + integrity sha1-YvWdvFnJ+SQnWco0mWDnov48NsA= dependencies: ast-types-flow "0.0.7" babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -385,6 +427,7 @@ babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, bab babel-core@6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + integrity sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g= dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -409,6 +452,7 @@ babel-core@6.26.0: babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -433,6 +477,7 @@ babel-core@^6.0.0, babel-core@^6.26.0: babel-eslint@7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" + integrity sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc= dependencies: babel-code-frame "^6.22.0" babel-traverse "^6.23.1" @@ -442,6 +487,7 @@ babel-eslint@7.2.3: babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -455,6 +501,7 @@ babel-generator@^6.18.0, babel-generator@^6.26.0: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -463,6 +510,7 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-builder-react-jsx@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -471,6 +519,7 @@ babel-helper-builder-react-jsx@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -480,6 +529,7 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -489,6 +539,7 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -497,6 +548,7 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -507,6 +559,7 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -514,6 +567,7 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -521,6 +575,7 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -528,6 +583,7 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -536,6 +592,7 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -546,6 +603,7 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -557,6 +615,7 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -564,6 +623,7 @@ babel-helpers@^6.24.1: babel-jest@20.0.3, babel-jest@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671" + integrity sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE= dependencies: babel-core "^6.0.0" babel-plugin-istanbul "^4.0.0" @@ -572,6 +632,7 @@ babel-jest@20.0.3, babel-jest@^20.0.3: babel-loader@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" + integrity sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A== dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" @@ -580,18 +641,21 @@ babel-loader@7.1.2: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-dynamic-import-node@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz#bd1d88ac7aaf98df4917c384373b04d971a2b37a" + integrity sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ== dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" babel-template "^6.26.0" @@ -600,6 +664,7 @@ babel-plugin-dynamic-import-node@1.1.0: babel-plugin-istanbul@^4.0.0: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== dependencies: babel-plugin-syntax-object-rest-spread "^6.13.0" find-up "^2.1.0" @@ -609,46 +674,57 @@ babel-plugin-istanbul@^4.0.0: babel-plugin-jest-hoist@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767" + integrity sha1-r+3IU70/jcNUjqZx++adA8wsF2c= babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-class-properties@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= babel-plugin-syntax-decorators@^6.1.18: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + integrity sha1-MSVjtNvePMgGzuPkFszurd0RrAs= babel-plugin-syntax-dynamic-import@6.18.0, babel-plugin-syntax-dynamic-import@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-flow@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0= babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -657,6 +733,7 @@ babel-plugin-transform-async-to-generator@^6.22.0: babel-plugin-transform-class-properties@6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= dependencies: babel-helper-function-name "^6.24.1" babel-plugin-syntax-class-properties "^6.8.0" @@ -666,6 +743,7 @@ babel-plugin-transform-class-properties@6.24.1: babel-plugin-transform-decorators-legacy@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" + integrity sha1-dBtY9sW86eYCfgiC2cmU8E82aSU= dependencies: babel-plugin-syntax-decorators "^6.1.18" babel-runtime "^6.2.0" @@ -674,18 +752,21 @@ babel-plugin-transform-decorators-legacy@1.3.4: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -696,6 +777,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -710,6 +792,7 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-plugin-transform-es2015-computed-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -717,12 +800,14 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0: babel-plugin-transform-es2015-destructuring@6.23.0, babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -730,12 +815,14 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0: babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -744,12 +831,14 @@ babel-plugin-transform-es2015-function-name@^6.22.0: babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -758,6 +847,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -767,6 +857,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -775,6 +866,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-plugin-transform-es2015-modules-umd@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -783,6 +875,7 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-plugin-transform-es2015-object-super@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -790,6 +883,7 @@ babel-plugin-transform-es2015-object-super@^6.22.0: babel-plugin-transform-es2015-parameters@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -801,6 +895,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-plugin-transform-es2015-shorthand-properties@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -808,12 +903,14 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0: babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -822,18 +919,21 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0: babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -842,6 +942,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-plugin-transform-exponentiation-operator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -850,6 +951,7 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-transform-flow-strip-types@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988= dependencies: babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.22.0" @@ -857,6 +959,7 @@ babel-plugin-transform-flow-strip-types@^6.22.0: babel-plugin-transform-object-rest-spread@6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.26.0" @@ -864,18 +967,21 @@ babel-plugin-transform-object-rest-spread@6.26.0: babel-plugin-transform-react-constant-elements@6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz#2f119bf4d2cdd45eb9baaae574053c604f6147dd" + integrity sha1-LxGb9NLN1F65uqrldAU8YE9hR90= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-react-display-name@^6.23.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-react-jsx-self@6.22.0, babel-plugin-transform-react-jsx-self@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + integrity sha1-322AqdomEqEh5t3XVYvL7PBuY24= dependencies: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" @@ -883,6 +989,7 @@ babel-plugin-transform-react-jsx-self@6.22.0, babel-plugin-transform-react-jsx-s babel-plugin-transform-react-jsx-source@6.22.0, babel-plugin-transform-react-jsx-source@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY= dependencies: babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" @@ -890,6 +997,7 @@ babel-plugin-transform-react-jsx-source@6.22.0, babel-plugin-transform-react-jsx babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM= dependencies: babel-helper-builder-react-jsx "^6.24.1" babel-plugin-syntax-jsx "^6.8.0" @@ -898,18 +1006,21 @@ babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24. babel-plugin-transform-regenerator@6.26.0, babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-runtime@6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + integrity sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -917,6 +1028,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-preset-env@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -952,18 +1064,21 @@ babel-preset-env@1.6.1: babel-preset-flow@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + integrity sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0= dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" babel-preset-jest@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a" + integrity sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o= dependencies: babel-plugin-jest-hoist "^20.0.3" babel-preset-react-app@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.1.tgz#d3f06a79742f0e89d7afcb72e282d9809c850920" + integrity sha512-9fRHopNaGL5ScRZdPSoyxRaABKmkS2fx0HUJ5Yphan5G8QDFD7lETsPyY7El6b7YPT3sNrw9gfrWzl4/LsJcfA== dependencies: babel-plugin-dynamic-import-node "1.1.0" babel-plugin-syntax-dynamic-import "6.18.0" @@ -982,6 +1097,7 @@ babel-preset-react-app@^3.1.1: babel-preset-react@6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + integrity sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A= dependencies: babel-plugin-syntax-jsx "^6.3.13" babel-plugin-transform-react-display-name "^6.23.0" @@ -993,6 +1109,7 @@ babel-preset-react@6.24.1: babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -1005,6 +1122,7 @@ babel-register@^6.26.0: babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -1012,6 +1130,7 @@ babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -1022,6 +1141,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-te babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -1036,6 +1156,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-tr babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -1045,22 +1166,27 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24 babylon@^6.17.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1073,40 +1199,39 @@ base@^0.11.1: batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + integrity sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40= dependencies: tweetnacl "^0.14.3" big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - -bignumber.js@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -blockies@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/blockies/-/blockies-0.0.2.tgz#22ad58da4f6b382bc79bf4386c5820c70047e4ed" + integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= bluebird@^3.4.7: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + integrity sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ= dependencies: bytes "3.0.0" content-type "~1.0.4" @@ -1122,6 +1247,7 @@ body-parser@1.18.2: bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= dependencies: array-flatten "^2.1.0" deep-equal "^1.0.1" @@ -1133,22 +1259,26 @@ bonjour@^3.5.0: boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= dependencies: hoek "4.x.x" boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== dependencies: hoek "4.x.x" boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" @@ -1161,6 +1291,7 @@ boxen@^1.2.1: brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1168,6 +1299,7 @@ brace-expansion@^1.0.0, brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1176,6 +1308,7 @@ braces@^1.8.2: braces@^2.3.0, braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1191,16 +1324,19 @@ braces@^2.3.0, braces@^2.3.1: brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-resolve@^1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + integrity sha1-j/CbCixCFxihBRwmCzLkj0QpOM4= dependencies: resolve "1.1.7" browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1212,6 +1348,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" @@ -1220,6 +1357,7 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" + integrity sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" @@ -1228,6 +1366,7 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1235,6 +1374,7 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1247,12 +1387,14 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= dependencies: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" @@ -1260,6 +1402,7 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: browserslist@^2.1.2, browserslist@^2.5.1: version "2.11.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== dependencies: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" @@ -1267,30 +1410,36 @@ browserslist@^2.1.2, browserslist@^2.5.1: bser@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + integrity sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk= dependencies: node-int64 "^0.4.0" bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + integrity sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA== buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1299,18 +1448,22 @@ buffer@^4.3.0: builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1325,20 +1478,24 @@ cache-base@^1.0.1: caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= dependencies: no-case "^2.2.0" upper-case "^1.1.1" @@ -1346,6 +1503,7 @@ camel-case@3.0.x: camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" @@ -1353,22 +1511,27 @@ camelcase-keys@^2.0.0: camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= dependencies: browserslist "^1.3.6" caniuse-db "^1.0.30000529" @@ -1378,26 +1541,32 @@ caniuse-api@^1.5.2: caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000833" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000833.tgz#2bd7be72a401658d2cbcb8f4d7600deebeb1c676" + integrity sha1-K9e+cqQBZY0svLj012AN7r6xxnY= caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000792: version "1.0.30000833" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000833.tgz#98e84fcdb4399c6fa0b0fd41490d3217ac7802b4" + integrity sha512-tKNuKu4WLImh4NxoTgntxFpDrRiA0Q6Q1NycNhuMST0Kx+Pt8YnRDW6V8xsyH6AtO2CpAoibatEk5eaEhP3O1g== capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + integrity sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0= case-sensitive-paths-webpack-plugin@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz#3d29ced8c1f124bf6f53846fb3f5894731fdc909" + integrity sha1-PSnO2MHxJL9vU4Rvs/WJRzH9yQk= caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" @@ -1405,6 +1574,7 @@ center-align@^0.1.1: chalk@1.1.3, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1415,6 +1585,7 @@ chalk@1.1.3, chalk@^1.1.3: chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1423,10 +1594,12 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -1442,6 +1615,7 @@ chokidar@^1.6.0: chokidar@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" + integrity sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg== dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -1460,14 +1634,17 @@ chokidar@^2.0.2: chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= ci-info@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" + integrity sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -1475,16 +1652,19 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" + integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== dependencies: chalk "^1.1.3" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1494,26 +1674,31 @@ class-utils@^0.3.5: clean-css@4.1.x: version "4.1.11" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" + integrity sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo= dependencies: source-map "0.5.x" cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" @@ -1522,6 +1707,7 @@ cliui@^2.1.0: cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -1530,24 +1716,29 @@ cliui@^3.2.0: clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= coa@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" + integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= dependencies: q "^1.1.2" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -1555,22 +1746,26 @@ collection-visit@^1.0.0: color-convert@^1.3.0, color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== dependencies: color-name "^1.1.1" color-name@^1.0.0, color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-string@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= dependencies: color-name "^1.0.0" color@^0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= dependencies: clone "^1.0.2" color-convert "^1.3.0" @@ -1579,6 +1774,7 @@ color@^0.11.0: colormin@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= dependencies: color "^0.11.0" css-color-names "0.0.4" @@ -1587,38 +1783,46 @@ colormin@^1.0.5: colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= combined-stream@1.0.6, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= dependencies: delayed-stream "~1.0.0" commander@2.15.x, commander@^2.11.0, commander@~2.15.0: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= compare-versions@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5" + integrity sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ== component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= compressible@~2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" + integrity sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k= dependencies: mime-db ">= 1.33.0 < 2" compression@^1.5.2: version "1.7.2" resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + integrity sha1-qv+81qr4VLROuygDU9WtFlH1mmk= dependencies: accepts "~1.3.4" bytes "3.0.0" @@ -1631,10 +1835,12 @@ compression@^1.5.2: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" @@ -1644,6 +1850,7 @@ concat-stream@^1.6.0: configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1655,68 +1862,84 @@ configstore@^3.0.0: connect-history-api-fallback@^1.3.0: version "1.5.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + integrity sha1-sGhzk0vF40T+9hGhlqb6rgruAVo= console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ== content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.4.0, core-js@^2.5.0: version "2.5.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" + integrity sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs= core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892" + integrity sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A== dependencies: is-directory "^0.3.1" js-yaml "^3.4.3" @@ -1729,6 +1952,7 @@ cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: create-ecdh@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.1.tgz#44223dfed533193ba5ba54e0df5709b89acf1f82" + integrity sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" @@ -1736,12 +1960,14 @@ create-ecdh@^4.0.0: create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= dependencies: capture-stack-trace "^1.0.0" create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -1752,6 +1978,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -1763,6 +1990,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -1771,12 +1999,14 @@ cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= dependencies: boom "5.x.x" crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -1793,14 +2023,17 @@ crypto-browserify@^3.11.0: crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= css-loader@0.28.7: version "0.28.7" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.7.tgz#5f2ee989dd32edd907717f953317656160999c1b" + integrity sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg== dependencies: babel-code-frame "^6.11.0" css-selector-tokenizer "^0.7.0" @@ -1820,6 +2053,7 @@ css-loader@0.28.7: css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= dependencies: boolbase "~1.0.0" css-what "2.1" @@ -1829,6 +2063,7 @@ css-select@^1.1.0: css-selector-tokenizer@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" + integrity sha1-5piEdK6MlTR3v15+/s/OzNnPTIY= dependencies: cssesc "^0.1.0" fastparse "^1.1.1" @@ -1837,14 +2072,17 @@ css-selector-tokenizer@^0.7.0: css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= "cssnano@>=2.6.1 <4": version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= dependencies: autoprefixer "^6.3.1" decamelize "^1.1.2" @@ -1882,6 +2120,7 @@ cssesc@^0.1.0: csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= dependencies: clap "^1.0.9" source-map "^0.5.3" @@ -1889,80 +2128,96 @@ csso@~2.3.1: cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + integrity sha1-uANhcMefB6kP8vFuIihAJ6JDhIs= "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + integrity sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ= dependencies: cssom "0.3.x" currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" d@1: version "1.0.0" resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= dependencies: es5-ext "^0.10.9" damerau-levenshtein@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" + integrity sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.0.1, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= deep-extend@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" + integrity sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w== deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= dependencies: strip-bom "^2.0.0" define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + integrity sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ= dependencies: foreach "^2.0.5" object-keys "^1.0.8" @@ -1970,18 +2225,21 @@ define-properties@^1.1.2: define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -1989,10 +2247,12 @@ define-property@^2.0.2: defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= del@^2.0.2, del@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2005,6 +2265,7 @@ del@^2.0.2, del@^2.2.2: del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= dependencies: globby "^6.1.0" is-path-cwd "^1.0.0" @@ -2016,22 +2277,27 @@ del@^3.0.0: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2039,24 +2305,29 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + integrity sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc= detect-port-alt@1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== dependencies: address "^1.0.1" debug "^2.6.0" @@ -2064,10 +2335,12 @@ detect-port-alt@1.1.6: diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -2076,10 +2349,12 @@ diffie-hellman@^5.0.0: dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -2087,12 +2362,14 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= dependencies: buffer-indexof "^1.0.0" doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= dependencies: esutils "^2.0.2" isarray "^1.0.0" @@ -2100,18 +2377,21 @@ doctrine@1.5.0: doctrine@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dom-converter@~0.1: version "0.1.4" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" + integrity sha1-pF71cnuJDJv/5tfIduexnLDhfzs= dependencies: utila "~0.3" dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= dependencies: domelementtype "~1.1.1" entities "~1.1.1" @@ -2119,36 +2399,43 @@ dom-serializer@0: dom-urls@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/dom-urls/-/dom-urls-1.1.0.tgz#001ddf81628cd1e706125c7176f53ccec55d918e" + integrity sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4= dependencies: urijs "^1.16.1" domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domelementtype@1: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= domhandler@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + integrity sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ= dependencies: domelementtype "1" domutils@1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + integrity sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU= dependencies: domelementtype "1" domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= dependencies: dom-serializer "0" domelementtype "1" @@ -2156,42 +2443,51 @@ domutils@1.5.1: dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" dotenv-expand@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" + integrity sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU= dotenv@4.0.0, dotenv@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + integrity sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0= duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= dependencies: jsbn "~0.1.0" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: version "1.3.45" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz#458ac1b1c5c760ce8811a16d2bfbd97ec30bafb8" + integrity sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g= elliptic@^6.0.0: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + integrity sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8= dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2204,24 +2500,29 @@ elliptic@^6.0.0: emoji-regex@^6.1.0: version "6.5.1" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" + integrity sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ== emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" enhanced-resolve@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" @@ -2231,22 +2532,26 @@ enhanced-resolve@^3.4.0: entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== dependencies: prr "~1.0.1" error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= dependencies: is-arrayish "^0.2.1" es-abstract@^1.7.0: version "1.11.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" + integrity sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA== dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -2257,6 +2562,7 @@ es-abstract@^1.7.0: es-to-primitive@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + integrity sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0= dependencies: is-callable "^1.1.1" is-date-object "^1.0.1" @@ -2265,18 +2571,16 @@ es-to-primitive@^1.1.1: es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.42" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.42.tgz#8c07dd33af04d5dcd1310b5cef13bea63a89ba8d" + integrity sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA== dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" next-tick "1" -es6-error@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.0.2.tgz#eec5c726eacef51b7f6b73c20db6e1b13b069c98" - es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" es5-ext "^0.10.35" @@ -2285,6 +2589,7 @@ es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: es6-map@^0.1.3: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= dependencies: d "1" es5-ext "~0.10.14" @@ -2293,13 +2598,15 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" -es6-promise@^4.0.5, es6-promise@^4.1.1: +es6-promise@^4.0.5: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + integrity sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ== es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= dependencies: d "1" es5-ext "~0.10.14" @@ -2310,6 +2617,7 @@ es6-set@~0.1.5: es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= dependencies: d "1" es5-ext "~0.10.14" @@ -2317,6 +2625,7 @@ es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: es6-weak-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= dependencies: d "1" es5-ext "^0.10.14" @@ -2326,14 +2635,17 @@ es6-weak-map@^2.0.1: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@^1.6.1: version "1.9.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2345,6 +2657,7 @@ escodegen@^1.6.1: escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= dependencies: es6-map "^0.1.3" es6-weak-map "^2.0.1" @@ -2354,10 +2667,12 @@ escope@^3.6.0: eslint-config-react-app@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz#23c909f71cbaff76b945b831d2d814b8bde169eb" + integrity sha512-8QZrKWuHVC57Fmu+SsKAVxnI9LycZl7NFQ4H9L+oeISuCXhYdXqsOOIVSjQFW6JF5MXZLFE+21Syhd7mF1IRZQ== eslint-import-resolver-node@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== dependencies: debug "^2.6.9" resolve "^1.5.0" @@ -2365,6 +2680,7 @@ eslint-import-resolver-node@^0.3.1: eslint-loader@1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.9.0.tgz#7e1be9feddca328d3dcfaef1ad49d5beffe83a13" + integrity sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg== dependencies: loader-fs-cache "^1.0.0" loader-utils "^1.0.2" @@ -2375,6 +2691,7 @@ eslint-loader@1.9.0: eslint-module-utils@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= dependencies: debug "^2.6.8" pkg-dir "^1.0.0" @@ -2382,12 +2699,14 @@ eslint-module-utils@^2.1.1: eslint-plugin-flowtype@2.39.1: version "2.39.1" resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz#b5624622a0388bcd969f4351131232dcb9649cd5" + integrity sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA== dependencies: lodash "^4.15.0" eslint-plugin-import@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz#fa1b6ef31fcb3c501c09859c1b86f1fc5b986894" + integrity sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g== dependencies: builtin-modules "^1.1.1" contains-path "^0.1.0" @@ -2403,6 +2722,7 @@ eslint-plugin-import@2.8.0: eslint-plugin-jsx-a11y@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1" + integrity sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ== dependencies: aria-query "^0.7.0" array-includes "^3.0.3" @@ -2415,6 +2735,7 @@ eslint-plugin-jsx-a11y@5.1.1: eslint-plugin-react@7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz#300a95861b9729c087d362dd64abcc351a74364a" + integrity sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA== dependencies: doctrine "^2.0.0" has "^1.0.1" @@ -2424,6 +2745,7 @@ eslint-plugin-react@7.4.0: eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2431,6 +2753,7 @@ eslint-scope@^3.7.1: eslint@4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.10.0.tgz#f25d0d7955c81968c2309aa5c9a229e045176bb7" + integrity sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA== dependencies: ajv "^5.2.0" babel-code-frame "^6.22.0" @@ -2473,6 +2796,7 @@ eslint@4.10.0: espree@^3.5.1: version "3.5.4" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== dependencies: acorn "^5.5.0" acorn-jsx "^3.0.0" @@ -2480,67 +2804,76 @@ espree@^3.5.1: esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + integrity sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw== esquery@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= event-emitter@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= dependencies: d "1" es5-ext "~0.10.14" -eventemitter3@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" - eventemitter3@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= eventsource@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + integrity sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI= dependencies: original ">=0.0.5" evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" @@ -2548,12 +2881,14 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: exec-sh@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + integrity sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg== dependencies: merge "^1.1.3" execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2566,12 +2901,14 @@ execa@^0.7.0: expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2584,18 +2921,21 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: homedir-polyfill "^1.0.1" express@^4.13.3: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + integrity sha1-avilAjUNsyRuzEvs9rWjTSL37VM= dependencies: accepts "~1.3.5" array-flatten "1.1.1" @@ -2631,12 +2971,14 @@ express@^4.13.3: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -2644,10 +2986,12 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -2656,12 +3000,14 @@ external-editor@^2.0.4: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -2675,6 +3021,7 @@ extglob@^2.0.4: extract-text-webpack-plugin@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7" + integrity sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ== dependencies: async "^2.4.1" loader-utils "^1.1.0" @@ -2684,54 +3031,65 @@ extract-text-webpack-plugin@3.0.2: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + integrity sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg= faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" faye-websocket@~0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= dependencies: websocket-driver ">=0.5.1" fb-watchman@^1.8.0: version "1.9.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + integrity sha1-okz0eCf4LTj7Waaa1wt247auc4M= dependencies: bser "1.0.2" fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: bser "^2.0.0" fbjs@^0.8.16: version "0.8.16" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + integrity sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s= dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -2744,12 +3102,14 @@ fbjs@^0.8.16: figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -2757,6 +3117,7 @@ file-entry-cache@^2.0.0: file-loader@1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.5.tgz#91c25b6b6fbe56dae99f10a425fd64933b5c9daa" + integrity sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ== dependencies: loader-utils "^1.0.2" schema-utils "^0.3.0" @@ -2764,10 +3125,12 @@ file-loader@1.1.5: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fileset@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= dependencies: glob "^7.0.3" minimatch "^3.0.3" @@ -2775,10 +3138,12 @@ fileset@^2.0.2: filesize@3.5.11: version "3.5.11" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" + integrity sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g== fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + integrity sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM= dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -2789,6 +3154,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -2798,6 +3164,7 @@ fill-range@^4.0.0: finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -2810,6 +3177,7 @@ finalhandler@1.1.1: find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= dependencies: commondir "^1.0.1" mkdirp "^0.5.1" @@ -2818,6 +3186,7 @@ find-cache-dir@^0.1.1: find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= dependencies: commondir "^1.0.1" make-dir "^1.0.0" @@ -2826,6 +3195,7 @@ find-cache-dir@^1.0.0: find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -2833,12 +3203,14 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= dependencies: circular-json "^0.3.1" del "^2.0.2" @@ -2848,34 +3220,41 @@ flat-cache@^1.2.1: flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= follow-redirects@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa" + integrity sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg== dependencies: debug "^3.1.0" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= dependencies: asynckit "^0.4.0" combined-stream "1.0.6" @@ -2884,20 +3263,24 @@ form-data@~2.3.1: forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-extra@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" @@ -2906,6 +3289,7 @@ fs-extra@3.0.1: fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -2916,16 +3300,19 @@ fs-extra@^0.30.0: fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.0.0, fsevents@^1.1.2, fsevents@^1.1.3: version "1.2.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.3.tgz#08292982e7059f6674c93d8b829c1e8604979ac0" + integrity sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q== dependencies: nan "^2.9.2" node-pre-gyp "^0.9.0" @@ -2933,14 +3320,17 @@ fsevents@^1.0.0, fsevents@^1.1.2, fsevents@^1.1.3: function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -2954,28 +3344,34 @@ gauge@~2.7.3: get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -2983,12 +3379,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -2996,6 +3394,7 @@ glob-parent@^3.1.0: glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3007,12 +3406,14 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= dependencies: ini "^1.3.4" global-modules@1.0.0, global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: global-prefix "^1.0.1" is-windows "^1.0.1" @@ -3021,6 +3422,7 @@ global-modules@1.0.0, global-modules@^1.0.0: global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: expand-tilde "^2.0.2" homedir-polyfill "^1.0.1" @@ -3031,10 +3433,12 @@ global-prefix@^1.0.1: globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -3046,6 +3450,7 @@ globby@^5.0.0: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -3056,6 +3461,7 @@ globby@^6.1.0: got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" @@ -3072,24 +3478,29 @@ got@^6.7.1: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= gzip-size@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + integrity sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA= dependencies: duplexer "^0.1.1" handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= handlebars@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= dependencies: async "^1.4.0" optimist "^0.6.1" @@ -3100,10 +3511,12 @@ handlebars@^4.0.3: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= dependencies: ajv "^5.1.0" har-schema "^2.0.0" @@ -3111,28 +3524,34 @@ har-validator@~5.0.3: has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3141,6 +3560,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3149,10 +3569,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -3160,12 +3582,14 @@ has-values@^1.0.0: has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + integrity sha1-hGFzP1OLCDfJNh45qauelwTcLyg= dependencies: function-bind "^1.0.2" hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -3173,6 +3597,7 @@ hash-base@^3.0.0: hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.3" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.0" @@ -3180,6 +3605,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== dependencies: boom "4.x.x" cryptiles "3.x.x" @@ -3189,10 +3615,12 @@ hawk@~6.0.2: he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= history@^4.7.2: version "4.7.2" resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" + integrity sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA== dependencies: invariant "^2.2.1" loose-envify "^1.2.0" @@ -3203,6 +3631,7 @@ history@^4.7.2: hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -3211,14 +3640,17 @@ hmac-drbg@^1.0.0: hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== hoist-non-react-statics@^2.5.0: version "2.5.5" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -3226,16 +3658,19 @@ home-or-tmp@^2.0.0: homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= dependencies: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + integrity sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw== hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -3245,20 +3680,24 @@ hpack.js@^2.1.6: html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + integrity sha1-ZouTd26q5V696POtRkswekljYl4= html-encoding-sniffer@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= html-minifier@^3.2.3: version "3.5.15" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.15.tgz#f869848d4543cbfd84f26d5514a2a87cbf9a05e0" + integrity sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw== dependencies: camel-case "3.0.x" clean-css "4.1.x" @@ -3271,6 +3710,7 @@ html-minifier@^3.2.3: html-webpack-plugin@2.29.0: version "2.29.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz#e987f421853d3b6938c8c4c8171842e5fd17af23" + integrity sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM= dependencies: bluebird "^3.4.7" html-minifier "^3.2.3" @@ -3282,6 +3722,7 @@ html-webpack-plugin@2.29.0: htmlparser2@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + integrity sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4= dependencies: domelementtype "1" domhandler "2.1" @@ -3291,10 +3732,12 @@ htmlparser2@~3.3.0: http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= http-errors@1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= dependencies: depd "1.1.1" inherits "2.0.3" @@ -3304,6 +3747,7 @@ http-errors@1.6.2: http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: depd "~1.1.2" inherits "2.0.3" @@ -3313,10 +3757,12 @@ http-errors@~1.6.2: http-parser-js@>=0.4.0: version "0.4.12" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.12.tgz#b9cfbf4a2cf26f0fc34b10ca1489a27771e3474f" + integrity sha1-uc+/Sizybw/DSxDKFImid3HjR08= http-proxy-middleware@~0.17.4: version "0.17.4" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" + integrity sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM= dependencies: http-proxy "^1.16.2" is-glob "^3.1.0" @@ -3326,6 +3772,7 @@ http-proxy-middleware@~0.17.4: http-proxy@^1.16.2: version "1.17.0" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== dependencies: eventemitter3 "^3.0.0" follow-redirects "^1.0.0" @@ -3334,6 +3781,7 @@ http-proxy@^1.16.2: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -3342,48 +3790,58 @@ http-signature@~1.2.0: https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.21" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" + integrity sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw== dependencies: safer-buffer "^2.1.0" icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= icss-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= dependencies: postcss "^6.0.1" ieee754@^1.1.4: version "1.1.11" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.11.tgz#c16384ffe00f5b7835824e67b6f2bd44a5229455" + integrity sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg== ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" ignore@^3.3.3: version "3.3.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" + integrity sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg== import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= import-local@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8" + integrity sha1-sReVcqrNwRxqkQCftDDbyrX2aKg= dependencies: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" @@ -3391,24 +3849,29 @@ import-local@^0.1.1: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -3416,18 +3879,22 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inquirer@3.3.0, inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -3447,96 +3914,115 @@ inquirer@3.3.0, inquirer@^3.0.6: internal-ip@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + integrity sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w= dependencies: meow "^3.3.0" interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= ipaddr.js@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" + integrity sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs= is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + integrity sha1-hut1OSgF3cM69xySoO7fdO52BLI= is-ci@^1.0.10: version "1.1.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + integrity sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg== dependencies: ci-info "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -3545,6 +4031,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -3553,72 +4040,86 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= dependencies: is-extglob "^2.1.1" is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= dependencies: global-dirs "^0.1.0" is-path-inside "^1.0.0" @@ -3626,148 +4127,180 @@ is-installed-globally@^0.1.0: is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-odd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + integrity sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ== dependencies: is-number "^4.0.0" is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= is-root@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" + integrity sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU= is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= dependencies: html-comment-regex "^1.1.0" is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + integrity sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: +isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" @@ -3775,10 +4308,12 @@ isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-api@^1.1.1: version "1.3.1" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" + integrity sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g== dependencies: async "^2.1.4" compare-versions "^3.1.0" @@ -3796,16 +4331,19 @@ istanbul-api@^1.1.1: istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" + integrity sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A== istanbul-lib-hook@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" + integrity sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ== dependencies: append-transform "^0.4.0" istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.4.2: version "1.10.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" + integrity sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ== dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" @@ -3818,6 +4356,7 @@ istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.4.2: istanbul-lib-report@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" + integrity sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA== dependencies: istanbul-lib-coverage "^1.2.0" mkdirp "^0.5.1" @@ -3827,6 +4366,7 @@ istanbul-lib-report@^1.1.4: istanbul-lib-source-maps@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" + integrity sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA== dependencies: debug "^3.1.0" istanbul-lib-coverage "^1.1.2" @@ -3837,6 +4377,7 @@ istanbul-lib-source-maps@^1.1.0: istanbul-lib-source-maps@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" + integrity sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg== dependencies: debug "^3.1.0" istanbul-lib-coverage "^1.2.0" @@ -3847,16 +4388,19 @@ istanbul-lib-source-maps@^1.2.4: istanbul-reports@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" + integrity sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA== dependencies: handlebars "^4.0.3" jest-changed-files@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8" + integrity sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g= jest-cli@^20.0.4: version "20.0.4" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93" + integrity sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM= dependencies: ansi-escapes "^1.4.0" callsites "^2.0.0" @@ -3892,6 +4436,7 @@ jest-cli@^20.0.4: jest-config@^20.0.4: version "20.0.4" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea" + integrity sha1-43kwqyIXyRNgXv8T5712PsSPruo= dependencies: chalk "^1.1.3" glob "^7.1.1" @@ -3907,6 +4452,7 @@ jest-config@^20.0.4: jest-diff@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617" + integrity sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc= dependencies: chalk "^1.1.3" diff "^3.2.0" @@ -3916,10 +4462,12 @@ jest-diff@^20.0.3: jest-docblock@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712" + integrity sha1-F76phDQswz2DxQ++FUXqDvqkRxI= jest-environment-jsdom@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99" + integrity sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk= dependencies: jest-mock "^20.0.3" jest-util "^20.0.3" @@ -3928,6 +4476,7 @@ jest-environment-jsdom@^20.0.3: jest-environment-node@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403" + integrity sha1-1Ii8RhKvLCRumG6K52caCZFj1AM= dependencies: jest-mock "^20.0.3" jest-util "^20.0.3" @@ -3935,6 +4484,7 @@ jest-environment-node@^20.0.3: jest-haste-map@^20.0.4: version "20.0.5" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112" + integrity sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q== dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" @@ -3946,6 +4496,7 @@ jest-haste-map@^20.0.4: jest-jasmine2@^20.0.4: version "20.0.4" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1" + integrity sha1-/MWxQReA2RHQQpAu8YWehS5g1eE= dependencies: chalk "^1.1.3" graceful-fs "^4.1.11" @@ -3960,6 +4511,7 @@ jest-jasmine2@^20.0.4: jest-matcher-utils@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612" + integrity sha1-s6a443yld4A7CDKpixZPRLeBVhI= dependencies: chalk "^1.1.3" pretty-format "^20.0.3" @@ -3967,6 +4519,7 @@ jest-matcher-utils@^20.0.3: jest-matchers@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60" + integrity sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA= dependencies: jest-diff "^20.0.3" jest-matcher-utils "^20.0.3" @@ -3976,6 +4529,7 @@ jest-matchers@^20.0.3: jest-message-util@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c" + integrity sha1-auwoRDBvyw5udNV5bBAG2W/dgxw= dependencies: chalk "^1.1.3" micromatch "^2.3.11" @@ -3984,20 +4538,24 @@ jest-message-util@^20.0.3: jest-mock@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59" + integrity sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk= jest-regex-util@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762" + integrity sha1-hburXRM+RGJbGfr4xqpRItCF12I= jest-resolve-dependencies@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a" + integrity sha1-bhSntxevDyyzZnxUneQK8Bexcjo= dependencies: jest-regex-util "^20.0.3" jest-resolve@^20.0.4: version "20.0.4" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5" + integrity sha1-lEiz6La6/BVHlETGSZBFt//ll6U= dependencies: browser-resolve "^1.11.2" is-builtin-module "^1.0.0" @@ -4006,6 +4564,7 @@ jest-resolve@^20.0.4: jest-runtime@^20.0.4: version "20.0.4" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8" + integrity sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg= dependencies: babel-core "^6.0.0" babel-jest "^20.0.3" @@ -4026,6 +4585,7 @@ jest-runtime@^20.0.4: jest-snapshot@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566" + integrity sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY= dependencies: chalk "^1.1.3" jest-diff "^20.0.3" @@ -4037,6 +4597,7 @@ jest-snapshot@^20.0.3: jest-util@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad" + integrity sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0= dependencies: chalk "^1.1.3" graceful-fs "^4.1.11" @@ -4049,6 +4610,7 @@ jest-util@^20.0.3: jest-validate@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab" + integrity sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs= dependencies: chalk "^1.1.3" jest-matcher-utils "^20.0.3" @@ -4058,28 +4620,29 @@ jest-validate@^20.0.3: jest@20.0.4: version "20.0.4" resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac" + integrity sha1-PdJgwpidba1nix6cxNkZRPbWAqw= dependencies: jest-cli "^20.0.4" js-base64@^2.1.9: version "2.4.3" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" - -js-sha3@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" + integrity sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw== js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1: version "3.11.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + integrity sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4087,6 +4650,7 @@ js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1: js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= dependencies: argparse "^1.0.7" esprima "^2.6.0" @@ -4094,10 +4658,12 @@ js-yaml@~3.7.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q= dependencies: abab "^1.0.3" acorn "^4.0.4" @@ -4122,60 +4688,73 @@ jsdom@^9.12.0: jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= optionalDependencies: graceful-fs "^4.1.6" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4185,66 +4764,79 @@ jsprim@^1.2.2: jsx-ast-utils@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + integrity sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE= jsx-ast-utils@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8= dependencies: array-includes "^3.0.3" killable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" + integrity sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms= kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= dependencies: package-json "^4.0.0" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4252,6 +4844,7 @@ levn@^0.3.0, levn@~0.3.0: load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4262,6 +4855,7 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4271,6 +4865,7 @@ load-json-file@^2.0.0: loader-fs-cache@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" + integrity sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw= dependencies: find-cache-dir "^0.1.1" mkdirp "0.5.1" @@ -4278,10 +4873,12 @@ loader-fs-cache@^1.0.0: loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + integrity sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI= loader-utils@^0.2.16: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= dependencies: big.js "^3.1.3" emojis-list "^2.0.0" @@ -4291,6 +4888,7 @@ loader-utils@^0.2.16: loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= dependencies: big.js "^3.1.3" emojis-list "^2.0.0" @@ -4299,6 +4897,7 @@ loader-utils@^1.0.2, loader-utils@^1.1.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4306,26 +4905,32 @@ locate-path@^2.0.0: lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + integrity sha1-9HGh2khr5g9quVXRcRVSPdHSVdU= lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" @@ -4333,40 +4938,48 @@ lodash.template@^4.4.0: lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: lodash._reinterpolate "~3.0.0" lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= "lodash@>=3.5 <5", lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= dependencies: js-tokens "^3.0.0" loose-envify@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -4374,14 +4987,17 @@ loud-rejection@^1.0.0: lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" + integrity sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -4389,40 +5005,48 @@ lru-cache@^4.0.1: macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" + integrity sha1-WQTcU3w57G2+/q6QIycTX6hRHxI= make-dir@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" + integrity sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw== dependencies: pify "^3.0.0" makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= md5.js@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + integrity sha1-6b296UogpawYsENA/Fdk1bCdkB0= dependencies: hash-base "^3.0.0" inherits "^2.0.1" @@ -4430,16 +5054,19 @@ md5.js@^1.3.4: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -4447,6 +5074,7 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: meow@^3.3.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -4462,18 +5090,22 @@ meow@^3.3.0, meow@^3.7.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -4492,6 +5124,7 @@ micromatch@^2.1.5, micromatch@^2.3.11: micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4510,6 +5143,7 @@ micromatch@^3.1.4, micromatch@^3.1.8: miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" @@ -4517,60 +5151,73 @@ miller-rabin@^4.0.0: "mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== dependencies: mime-db "~1.33.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mime@^1.4.1, mime@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= minimatch@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + integrity sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q= dependencies: brace-expansion "^1.0.0" minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= minipass@^2.2.1, minipass@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" + integrity sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g== dependencies: safe-buffer "^5.1.1" yallist "^3.0.0" @@ -4578,12 +5225,14 @@ minipass@^2.2.1, minipass@^2.2.4: minizlib@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + integrity sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA== dependencies: minipass "^2.2.1" mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -4591,20 +5240,24 @@ mixin-deep@^1.2.0: mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= multicast-dns@^6.0.1: version "6.2.3" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== dependencies: dns-packet "^1.3.1" thunky "^1.0.2" @@ -4612,14 +5265,17 @@ multicast-dns@^6.0.1: mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.3.3, nan@^2.9.2: +nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== nanomatch@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + integrity sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4637,10 +5293,12 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + integrity sha512-t/ZswCM9JTWjAdXS9VpvqhI2Ct2sL2MdY4fUXqGJaGBk13ge99ObqRksRTbBE56K+wxUXwwfZYOuZHifFW9q+Q== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -4649,24 +5307,29 @@ needle@^2.2.0: negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= neo-async@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== dependencies: lower-case "^1.1.1" node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -4674,14 +5337,17 @@ node-fetch@^1.0.1: node-forge@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" + integrity sha1-naYR6giYL0uUIGs760zJZl8gwwA= node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -4710,6 +5376,7 @@ node-libs-browser@^2.0.0: node-notifier@^5.0.2: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== dependencies: growly "^1.3.0" semver "^5.4.1" @@ -4719,6 +5386,7 @@ node-notifier@^5.0.2: node-pre-gyp@^0.9.0: version "0.9.1" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" + integrity sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA= dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -4734,6 +5402,7 @@ node-pre-gyp@^0.9.0: nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -4741,6 +5410,7 @@ nopt@^4.0.1: normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -4750,16 +5420,19 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= normalize-url@^1.4.0: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= dependencies: object-assign "^4.0.1" prepend-http "^1.0.0" @@ -4769,10 +5442,12 @@ normalize-url@^1.4.0: npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + integrity sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow== npm-packlist@^1.1.6: version "1.1.10" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + integrity sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -4780,12 +5455,14 @@ npm-packlist@^1.1.6: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -4795,32 +5472,39 @@ npmlog@^4.0.2: nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= dependencies: boolbase "~1.0.0" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= "nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.4" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ== oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -4829,20 +5513,24 @@ object-copy@^0.1.0: object-hash@^1.1.4: version "1.3.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" + integrity sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ== object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + integrity sha1-xUYBd4rVYPEULODgG8yotW0TQm0= object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -4850,50 +5538,59 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" obuf@^1.0.0, obuf@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" opn@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" + integrity sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ== dependencies: is-wsl "^1.1.0" opn@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== dependencies: is-wsl "^1.1.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -4901,6 +5598,7 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -4912,26 +5610,31 @@ optionator@^0.8.1, optionator@^0.8.2: original@>=0.0.5: version "1.0.0" resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + integrity sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs= dependencies: url-parse "1.0.x" os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" @@ -4940,10 +5643,12 @@ os-locale@^2.0.0: os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -4951,30 +5656,36 @@ osenv@^0.1.4: p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + integrity sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng== dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= dependencies: got "^6.7.1" registry-auth-token "^3.0.1" @@ -4984,16 +5695,19 @@ package-json@^4.0.0: pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== param-case@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= dependencies: no-case "^2.2.0" parse-asn1@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -5004,6 +5718,7 @@ parse-asn1@^5.0.0: parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -5013,72 +5728,88 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ= parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-to-regexp@^1.0.1, path-to-regexp@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= dependencies: isarray "0.0.1" path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -5087,12 +5818,14 @@ path-type@^1.0.0: path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" pbkdf2@^3.0.3: version "3.0.16" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + integrity sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5103,44 +5836,53 @@ pbkdf2@^3.0.3: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= dependencies: find-up "^1.0.0" pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== portfinder@^1.0.9: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + integrity sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek= dependencies: async "^1.5.2" debug "^2.2.0" @@ -5149,10 +5891,12 @@ portfinder@^1.0.9: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= dependencies: postcss "^5.0.2" postcss-message-helpers "^2.0.0" @@ -5161,6 +5905,7 @@ postcss-calc@^5.2.0: postcss-colormin@^2.1.8: version "2.2.2" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= dependencies: colormin "^1.0.5" postcss "^5.0.13" @@ -5169,6 +5914,7 @@ postcss-colormin@^2.1.8: postcss-convert-values@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= dependencies: postcss "^5.0.11" postcss-value-parser "^3.1.2" @@ -5176,30 +5922,35 @@ postcss-convert-values@^2.3.4: postcss-discard-comments@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= dependencies: postcss "^5.0.14" postcss-discard-duplicates@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= dependencies: postcss "^5.0.4" postcss-discard-empty@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= dependencies: postcss "^5.0.14" postcss-discard-overridden@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= dependencies: postcss "^5.0.16" postcss-discard-unused@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= dependencies: postcss "^5.0.14" uniqs "^2.0.0" @@ -5207,6 +5958,7 @@ postcss-discard-unused@^2.2.1: postcss-filter-plugins@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" + integrity sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew= dependencies: postcss "^5.0.4" uniqid "^4.0.0" @@ -5214,12 +5966,14 @@ postcss-filter-plugins@^2.0.0: postcss-flexbugs-fixes@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz#9b8b932c53f9cf13ba0f61875303e447c33dcc51" + integrity sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw== dependencies: postcss "^6.0.1" postcss-load-config@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" + integrity sha1-U56a/J3chiASHr+djDZz4M5Q0oo= dependencies: cosmiconfig "^2.1.0" object-assign "^4.1.0" @@ -5229,6 +5983,7 @@ postcss-load-config@^1.2.0: postcss-load-options@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" + integrity sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw= dependencies: cosmiconfig "^2.1.0" object-assign "^4.1.0" @@ -5236,6 +5991,7 @@ postcss-load-options@^1.2.0: postcss-load-plugins@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" + integrity sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI= dependencies: cosmiconfig "^2.1.1" object-assign "^4.1.0" @@ -5243,6 +5999,7 @@ postcss-load-plugins@^2.3.0: postcss-loader@2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.8.tgz#8c67ddb029407dfafe684a406cfc16bad2ce0814" + integrity sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q== dependencies: loader-utils "^1.1.0" postcss "^6.0.0" @@ -5252,6 +6009,7 @@ postcss-loader@2.0.8: postcss-merge-idents@^2.1.5: version "2.1.7" resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= dependencies: has "^1.0.1" postcss "^5.0.10" @@ -5260,12 +6018,14 @@ postcss-merge-idents@^2.1.5: postcss-merge-longhand@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= dependencies: postcss "^5.0.4" postcss-merge-rules@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= dependencies: browserslist "^1.5.2" caniuse-api "^1.5.2" @@ -5276,10 +6036,12 @@ postcss-merge-rules@^2.0.3: postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= postcss-minify-font-values@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= dependencies: object-assign "^4.0.1" postcss "^5.0.4" @@ -5288,6 +6050,7 @@ postcss-minify-font-values@^1.0.2: postcss-minify-gradients@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= dependencies: postcss "^5.0.12" postcss-value-parser "^3.3.0" @@ -5295,6 +6058,7 @@ postcss-minify-gradients@^1.0.1: postcss-minify-params@^1.0.4: version "1.2.2" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= dependencies: alphanum-sort "^1.0.1" postcss "^5.0.2" @@ -5304,6 +6068,7 @@ postcss-minify-params@^1.0.4: postcss-minify-selectors@^2.0.4: version "2.1.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= dependencies: alphanum-sort "^1.0.2" has "^1.0.1" @@ -5313,12 +6078,14 @@ postcss-minify-selectors@^2.0.4: postcss-modules-extract-imports@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= dependencies: postcss "^6.0.1" postcss-modules-local-by-default@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" @@ -5326,6 +6093,7 @@ postcss-modules-local-by-default@^1.0.1: postcss-modules-scope@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" @@ -5333,6 +6101,7 @@ postcss-modules-scope@^1.0.0: postcss-modules-values@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= dependencies: icss-replace-symbols "^1.1.0" postcss "^6.0.1" @@ -5340,12 +6109,14 @@ postcss-modules-values@^1.1.0: postcss-normalize-charset@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= dependencies: postcss "^5.0.5" postcss-normalize-url@^3.0.7: version "3.0.8" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= dependencies: is-absolute-url "^2.0.0" normalize-url "^1.4.0" @@ -5355,6 +6126,7 @@ postcss-normalize-url@^3.0.7: postcss-ordered-values@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.1" @@ -5362,6 +6134,7 @@ postcss-ordered-values@^2.1.0: postcss-reduce-idents@^2.2.2: version "2.4.0" resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.2" @@ -5369,12 +6142,14 @@ postcss-reduce-idents@^2.2.2: postcss-reduce-initial@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= dependencies: postcss "^5.0.4" postcss-reduce-transforms@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= dependencies: has "^1.0.1" postcss "^5.0.8" @@ -5383,6 +6158,7 @@ postcss-reduce-transforms@^1.0.3: postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= dependencies: flatten "^1.0.2" indexes-of "^1.0.1" @@ -5391,6 +6167,7 @@ postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: postcss-svgo@^2.1.1: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= dependencies: is-svg "^2.0.0" postcss "^5.0.14" @@ -5400,6 +6177,7 @@ postcss-svgo@^2.1.1: postcss-unique-selectors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= dependencies: alphanum-sort "^1.0.1" postcss "^5.0.4" @@ -5408,10 +6186,12 @@ postcss-unique-selectors@^2.0.2: postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + integrity sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU= postcss-zindex@^2.0.1: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= dependencies: has "^1.0.1" postcss "^5.0.4" @@ -5420,6 +6200,7 @@ postcss-zindex@^2.0.1: postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== dependencies: chalk "^1.1.3" js-base64 "^2.1.9" @@ -5429,6 +6210,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13: version "6.0.22" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3" + integrity sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA== dependencies: chalk "^2.4.1" source-map "^0.6.1" @@ -5437,22 +6219,27 @@ postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= pretty-bytes@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" + integrity sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk= pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= dependencies: renderkid "^2.0.1" utila "~0.4" @@ -5460,6 +6247,7 @@ pretty-error@^2.0.2: pretty-format@^20.0.3: version "20.0.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14" + integrity sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ= dependencies: ansi-regex "^2.1.1" ansi-styles "^3.0.0" @@ -5467,34 +6255,41 @@ pretty-format@^20.0.3: private@^0.1.6, private@^0.1.7, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= promise@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.1.tgz#e45d68b00a17647b6da711bf85ed6ed47208f450" + integrity sha1-5F1osAoXZHttpxG/he1u1HII9FA= dependencies: asap "~2.0.3" promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" prop-types@^15.5.10, prop-types@^15.6.0: version "15.6.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" + integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ== dependencies: fbjs "^0.8.16" loose-envify "^1.3.1" @@ -5503,6 +6298,7 @@ prop-types@^15.5.10, prop-types@^15.6.0: prop-types@^15.6.1: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== dependencies: loose-envify "^1.3.1" object-assign "^4.1.1" @@ -5510,6 +6306,7 @@ prop-types@^15.6.1: proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + integrity sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ== dependencies: forwarded "~0.1.2" ipaddr.js "1.6.0" @@ -5517,14 +6314,17 @@ proxy-addr@~2.0.3: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= public-encrypt@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + integrity sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" @@ -5535,26 +6335,32 @@ public-encrypt@^4.0.0: punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qs@6.5.1, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= dependencies: object-assign "^4.1.0" strict-uri-encode "^1.0.0" @@ -5562,28 +6368,34 @@ query-string@^4.1.0: querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@0.0.x: version "0.0.4" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + integrity sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw= querystringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" + integrity sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw== raf@3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + integrity sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw== dependencies: performance-now "^2.1.0" randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + integrity sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how== dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -5591,12 +6403,14 @@ randomatic@^1.1.3: randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" @@ -5604,10 +6418,12 @@ randomfill@^1.0.3: range-parser@^1.0.3, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= dependencies: bytes "3.0.0" http-errors "1.6.2" @@ -5617,6 +6433,7 @@ raw-body@2.3.2: rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.7" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297" + integrity sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA== dependencies: deep-extend "^0.5.1" ini "~1.3.0" @@ -5626,12 +6443,14 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: react-app-rewire-mobx@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/react-app-rewire-mobx/-/react-app-rewire-mobx-1.0.8.tgz#f7612bf871d6a8a801be9c12e950d7a29696e354" + integrity sha512-/gdHfLy6b8qxIdfn5Y4KlcL/u9ZwZmKTXQRn2JAtTYVtVlxW4tgml/cwH1oC+y0SrK4H75+JT01ve6CiV+srNQ== dependencies: babel-plugin-transform-decorators-legacy "1.3.4" react-app-rewired@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/react-app-rewired/-/react-app-rewired-1.5.2.tgz#0f5cdbc92f47f166bb0bcadf8a5d00999b90f68f" + integrity sha512-/cbaFBaSYvCcj2BnolCh2Cx0J8QwFECg5RssXFPckhdzC9iEb5BKJGqt71ZTOF35gv6ebo4CPKJR4nZajzW4Sw== dependencies: cross-spawn "^5.1.0" dotenv "^4.0.0" @@ -5639,6 +6458,7 @@ react-app-rewired@^1.5.2: react-dev-utils@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-5.0.1.tgz#1f396e161fe44b595db1b186a40067289bf06613" + integrity sha512-+y92rG6pmXt3cpcg/NGmG4w/W309tWNSmyyPL8hCMxuCSg2UP/hUg3npACj2UZc8UKVSXexyLrCnxowizGoAsw== dependencies: address "1.0.3" babel-code-frame "6.26.0" @@ -5662,6 +6482,7 @@ react-dev-utils@^5.0.1: react-dom@^16.3.2: version "16.3.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.3.2.tgz#cb90f107e09536d683d84ed5d4888e9640e0e4df" + integrity sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA== dependencies: fbjs "^0.8.16" loose-envify "^1.1.0" @@ -5671,10 +6492,12 @@ react-dom@^16.3.2: react-error-overlay@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4" + integrity sha512-FlsPxavEyMuR6TjVbSSywovXSEyOg6ZDj5+Z8nbsRl9EkOzAhEIcS+GLoQDC5fz/t9suhUXWmUrOBrgeUvrMxw== react-router-dom@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" + integrity sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA== dependencies: history "^4.7.2" invariant "^2.2.4" @@ -5686,6 +6509,7 @@ react-router-dom@^4.3.1: react-router@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" + integrity sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg== dependencies: history "^4.7.2" hoist-non-react-statics "^2.5.0" @@ -5698,6 +6522,7 @@ react-router@^4.3.1: react-scripts@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-1.1.4.tgz#d5c230e707918d6dd2d06f303b10f5222d017c88" + integrity sha512-UVZIujEIT9BGbx+NGvyfS92eOrNIIpqqFi1FP7a0O9l94A/XV7bhPk70SfDKaXZouCX81tFdXo0948DjhCEgGw== dependencies: autoprefixer "7.1.6" babel-core "6.26.0" @@ -5743,6 +6568,7 @@ react-scripts@1.1.4: react@^16.3.2: version "16.3.2" resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9" + integrity sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg== dependencies: fbjs "^0.8.16" loose-envify "^1.1.0" @@ -5752,6 +6578,7 @@ react@^16.3.2: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -5759,6 +6586,7 @@ read-pkg-up@^1.0.1: read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" @@ -5766,6 +6594,7 @@ read-pkg-up@^2.0.0: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -5774,6 +6603,7 @@ read-pkg@^1.0.0: read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" @@ -5782,6 +6612,7 @@ read-pkg@^2.0.0: readable-stream@1.0: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -5791,6 +6622,7 @@ readable-stream@1.0: readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5803,6 +6635,7 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" @@ -5812,12 +6645,14 @@ readdirp@^2.0.0: recursive-readdir@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" + integrity sha1-kO8jHQd4xc4JPJpI105cVCLROpk= dependencies: minimatch "3.0.3" redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -5825,6 +6660,7 @@ redent@^1.0.0: reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= dependencies: balanced-match "^0.4.2" math-expression-evaluator "^1.2.14" @@ -5833,20 +6669,24 @@ reduce-css-calc@^1.2.6: reduce-function-call@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= dependencies: balanced-match "^0.4.2" regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + integrity sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg== regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -5855,12 +6695,14 @@ regenerator-transform@^0.10.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -5868,6 +6710,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -5876,6 +6719,7 @@ regexpu-core@^1.0.0: regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -5884,6 +6728,7 @@ regexpu-core@^2.0.0: registry-auth-token@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== dependencies: rc "^1.1.6" safe-buffer "^5.0.1" @@ -5891,30 +6736,36 @@ registry-auth-token@^3.0.1: registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= dependencies: rc "^1.0.1" regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= renderkid@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" + integrity sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk= dependencies: css-select "^1.1.0" dom-converter "~0.1" @@ -5925,20 +6776,24 @@ renderkid@^2.0.1: repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" request@^2.79.0: version "2.85.0" resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + integrity sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -5966,18 +6821,22 @@ request@^2.79.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -5985,16 +6844,19 @@ require-uncached@^1.0.3: requires-port@1.0.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" resolve-dir@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: expand-tilde "^2.0.0" global-modules "^1.0.0" @@ -6002,38 +6864,46 @@ resolve-dir@^1.0.0: resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-pathname@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" + integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg== resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" + integrity sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw== dependencies: path-parse "^1.0.5" resolve@^1.3.2, resolve@^1.5.0: version "1.7.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== dependencies: path-parse "^1.0.5" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -6041,22 +6911,26 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" rimraf@^2.2.8, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" @@ -6064,46 +6938,55 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -rxjs@^6.2.2: +rxjs@~6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" + integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ== dependencies: tslib "^1.9.0" safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sane@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775" + integrity sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U= dependencies: anymatch "^1.3.0" exec-sh "^0.2.0" @@ -6116,36 +6999,43 @@ sane@~1.6.0: sax@^1.2.1, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== schema-utils@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= dependencies: ajv "^5.0.0" select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.9.1: version "1.10.2" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.2.tgz#b4449580d99929b65b10a48389301a6592088758" + integrity sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g= dependencies: node-forge "0.7.1" semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= dependencies: semver "^5.0.3" "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -6164,6 +7054,7 @@ send@0.16.2: serve-index@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= dependencies: accepts "~1.3.4" batch "0.6.1" @@ -6176,6 +7067,7 @@ serve-index@^1.7.2: serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -6185,18 +7077,22 @@ serve-static@1.13.2: serviceworker-cache-polyfill@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz#de19ee73bef21ab3c0740a37b33db62464babdeb" + integrity sha1-3hnuc77yGrPAdAo3sz22JGS6ves= set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6206,6 +7102,7 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6215,18 +7112,22 @@ set-value@^2.0.0: setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -6234,16 +7135,19 @@ sha.js@^2.4.0, sha.js@^2.4.8: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shell-quote@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= dependencies: array-filter "~0.0.0" array-map "~0.0.0" @@ -6253,24 +7157,29 @@ shell-quote@1.6.1: shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== dependencies: is-fullwidth-code-point "^2.0.0" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -6279,12 +7188,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -6298,12 +7209,14 @@ snapdragon@^0.8.1: sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== dependencies: hoek "4.x.x" sockjs-client@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" + integrity sha1-W6vjhrd15M8U51IJEUUmVAFsixI= dependencies: debug "^2.6.6" eventsource "0.1.6" @@ -6315,6 +7228,7 @@ sockjs-client@1.1.4: sockjs@0.3.18: version "0.3.18" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" + integrity sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc= dependencies: faye-websocket "^0.10.0" uuid "^2.0.2" @@ -6322,16 +7236,19 @@ sockjs@0.3.18: sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= dependencies: is-plain-obj "^1.0.0" source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A== source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + integrity sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A== dependencies: atob "^2.0.0" decode-uri-component "^0.2.0" @@ -6342,30 +7259,36 @@ source-map-resolve@^0.5.0: source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + integrity sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -6373,10 +7296,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + integrity sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg== spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -6384,10 +7309,12 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + integrity sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA== spdy-transport@^2.0.18: version "2.1.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + integrity sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g== dependencies: debug "^2.6.8" detect-node "^2.0.3" @@ -6400,6 +7327,7 @@ spdy-transport@^2.0.18: spdy@^3.4.1: version "3.4.7" resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= dependencies: debug "^2.6.8" handle-thing "^1.2.5" @@ -6411,16 +7339,19 @@ spdy@^3.4.1: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: version "1.14.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + integrity sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s= dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -6435,6 +7366,7 @@ sshpk@^1.7.0: static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -6442,18 +7374,17 @@ static-extend@^0.1.1: "statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -store@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= dependencies: inherits "~2.0.1" readable-stream "^2.0.2" @@ -6461,6 +7392,7 @@ stream-browserify@^2.0.1: stream-http@^2.7.2: version "2.8.1" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.1.tgz#d0441be1a457a73a733a8a7b53570bebd9ef66a4" + integrity sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -6471,16 +7403,19 @@ stream-http@^2.7.2: strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= string-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + integrity sha1-VpcPscOFWOnnC3KL894mmsRa36w= dependencies: strip-ansi "^3.0.0" string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -6489,6 +7424,7 @@ string-width@^1.0.1, string-width@^1.0.2: string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -6496,56 +7432,67 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= style-loader@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.0.tgz#7258e788f0fee6a42d710eaf7d6c2412a4c50759" + integrity sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw== dependencies: loader-utils "^1.0.2" schema-utils "^0.3.0" @@ -6553,28 +7500,33 @@ style-loader@0.19.0: supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.2, supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" supports-color@^4.2.1: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= dependencies: has-flag "^2.0.0" supports-color@^5.3.0, supports-color@^5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== dependencies: has-flag "^3.0.0" svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= dependencies: coa "~1.0.1" colors "~1.1.2" @@ -6587,6 +7539,7 @@ svgo@^0.7.0: sw-precache-webpack-plugin@0.11.4: version "0.11.4" resolved "https://registry.yarnpkg.com/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz#a695017e54eed575551493a519dc1da8da2dc5e0" + integrity sha1-ppUBflTu1XVVFJOlGdwdqNotxeA= dependencies: del "^2.2.2" sw-precache "^5.1.1" @@ -6595,6 +7548,7 @@ sw-precache-webpack-plugin@0.11.4: sw-precache@^5.1.1: version "5.2.1" resolved "https://registry.yarnpkg.com/sw-precache/-/sw-precache-5.2.1.tgz#06134f319eec68f3b9583ce9a7036b1c119f7179" + integrity sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw== dependencies: dom-urls "^1.1.0" es6-promise "^4.0.5" @@ -6610,6 +7564,7 @@ sw-precache@^5.1.1: sw-toolbox@^3.4.0: version "3.6.0" resolved "https://registry.yarnpkg.com/sw-toolbox/-/sw-toolbox-3.6.0.tgz#26df1d1c70348658e4dea2884319149b7b3183b5" + integrity sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U= dependencies: path-to-regexp "^1.0.1" serviceworker-cache-polyfill "^4.0.0" @@ -6617,14 +7572,17 @@ sw-toolbox@^3.4.0: symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= table@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + integrity sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg== dependencies: ajv "^6.0.1" ajv-keywords "^3.0.0" @@ -6636,10 +7594,12 @@ table@^4.0.1: tapable@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + integrity sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI= tar@^4: version "4.4.2" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.2.tgz#60685211ba46b38847b1ae7ee1a24d744a2cd462" + integrity sha512-BfkE9CciGGgDsATqkikUHrQrraBCO+ke/1f6SFAEMnxyyfN9lxC+nW1NFWMpqH865DhHIy9vQi682gk1X7friw== dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -6652,12 +7612,14 @@ tar@^4: term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= dependencies: execa "^0.7.0" test-exclude@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" + integrity sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ== dependencies: arrify "^1.0.1" micromatch "^3.1.8" @@ -6668,60 +7630,73 @@ test-exclude@^4.2.1: text-table@0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= throat@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" + integrity sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w== through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= thunky@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + integrity sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E= time-stamp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" + integrity sha1-lcakRTDhW6jW9KPsuMOj+sRto1c= timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== dependencies: setimmediate "^1.0.4" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -6729,6 +7704,7 @@ to-regex-range@^2.1.0: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" @@ -6738,73 +7714,81 @@ to-regex@^3.0.1, to-regex@^3.0.2: toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= tough-cookie@^2.3.2, tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== dependencies: punycode "^1.4.1" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-is@~1.6.15, type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" mime-types "~2.1.18" -typedarray-to-buffer@^3.1.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= ua-parser-js@^0.7.9: version "0.7.17" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + integrity sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g== uglify-js@3.3.x, uglify-js@^3.0.13: version "3.3.23" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.23.tgz#48ea43e638364d18be292a6fdc2b5b7c35f239ab" + integrity sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw== dependencies: commander "~2.15.0" source-map "~0.6.1" @@ -6812,6 +7796,7 @@ uglify-js@3.3.x, uglify-js@^3.0.13: uglify-js@^2.6, uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -6821,10 +7806,12 @@ uglify-js@^2.6, uglify-js@^2.8.29: uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uglifyjs-webpack-plugin@^0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + integrity sha1-uVH0q7a9YX5m9j64kUmOORdj4wk= dependencies: source-map "^0.5.6" uglify-js "^2.8.29" @@ -6833,6 +7820,7 @@ uglifyjs-webpack-plugin@^0.4.6: union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -6842,34 +7830,41 @@ union-value@^1.0.0: uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= uniqid@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" + integrity sha1-iSIN32t1GuUrX3JISGNShZa7hME= dependencies: macaddress "^0.2.8" uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + integrity sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc= unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -6877,14 +7872,17 @@ unset-value@^1.0.0: unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= upath@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.5.tgz#02cab9ecebe95bbec6d5fc2566325725ab6d1a73" + integrity sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww== update-notifier@^2.3.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== dependencies: boxen "^1.2.1" chalk "^2.0.1" @@ -6900,24 +7898,29 @@ update-notifier@^2.3.0: upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= uri-js@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" + integrity sha1-+QuFhQf4HepNz7s8TD2/orVX+qo= dependencies: punycode "^2.1.0" urijs@^1.16.1: version "1.19.1" resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" + integrity sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg== urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-loader@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" + integrity sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q== dependencies: loader-utils "^1.0.2" mime "^1.4.1" @@ -6926,12 +7929,14 @@ url-loader@0.6.2: url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= dependencies: prepend-http "^1.0.1" url-parse@1.0.x: version "1.0.5" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + integrity sha1-CFSGBCKv3P7+tsllxmLUgAFpkns= dependencies: querystringify "0.0.x" requires-port "1.0.x" @@ -6939,6 +7944,7 @@ url-parse@1.0.x: url-parse@^1.1.8: version "1.4.0" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.0.tgz#6bfdaad60098c7fe06f623e42b22de62de0d3d75" + integrity sha512-ERuGxDiQ6Xw/agN4tuoCRbmwRuZP0cJ1lJxJubXr5Q/5cDa78+Dc4wfvtxzhzhkm5VvmW6Mf8EVj9SPGN4l8Lg== dependencies: querystringify "^2.0.0" requires-port "^1.0.0" @@ -6946,6 +7952,7 @@ url-parse@^1.1.8: url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" @@ -6953,46 +7960,51 @@ url@^0.11.0: use@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + integrity sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw== dependencies: kind-of "^6.0.2" -utf8@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util@0.10.3, util@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" utila@~0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" + integrity sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY= utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== validate-npm-package-license@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + integrity sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -7000,18 +8012,22 @@ validate-npm-package-license@^3.0.1: value-equal@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" + integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw== vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -7020,34 +8036,40 @@ verror@1.10.0: vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" + integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= dependencies: loose-envify "^1.0.0" warning@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.1.tgz#66ce376b7fbfe8a887c22bdf0e7349d73d397745" + integrity sha512-rAVtTNZw+cQPjvGp1ox0XC5Q2IBFyqoqh+QII4J/oguyu83Bax1apbo2eqB8bHRS+fqYUBagys6lqUoVwKSmXQ== dependencies: loose-envify "^1.0.0" watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw= watchpack@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" @@ -7056,20 +8078,24 @@ watchpack@^1.4.0: wbuf@^1.1.0, wbuf@^1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webpack-dev-middleware@^1.11.0: version "1.12.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" + integrity sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A== dependencies: memory-fs "~0.4.1" mime "^1.5.0" @@ -7080,6 +8106,7 @@ webpack-dev-middleware@^1.11.0: webpack-dev-server@2.9.4: version "2.9.4" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.4.tgz#7883e61759c6a4b33e9b19ec4037bd4ab61428d1" + integrity sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow== dependencies: ansi-html "0.0.7" array-includes "^3.0.3" @@ -7112,6 +8139,7 @@ webpack-dev-server@2.9.4: webpack-manifest-plugin@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz#5ea8ee5756359ddc1d98814324fe43496349a7d4" + integrity sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw== dependencies: fs-extra "^0.30.0" lodash ">=3.5 <5" @@ -7119,6 +8147,7 @@ webpack-manifest-plugin@1.3.2: webpack-sources@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" @@ -7126,6 +8155,7 @@ webpack-sources@^1.0.1: webpack@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.8.1.tgz#b16968a81100abe61608b0153c9159ef8bb2bd83" + integrity sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw== dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" @@ -7153,6 +8183,7 @@ webpack@3.8.1: websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" @@ -7160,33 +8191,29 @@ websocket-driver@>=0.5.1: websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - -websocket@^1.0.25: - version "1.0.26" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194" - dependencies: - debug "^2.2.0" - nan "^2.3.3" - typedarray-to-buffer "^3.1.2" - yaeti "^0.0.6" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== whatwg-encoding@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== dependencies: iconv-lite "0.4.19" whatwg-fetch@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + integrity sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ= whatwg-fetch@>=0.10.0: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + integrity sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA= dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -7194,58 +8221,70 @@ whatwg-url@^4.3.0: whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== dependencies: string-width "^1.0.2" widest-line@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + integrity sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM= dependencies: string-width "^2.1.1" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= worker-farm@^1.3.1: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== dependencies: errno "~0.1.7" wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -7253,10 +8292,12 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -7265,58 +8306,65 @@ write-file-atomic@^2.0.0: write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU= xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= dependencies: camelcase "^3.0.0" yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= dependencies: camelcase "^3.0.0" yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= dependencies: camelcase "^4.1.0" yargs@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -7335,6 +8383,7 @@ yargs@^6.6.0: yargs@^7.0.2: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -7353,6 +8402,7 @@ yargs@^7.0.2: yargs@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= dependencies: camelcase "^4.1.0" cliui "^3.2.0" @@ -7371,6 +8421,7 @@ yargs@^8.0.2: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" diff --git a/packages/light.js/package.json b/packages/light.js/package.json index bcd9bf87..21c57f49 100644 --- a/packages/light.js/package.json +++ b/packages/light.js/package.json @@ -37,9 +37,9 @@ "@types/debug": "^0.0.30", "@types/memoizee": "^0.4.2", "eventemitter3": "^3.1.0", - "rxjs": "^6.2.1" + "rxjs": "~6.2.2" }, "peerDependencies": { - "rxjs": "^6.2.1" + "rxjs": "~6.2.2" } } diff --git a/yarn.lock b/yarn.lock index 22578478..3ea3cf51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,10 +18,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/runtime@7.0.0-beta.56": - version "7.0.0-beta.56" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.56.tgz#cda612dffd5b1719a7b8e91e3040bd6ae64de8b0" - integrity sha512-vP9XV2VP013UEyZdU9eWClCsm6rQPUYHVNCfmpcv5uKviW7mKmUZq71Y5cr5dYsFKfnGDxSo8h6plUGR60lwHg== +"@babel/runtime@^7.0.0": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.5.tgz#4170907641cf1f61508f563ece3725150cc6fe39" + integrity sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA== dependencies: regenerator-runtime "^0.12.0" @@ -6137,12 +6137,12 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -recompose@^0.28.2: - version "0.28.2" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.28.2.tgz#19e679227bdf979e0d31b73ffe7ae38c9194f4a7" - integrity sha512-baVNKQBQAAAuLRnv6Cb/6/j59a1BVj6c6Pags1KXVyRB0yPfQVUZtuAUnqHDBXoR8iXPrLGWE4RNtCQ/AaRP3g== +recompose@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" + integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== dependencies: - "@babel/runtime" "7.0.0-beta.56" + "@babel/runtime" "^7.0.0" change-emitter "^0.1.2" fbjs "^0.8.1" hoist-non-react-statics "^2.3.1" @@ -6423,10 +6423,10 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -rxjs@^6.2.1: - version "6.3.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== +rxjs@~6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" + integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ== dependencies: tslib "^1.9.0" From d67e6cf264911ed2842688a5dc45b0a8602f9a10 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 15:42:17 +0100 Subject: [PATCH 21/25] Fix tests --- jest.config.js | 10 +++++++++- package.json | 5 +++-- packages/contracts/src/registry.ts | 2 +- tsconfig.json | 1 + yarn.lock | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/jest.config.js b/jest.config.js index ebb3e966..17ee716b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,10 +5,18 @@ module.exports = { '!**/*.d.ts', '!**/index.ts' ], + // Adding this because "Cannot use namespace '...' as a type." + globals: { + 'ts-jest': { + diagnostics: { + warnOnly: true + } + } + }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], rootDir: '.', transform: { - '^.+\\.tsx?$': 'ts-jest' + '^.+\\.(ts|tsx)$': 'ts-jest' }, testRegex: 'spec\\.(ts|tsx)$' }; diff --git a/package.json b/package.json index d8ba9092..a4db2680 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "build": "lerna exec yarn build --stream", "lint": "tslint 'packages/**/*.ts'", "postinstall": "yarn build", - "test": "jest && lerna exec --package api yarn test", + "test": "jest", + "test:api": "lerna exec --package api yarn test", "update-docs": "scripts/update-docs.sh" }, "devDependencies": { @@ -34,6 +35,6 @@ "tslint-config-semistandard": "^7.0.0", "typedoc": "^0.12.0", "typedoc-plugin-markdown": "^1.1.13", - "typescript": "^3.0.1" + "typescript": "^3.1.6" } } diff --git a/packages/contracts/src/registry.ts b/packages/contracts/src/registry.ts index 5e2421fc..fb151ba2 100644 --- a/packages/contracts/src/registry.ts +++ b/packages/contracts/src/registry.ts @@ -135,7 +135,7 @@ export default class Registry { _createGetParams (_name: string, key: string) { const name = _name.toLowerCase(); - const sha3 = this._api.util.sha3.text(name); + const sha3 = this._api.util.sha3Text(name); return [sha3, key]; } diff --git a/tsconfig.json b/tsconfig.json index 6ca9fdbd..a2903700 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "declaration": true, + "jsx": "react", "lib": ["dom", "es2015", "es2017"], "moduleResolution": "node", "strict": true, diff --git a/yarn.lock b/yarn.lock index 3ea3cf51..d7a5ea99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7356,7 +7356,7 @@ typescript@3.0.x: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" integrity sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg== -typescript@^3.0.1: +typescript@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== From c16f4e5399dee52891d3abddc4e47c656fdb409c Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 15:45:48 +0100 Subject: [PATCH 22/25] Run api test --- .travis.yml | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7748f129..de67c274 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ node_js: script: - yarn lint - yarn build + - yarn test:api - yarn test --silent --coverage --coverageReporters=text-lcov | coveralls ; test ${PIPESTATUS[0]} -eq 0 before_deploy: - npm install --global gitbook-cli diff --git a/package.json b/package.json index a4db2680..53cbe719 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "lint": "tslint 'packages/**/*.ts'", "postinstall": "yarn build", "test": "jest", - "test:api": "lerna exec --package api yarn test", + "test:api": "cd packages/api && yarn test", "update-docs": "scripts/update-docs.sh" }, "devDependencies": { From d4c0eb03e3cd58a3ff04e19ca58be09aced83200 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 15:57:39 +0100 Subject: [PATCH 23/25] Remove useless packages --- packages/api/package.json | 27 +- yarn.lock | 1271 ++----------------------------------- 2 files changed, 41 insertions(+), 1257 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index b4b915ff..722aa53d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -17,37 +17,16 @@ "access": "public" }, "scripts": { - "build": "rimraf lib && tsc", - "ci:makeshift": "makeshift", - "lint": "npm run lint:css && npm run lint:js", - "lint:css": "echo \"WARN: npm run lint:css skipped\"", - "lint:js": "eslint src", - "test": "cross-env NODE_ENV=test mocha -r ts-node/register 'src/*.spec.js' 'src/**/*.spec.js'", - "test:coverage": "cross-env NODE_ENV=test istanbul cover _mocha 'src/*.spec.js' 'src/**/*.spec.js' && coveralls < coverage/lcov.info" + "prebuild": "rimraf lib", + "build": "tsc", + "test": "cross-env NODE_ENV=test mocha -r ts-node/register 'src/*.spec.js' 'src/**/*.spec.js'" }, "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.6.1", - "babel-preset-stage-0": "^6.24.1", "chai": "3.5.0", "chai-as-promised": "6.0.0", "coveralls": "^3.0.0", "cross-env": "^5.1.1", - "eslint": "^4.4.0", - "eslint-config-semistandard": "^11.0.0", - "eslint-config-standard": "^10.2.1", - "eslint-config-standard-react": "^5.0.0", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-node": "^5.1.1", - "eslint-plugin-promise": "^3.5.0", - "eslint-plugin-react": "^7.1.0", - "eslint-plugin-standard": "^3.0.1", - "istanbul": "^0.4.5", "jsdom": "^11.1.0", - "makeshift": "^1.1.0", "mocha": "^3.4.2", "mock-local-storage": "1.0.2", "mock-socket": "6.0.4", diff --git a/yarn.lock b/yarn.lock index d7a5ea99..b00a80c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -177,11 +177,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= - acorn-globals@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" @@ -190,24 +185,12 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" - acorn-walk@^6.0.1: version "6.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - -acorn@^5.5.0, acorn@^5.5.3: +acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -222,21 +205,6 @@ add-stream@^1.0.0: resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= - -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - ajv@^6.5.5: version "6.5.5" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" @@ -247,11 +215,6 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" @@ -279,14 +242,6 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -359,14 +314,6 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -435,11 +382,6 @@ astral-regex@^1.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= - async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -452,7 +394,7 @@ async-retry@^1.2.1, async-retry@^1.2.3: dependencies: retry "0.12.0" -async@1.x, async@^1.5.0: +async@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= @@ -492,28 +434,6 @@ axios@^0.18.0: follow-redirects "^1.3.0" is-buffer "^1.1.5" -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - integrity sha1-UCq1SHTX24itALiHoGODzgPQAvE= - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -562,130 +482,6 @@ babel-generator@^6.18.0, babel-generator@^6.26.0: source-map "^0.5.7" trim-right "^1.0.1" -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - integrity sha1-FMGeXxQte0fxmlJDHlKxzLxAozA= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" - integrity sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes= - dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" @@ -709,13 +505,6 @@ babel-messages@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - babel-plugin-istanbul@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" @@ -731,405 +520,11 @@ babel-plugin-jest-hoist@^23.2.0: resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - integrity sha1-a8lj67FuzLrmuStZbrfzXDQqi5o= - -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" - integrity sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY= - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= - -babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - integrity sha1-MSVjtNvePMgGzuPkFszurd0RrAs= - -babel-plugin-syntax-do-expressions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" - integrity sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0= - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" - integrity sha1-cKFITw+QiaToStRLrDU8lbmxJyE= - -babel-plugin-syntax-function-bind@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" - integrity sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y= - -babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" - integrity sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" - integrity sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk= - dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - integrity sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0= - dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-do-expressions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" - integrity sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs= - dependencies: - babel-plugin-syntax-do-expressions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" - integrity sha1-U3OLR+deghhYnuqUbLvTkQm75lM= - dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-function-bind@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" - integrity sha1-xvuOlqwpajELjPjqQBRiQH3fapc= - dependencies: - babel-plugin-syntax-function-bind "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.22.0, babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - babel-preset-jest@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" @@ -1138,45 +533,6 @@ babel-preset-jest@^23.2.0: babel-plugin-jest-hoist "^23.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" -babel-preset-stage-0@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" - integrity sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo= - dependencies: - babel-plugin-transform-do-expressions "^6.22.0" - babel-plugin-transform-function-bind "^6.22.0" - babel-preset-stage-1 "^6.24.1" - -babel-preset-stage-1@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - integrity sha1-dpLNfc1oSZB+auSgqFWJz7niv7A= - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - integrity sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE= - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - integrity sha1-g2raCp56f6N8sTj7kyb4eTSkg5U= - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1190,7 +546,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1209,7 +565,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -1224,7 +580,7 @@ babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-tra invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -1269,21 +625,11 @@ bignumber.js@7.2.1, bignumber.js@^7, bignumber.js@^7.2.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== -binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== - blockies@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/blockies/-/blockies-0.0.2.tgz#22ad58da4f6b382bc79bf4386c5820c70047e4ed" integrity sha1-Iq1Y2k9rOCvHm/Q4bFggxwBH5O0= -bluebird@^3.4.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== - boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -1354,14 +700,6 @@ browser-stdout@1.3.0: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -1406,18 +744,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= - callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" @@ -1450,11 +776,6 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -caniuse-lite@^1.0.30000844: - version "1.0.30000910" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000910.tgz#755d5181d4b006e5a2b59b1ffa05d0a0470039f5" - integrity sha512-u/nxtHGAzCGZzIxt3dA/tpSPOcirBZFWKwz1EPz4aaupnBI2XR0Rbr74g0zc6Hzy41OEM4uMoZ38k56TpYAWjQ== - capture-exit@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -1542,22 +863,6 @@ cheerio@^1.0.0-rc.2: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -1573,11 +878,6 @@ circular-json-es6@^2.0.1: resolved "https://registry.yarnpkg.com/circular-json-es6/-/circular-json-es6-2.0.2.tgz#e4f4a093e49fb4b6aba1157365746112a78bd344" integrity sha512-ODYONMMNb3p658Zv+Pp+/XPa5s6q7afhz3Tzyvo+VRh9WIrJ64J76ZC4GQxnlye/NesTn09jvOiuE8+xxfpwhQ== -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1698,7 +998,7 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@^2.12.1: +commander@^2.12.1: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -1726,7 +1026,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2, concat-stream@^1.4.10, concat-stream@^1.6.0: +concat-stream@1.6.2, concat-stream@^1.4.10: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1741,11 +1041,6 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - conventional-changelog-angular@^1.6.6: version "1.6.6" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" @@ -1913,7 +1208,7 @@ conventional-recommended-bump@^1.2.1: meow "^3.3.0" object-assign "^4.0.1" -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.4.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -1980,7 +1275,7 @@ cross-env@^5.1.1: cross-spawn "^6.0.5" is-windows "^1.0.0" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -2252,21 +1547,6 @@ doctrine@0.7.2, doctrine@^0.7.2: esutils "^1.1.6" isarray "0.0.1" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -2369,11 +1649,6 @@ electron-download@^3.0.1: semver "^5.3.0" sumchecker "^1.2.0" -electron-to-chromium@^1.3.47: - version "1.3.84" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz#2e55df59e818f150a9f61b53471ebf4f0feecc65" - integrity sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw== - electron@^2.0.2: version "2.0.14" resolved "https://registry.yarnpkg.com/electron/-/electron-2.0.14.tgz#fad6766645e7c0cd10b4ae822d3167959735a870" @@ -2465,7 +1740,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: +es-abstract@^1.10.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.6.1: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== @@ -2536,18 +1811,6 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - escodegen@^1.9.1: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" @@ -2560,161 +1823,6 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-config-semistandard@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-11.0.0.tgz#44eef7cfdfd47219e3a7b81b91b540e880bb2615" - integrity sha1-RO73z9/Uchnjp7gbkbVA6IC7JhU= - -eslint-config-standard-jsx@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz#009e53c4ddb1e9ee70b4650ffe63a7f39f8836e1" - integrity sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw== - -eslint-config-standard-react@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-react/-/eslint-config-standard-react-5.0.0.tgz#64c7b8140172852be810a53d48ee87649ff178e3" - integrity sha1-ZMe4FAFyhSvoEKU9SO6HZJ/xeOM= - dependencies: - eslint-config-standard-jsx "^4.0.0" - -eslint-config-standard@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" - integrity sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE= - -eslint-import-resolver-node@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-module-utils@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" - integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - -eslint-plugin-import@^2.7.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" - integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== - dependencies: - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - resolve "^1.6.0" - -eslint-plugin-node@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" - integrity sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g== - dependencies: - ignore "^3.3.6" - minimatch "^3.0.4" - resolve "^1.3.3" - semver "5.3.0" - -eslint-plugin-promise@^3.5.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz#65ebf27a845e3c1e9d6f6a5622ddd3801694b621" - integrity sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ== - -eslint-plugin-react@^7.1.0: - version "7.11.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" - integrity sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw== - dependencies: - array-includes "^3.0.3" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.0.1" - prop-types "^15.6.2" - -eslint-plugin-standard@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47" - integrity sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w== - -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== - -eslint@^4.4.0: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -2725,26 +1833,7 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -2939,11 +2028,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -2993,14 +2077,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -3050,16 +2126,6 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== - dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" - follow-redirects@^1.3.0: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" @@ -3143,17 +2209,12 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.2.3: +fsevents@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== @@ -3175,11 +2236,6 @@ function.prototype.name@^1.1.0: function-bind "^1.1.1" is-callable "^1.1.3" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3306,17 +2362,6 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -3329,11 +2374,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.0.1: - version "11.9.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" - integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg== - globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3367,7 +2407,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -3392,7 +2432,7 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -handlebars@^4.0.1, handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: +handlebars@^4.0.2, handlebars@^4.0.3, handlebars@^4.0.6: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== @@ -3561,11 +2601,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3, ignore@^3.3.6: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" @@ -3609,7 +2644,7 @@ ini@^1.3.2, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^3.0.6, inquirer@^3.2.2: +inquirer@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -3665,13 +2700,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-boolean-object@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" @@ -3878,11 +2906,6 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -3937,7 +2960,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -4042,26 +3065,6 @@ istanbul-reports@^1.5.1: dependencies: handlebars "^4.0.3" -istanbul@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - 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" - jest-changed-files@^23.4.2: version "23.4.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" @@ -4453,7 +3456,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.x, js-yaml@^3.11.0, js-yaml@^3.7.0, js-yaml@^3.9.1: +js-yaml@^3.11.0, js-yaml@^3.7.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== @@ -4503,21 +3506,11 @@ jsesc@^1.3.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4528,11 +3521,6 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4584,13 +3572,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" - integrity sha1-6AGxs5mF4g//yHtA43SAgOLcrH8= - dependencies: - array-includes "^3.0.3" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -4694,7 +3675,7 @@ leven@^2.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -4933,17 +3914,6 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -makeshift@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/makeshift/-/makeshift-1.1.0.tgz#03819e68ebb5a0939edc20e7ea230c8818e2b4c4" - integrity sha512-wrL4SLWEDFlGLRHmO4r+6eMlu5z2Aj73CRpB0iDtRSkznFbN8/S4VNI8kxeClIJM5nZi1mrI+HcNegVw5orO3w== - dependencies: - bluebird "^3.4.1" - chalk "^2.0.1" - figures "^2.0.0" - sywac "^1.0.0" - url-parse-as-address "^1.0.0" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -5040,7 +4010,7 @@ merge@^1.2.0: resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== -micromatch@^2.1.5, micromatch@^2.3.11: +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -5059,7 +4029,7 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5095,7 +4065,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -5153,7 +4123,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -5348,13 +4318,6 @@ nomnom@~1.6.2: colors "0.5.x" underscore "~1.4.4" -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -5373,7 +4336,7 @@ normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -5539,7 +4502,7 @@ object.values@^1.0.4: function-bind "^1.1.0" has "^1.0.1" -once@1.x, once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -5568,7 +4531,7 @@ optimist@~0.3.5: dependencies: wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -5607,15 +4570,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - integrity sha1-0KM+7+YaIF+suQCS6CZZjVJFznY= - dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" - p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -5719,11 +4673,6 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -5789,13 +4738,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= - dependencies: - find-up "^1.0.0" - pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -5803,11 +4745,6 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -5849,7 +4786,7 @@ pretty-format@^23.6.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -private@^0.1.6, private@^0.1.8: +private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -6082,7 +5019,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -6114,15 +5051,6 @@ readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readdirp@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - realpath-native@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" @@ -6165,16 +5093,6 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" -regenerate@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -6185,15 +5103,6 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -6209,20 +5118,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - registry-auth-token@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" @@ -6238,18 +5133,6 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -6324,14 +5207,6 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -6339,11 +5214,6 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -6354,12 +5224,12 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7, resolve@1.1.x: +resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.1.6, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0, resolve@^1.6.0: +resolve@1.x, resolve@^1.1.6, resolve@^1.3.2: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== @@ -6384,7 +5254,7 @@ retry@0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -6491,11 +5361,6 @@ scheduler@^0.11.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -6597,13 +5462,6 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== - dependencies: - is-fullwidth-code-point "^2.0.0" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6706,13 +5564,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= - dependencies: - amdefine ">=0.0.4" - spdx-correct@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" @@ -6933,7 +5784,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0, supports-color@^3.1.2: +supports-color@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= @@ -6957,23 +5808,6 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= -sywac@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sywac/-/sywac-1.2.1.tgz#528e482b2f2a18e764ffccc59eb40eea16a7f97d" - integrity sha512-bf8agjBAV9mm90k2nWoobe48bO/XugTS86W4dGYTpzVlfFv1cmWsRrQ9hUKIfoDaIRaXIta/BLFINmmxfV+otg== - -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - tar@^4: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" @@ -7033,11 +5867,6 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -7432,11 +6261,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse-as-address@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-as-address/-/url-parse-as-address-1.0.0.tgz#fb80901883f338b3cbed3538f5faa26adaf7f2e7" - integrity sha1-+4CQGIPzOLPL7TU49fqiatr38uc= - url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -7449,11 +6273,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" @@ -7489,13 +6308,6 @@ uuid@^3.0.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= - dependencies: - user-home "^1.1.1" - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -7597,7 +6409,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.1.1, which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.2.12, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -7611,16 +6423,16 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -wordwrap@^1.0.0, wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -7663,13 +6475,6 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - dependencies: - mkdirp "^0.5.1" - ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" From 95a41b943d3d643da14eb1ba52e625b8018f632d Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 16:14:07 +0100 Subject: [PATCH 24/25] Parse MM respones (fix #48) --- packages/api/src/provider/current.js | 25 +++++++++++-------- .../frequency/utils/createPubsubObservable.ts | 12 +-------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/packages/api/src/provider/current.js b/packages/api/src/provider/current.js index 1451463c..60149c74 100644 --- a/packages/api/src/provider/current.js +++ b/packages/api/src/provider/current.js @@ -17,25 +17,28 @@ const JsonRpcEncoder = require('../transport/jsonRpcEncoder'); class Current extends JsonRpcEncoder { - constructor (currentProvider) { + constructor(currentProvider) { super(); this._currentProvider = currentProvider; } - send (method, params, callback) { - this._currentProvider.sendAsync(this.encodeObject(method, params), (error, result) => { - if (error) { - callback(error); - } else if (result && result.result) { - callback(null, result.result); - } else { - callback(null, result); + send(method, params, callback) { + this._currentProvider.sendAsync( + this.encodeObject(method, params), + (error, result) => { + if (error) { + callback(error); + } else if (result && result.result !== undefined) { + callback(null, result.result); + } else { + callback(null, result); + } } - }); + ); } - get isParity () { + get isParity() { return !!this._currentProvider.isParity; } } diff --git a/packages/light.js/src/frequency/utils/createPubsubObservable.ts b/packages/light.js/src/frequency/utils/createPubsubObservable.ts index 1ff9b9d7..9534ace3 100644 --- a/packages/light.js/src/frequency/utils/createPubsubObservable.ts +++ b/packages/light.js/src/frequency/utils/createPubsubObservable.ts @@ -33,17 +33,7 @@ const createPubsubObservableWithApi = memoizee( ); return timer(0, 1000).pipe( - switchMap(() => - api[namespace][method]().then((response: any) => { - // For responses by MetaMask, the object is not parsed by - // `@parity/api`. We parse it manually here. - // TODO Put this logic in `@parity/api` - if (typeof response === 'object' && response.result !== undefined) { - return response.result; - } - return response; - }) - ) + switchMap(() => api[namespace][method]()) ) as Observable; } From fe06a11b68d4dd2f3b21a7de9a61975968adb02a Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 23 Nov 2018 16:20:29 +0100 Subject: [PATCH 25/25] Remove useless test --- .../src/frequency/utils/createPubsubObservable.spec.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/light.js/src/frequency/utils/createPubsubObservable.spec.ts b/packages/light.js/src/frequency/utils/createPubsubObservable.spec.ts index a52ba4ca..394fcefd 100644 --- a/packages/light.js/src/frequency/utils/createPubsubObservable.spec.ts +++ b/packages/light.js/src/frequency/utils/createPubsubObservable.spec.ts @@ -37,14 +37,6 @@ it('should fire an event when polling pubsub publishes', done => { }); }); -it('should fire an event when polling pubsub publishes, with object', done => { - setApi(resolveApi({ result: 'foo' }, false)); - createPubsubObservable('fake_method').subscribe(data => { - expect(data).toBe('foo'); - done(); - }); -}); - it('should fire an error when polling pubsub errors', done => { setApi(rejectApi(new Error('bar'), false)); createPubsubObservable('fake_method').subscribe(undefined, err => {