diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 336431b..0000000 --- a/.babelrc +++ /dev/null @@ -1,57 +0,0 @@ -{ - "env": { - "development": { - "presets": [ - [ - "@babel/preset-env", - { - "loose": true, - "modules": false - } - ] - ] - }, - "es": { - "presets": [ - [ - "@babel/preset-env", - { - "loose": true, - "modules": false - } - ] - ] - }, - "lib": { - "presets": [ - [ - "@babel/preset-env", - { - "loose": true - } - ] - ] - }, - "production": { - "presets": [ - [ - "@babel/preset-env", - { - "loose": true, - "modules": false - } - ] - ] - }, - "test": { - "presets": [ - [ - "@babel/preset-env", - { - "loose": true - } - ] - ] - } - } -} diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index a4a6899..0000000 --- a/.eslintrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": ["rapid7/browser", "rapid7/strict"], - "globals": { - "__dirname": true, - "global": true, - "module": true, - "process": true, - "require": true - }, - "parser": "babel-eslint", - "rules": { - "max-depth": [2, 2], - "no-param-reassign": 0 - } -} diff --git a/.gitignore b/.gitignore index 50a6bca..15fe372 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea .nyc_output +.rpt2_cache coverage dist es diff --git a/.npmignore b/.npmignore index 592575f..2f10830 100644 --- a/.npmignore +++ b/.npmignore @@ -4,15 +4,20 @@ .gitignore .idea .npmignore +.npmrc .nyc_output +.rpt2_cache +__tests__ benchmarks -benchmark_results.csv coverage DEV_ONLY node_modules -rollup.config.js src -test webpack +benchmark_results.csv +jest.config.js +rollup.config.js +tsconfig.json +tslint.json *.log -yarn.lock \ No newline at end of file +*.lock \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 163154b..7ff14ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,25 @@ Yes, the irony is not lost on me. :) +## 2.0.0 + +Rewrite in TypeScript! + +**BREAKING CHANGES** + +- `transform` has changed to be `setWith`, and the signature has changed as well (see [the documentation](README.md#setWith) for details) + +**NEW FEATURES** + +- Added [`is`](README.md#is) method for assertion +- Added function-first `*With` methods corresponding to each existing method (see [the documentation](README.md#transform-methods) for details) +- TypeScript typings + +**ADDITIONAL CHANGES** + +- Faster `get`s, `set`s, `merge`s, and `remove`s +- Distinct `main`, `module`, and `browser` builds for better universality of consumption + ## 1.5.2 - Fix `rollup` build setup with latest `curriable` and `pathington` setups diff --git a/DEV_ONLY/App.js b/DEV_ONLY/App.js deleted file mode 100644 index e7bb2a9..0000000 --- a/DEV_ONLY/App.js +++ /dev/null @@ -1,361 +0,0 @@ -import * as src from '../src'; -import {assoc} from 'ramda'; - -console.log(src.add('d.f', 'df', {d: {f: []}})); -console.log(src.add(['d', 'f'], 'df', {d: {f: []}})); - -// import '../benchmarks'; - -const object = { - bar: 'baz', - foo: [{bar: {baz: 'quz'}}], -}; - -const result = src.merge( - ['foo', 0, 'bar'], - { - baz: 'nope', - quz: 'blah', - }, - object -); - -console.log(result, object); - -const foo = (() => { - const Foo = function(value) { - this.value = value; - }; - - Foo.prototype.getValue = function() { - return this.value; - }; - - return new Foo('foo'); -})(); - -console.log(assoc(0, 'value', foo)); -console.log(src.set(0, 'value', foo)); - -const simpleObject = { - foo, - regexp: /regexp/, - simple: 'value', -}; - -const simpleArray = ['simple', 'value']; - -const deepObject = { - deeply: [ - { - nested: { - 'object with quoted keys': 'value', - }, - untouched: true, - }, - 'untouched', - ], - untouched: true, -}; - -const deepArray = { - deeply: { - nested: ['array'], - untouched: true, - }, - untouched: true, -}; - -console.group('legend'); - -console.log('title | updated object | original object | are objects equal'); - -console.groupEnd('legend'); - -console.group('add'); - -const simpleAddObject = src.add('["other key"]', 'new value', simpleObject); - -console.log('simple object', simpleAddObject, simpleObject, simpleAddObject === simpleObject); - -console.log(simpleObject.regexp); - -const simpleFoo = src.add('regexp.something', 'else', simpleObject); - -console.log('custom prototype', simpleFoo, simpleObject, simpleFoo === simpleObject); - -const simpleAddArray = src.add(null, 'new value', simpleArray); - -console.log('simple array', simpleAddArray, simpleArray, simpleAddArray === simpleArray); - -const deepAddObject = src.add('deeply[0].nested["other key"]', 'new value', deepObject); - -console.log('deep object', deepAddObject, deepObject, deepAddObject === deepObject); - -const deepAddArray = src.add('deeply.nested', 'new value', deepArray); - -console.log('deep array', deepAddArray, deepArray, deepAddArray === deepArray); - -console.groupEnd('add'); - -console.group('call'); - -const simpleCallObject = Object.assign({}, simpleObject, { - method: (foo, bar) => { - console.log('foo', 'bar'); - console.log('simple scope', this); - - return 'baz'; - }, -}); - -const deepCallObject = Object.assign({}, deepObject, { - deeply: { - nested: [ - function method({quz}) { - console.log('deep scope', this); - - return quz; - }, - ], - }, -}); - -console.log(src.get('deeply.nested[0]', deepCallObject)); - -console.log('simple method found', src.call('method', ['foo', 'bar'], simpleCallObject)); -console.log('simple method not method', src.call('simple', ['foo', 'bar'], simpleCallObject)); -console.log('simple method not found', src.call('nope', ['foo', 'bar'], simpleCallObject)); - -console.log('native method', src.call('forEach', [(value) => console.log('value', value)], ['foo', 'bar'])); - -console.log('deep method found', src.call('deeply.nested[0]', [{quz: 'quz'}], deepCallObject)); -console.log( - 'deep method found with custom scope', - src.call('deeply.nested[0]', [{quz: 'quz'}], deepCallObject, {custom: 'scope'}) -); -console.log('deep method not method', src.call('deeply.untouched', [{quz: 'quz'}], deepCallObject)); -console.log('deep method not found', src.call('deeply.nope', [{quz: 'quz'}], deepCallObject)); - -console.log('window test', src.call(['addEventListener'], ['click', () => console.log('foo')], window)); - -class Foo { - constructor(value) { - this.value = value; - } - - __getValue() { - return this.value; - } - - getValue() { - return src.call(['__getValue'], [], this); - } -} - -console.log('class test', src.call(['getValue'], [], new Foo('bar'))); - -console.groupEnd('call'); - -console.group('get'); - -console.log('simple object', src.get('simple', simpleObject)); -console.log('simple array', src.get(1, simpleArray)); -console.log('deep object', src.get('deeply[0].nested["object with quoted keys"]', deepObject)); -console.log('deep array', src.get('[0].nested["object with quoted keys"]', deepObject.deeply)); - -console.groupEnd('get'); - -console.group('has'); - -console.log('simple object true', src.has('simple', simpleObject)); -console.log('simple object false', src.has('complex', simpleObject)); -console.log('simple array true', src.has(1, simpleArray)); -console.log('simple array false', src.has(7, simpleArray)); -console.log('deep object true', src.has('deeply[0].nested["object with quoted keys"]', deepObject)); -console.log('deep object false', src.has('deeply[0].nested["non-existent object"]', deepObject)); -console.log('deep array true', src.has('[0].nested["object with quoted keys"]', deepObject.deeply)); -console.log('deep array false', src.has('[0].nested["non-existent object"]', deepObject.deeply)); - -console.groupEnd('has'); - -console.group('assign'); - -const simpleAssignObject = src.assign( - null, - { - different: 'value', - simple: 'thing', - }, - simpleObject -); - -console.log('simple object', simpleAssignObject, simpleObject, simpleAssignObject === simpleObject); - -const simpleAssignArray = src.assign(null, ['different', 'value'], simpleArray); - -console.log('simple array', simpleAssignArray, simpleArray, simpleAssignArray === simpleArray); - -const deepAssignObject = src.assign( - 'deeply[0].nested', - { - different: 'value', - 'object with quoted keys': 'thing', - }, - deepObject -); - -console.log('deep object', deepAssignObject, deepObject, deepAssignObject === deepObject); - -const deepAssignArray = src.assign('deeply.nested', ['different', 'value'], deepArray); - -console.log('deep array', deepAssignArray, deepArray, deepAssignArray === deepArray); - -console.groupEnd('assign'); - -console.group('merge'); - -const simpleMergeObject = src.merge( - null, - { - different: 'value', - simple: 'thing', - }, - simpleObject -); - -console.log('simple object', simpleMergeObject, simpleObject, simpleMergeObject === simpleObject); - -const simpleMergeArray = src.merge(null, ['different', 'value'], simpleArray); - -console.log('simple array', simpleMergeArray, simpleArray, simpleMergeArray === simpleArray); - -const deepMergeObject = src.merge( - 'deeply[0].nested', - { - different: 'value', - 'object with quoted keys': 'thing', - }, - deepObject -); - -console.log('deep object', deepMergeObject, deepObject, deepMergeObject === deepObject); - -const deepMergeArray = src.merge('deeply.nested', ['different', 'value'], deepArray); - -console.log('deep array', deepMergeArray, deepArray, deepMergeArray === deepArray); - -console.groupEnd('merge'); - -console.group('remove'); - -const simpleRemoveObject = src.remove('simple', simpleObject); - -console.log('simple object', simpleRemoveObject, simpleObject, simpleRemoveObject === simpleObject); - -const simpleRemoveArray = src.remove(0, simpleArray); - -console.log('simple array', simpleRemoveArray, simpleArray, simpleRemoveArray === simpleArray); - -const deepRemoveObject = src.remove('deeply[0].nested["object with quoted keys"]', deepObject); - -console.log('deep object', deepRemoveObject, deepObject, deepRemoveObject === deepObject); - -const deepRemoveArray = src.remove('deeply.nested[0]', deepArray); - -console.log('deep array', deepRemoveArray, deepArray, deepRemoveArray === deepArray); - -const deepRemoveArrayInvalid = src.remove('foo.bar.baz', deepArray); - -console.log('deep array invalid', deepRemoveArrayInvalid, deepArray, deepRemoveArrayInvalid === deepArray); - -console.groupEnd('remove'); - -console.group('set'); - -const simpleSetObject = src.set('simple', 'new value', simpleObject); - -console.log('simple object', simpleSetObject, simpleObject, simpleSetObject === simpleObject); - -const simpleSetArray = src.set(1, 'new value', simpleArray); - -console.log('simple array', simpleSetArray, simpleArray, simpleSetArray === simpleArray); - -const deepSetObject = src.set('deeply[0].nested["object with quoted keys"]', 'new value', deepObject); - -console.log('deep object', deepSetObject, deepObject, deepSetObject === deepObject); - -const deepSetArray = src.set('deeply.nested[0]', 'new value', deepArray); - -console.log('deep array', deepSetArray, deepArray, deepSetArray === deepArray); - -console.groupEnd('set'); - -console.group('transform'); - -const additionalParam = 'additionalParam'; - -const simpleTransformObject = src.transform( - 'simple', - (value, ...extra) => { - console.log(value, extra); - - return 'new value'; - }, - simpleObject, - additionalParam -); - -console.log('simple object', simpleTransformObject, simpleObject, simpleTransformObject === simpleObject); - -const simpleTransformArray = src.transform( - 1, - (value, ...extra) => { - console.log(value, extra); - - return 'new value'; - }, - simpleArray, - additionalParam -); - -console.log('simple array', simpleTransformArray, simpleArray, simpleTransformArray === simpleArray); - -const deepTransformObject = src.transform( - 'deeply[0].nested["object with quoted keys"]', - (value, ...extra) => { - console.log(value, extra); - - return 'new value'; - }, - deepObject, - additionalParam -); - -console.log('deep object', deepTransformObject, deepObject, deepTransformObject === deepObject); - -const deepTransformArray = src.transform( - 'deeply.nested[0]', - (value, ...extra) => { - console.log(value, extra); - - return 'new value'; - }, - deepArray, - additionalParam -); - -console.log('deep array', deepTransformArray, deepArray, deepTransformArray === deepArray); - -console.groupEnd('transform'); - -document.body.style.backgroundColor = '#1d1d1d'; -document.body.style.color = '#d5d5d5'; -document.body.style.margin = 0; -document.body.style.padding = 0; - -const div = document.createElement('div'); - -div.textContent = 'Check the console for details.'; - -document.body.appendChild(div); diff --git a/DEV_ONLY/App.ts b/DEV_ONLY/App.ts new file mode 100644 index 0000000..ef75914 --- /dev/null +++ b/DEV_ONLY/App.ts @@ -0,0 +1,662 @@ +import * as src from '../src'; +// import * as src from '../dist/unchanged'; +// import * as src from '../dist/unchanged.cjs'; +// import * as src from '../dist/unchanged.esm'; +import { assoc } from 'ramda'; + +// import '../benchmarks'; + +document.body.style.backgroundColor = '#1d1d1d'; +document.body.style.color = '#d5d5d5'; +document.body.style.margin = '0px'; +document.body.style.padding = '0px'; + +const div = document.createElement('div'); + +div.textContent = 'Check the console for details.'; + +document.body.appendChild(div); + +const object = { + bar: 'baz', + foo: [{ bar: { baz: 'quz' } }], +}; + +const result = src.merge( + ['foo', 0, 'bar'], + { + baz: 'nope', + quz: 'blah', + }, + object, +); + +const foo = (() => { + class Foo { + constructor(value: any) { + this.value = value; + } + + value: any; + + getValue() { + return this.value; + } + } + + return new Foo('foo'); +})(); + +const simpleObject = { + foo, + regexp: /regexp/, + simple: 'value', +}; + +const simpleArray = ['simple', 'value']; + +const deepObject = { + deeply: [ + { + nested: { + 'object with quoted keys': 'value', + }, + untouched: true, + }, + 'untouched', + ], + untouched: true, +}; + +const deepArray = { + deeply: { + nested: ['array'], + untouched: true, + }, + untouched: true, +}; + +console.group('legend'); + +console.log('title | updated object | original object | are objects equal'); + +console.groupEnd(); + +console.log(result, object); + +console.log(src.add('d.f', 'df', { d: { f: [] } })); +console.log(src.add(['d', 'f'], 'df', { d: { f: [] } })); + +console.log(assoc('0', 'value', foo)); +console.log(src.set(0, 'value', foo)); + +console.group('add'); + +const simpleAddObject = src.add('["other key"]', 'new value', simpleObject); + +console.log( + 'simple object', + simpleAddObject, + simpleObject, + simpleAddObject === simpleObject, +); + +console.log(simpleObject.regexp); + +const simpleFoo = src.add('regexp.something', 'else', simpleObject); + +console.log( + 'custom prototype', + simpleFoo, + simpleObject, + simpleFoo === simpleObject, +); + +const simpleAddArray = src.add(null, 'new value', simpleArray); + +console.log( + 'simple array', + simpleAddArray, + simpleArray, + simpleAddArray === simpleArray, +); + +const deepAddObject = src.add( + 'deeply[0].nested["other key"]', + 'new value', + deepObject, +); + +console.log( + 'deep object', + deepAddObject, + deepObject, + deepAddObject === deepObject, +); + +const deepAddArray = src.add('deeply.nested', 'new value', deepArray); + +console.log('deep array', deepAddArray, deepArray, deepAddArray === deepArray); + +console.groupEnd(); + +console.group('assign'); + +const simpleAssignObject = src.assign( + null, + { + different: 'value', + simple: 'thing', + }, + simpleObject, +); + +console.log( + 'simple object', + simpleAssignObject, + simpleObject, + simpleAssignObject === simpleObject, +); + +const simpleAssignArray = src.assign(null, ['different', 'value'], simpleArray); + +console.log( + 'simple array', + simpleAssignArray, + simpleArray, + simpleAssignArray === simpleArray, +); + +const deepAssignObject = src.assign( + 'deeply[0].nested', + { + different: 'value', + 'object with quoted keys': 'thing', + }, + deepObject, +); + +console.log( + 'deep object', + deepAssignObject, + deepObject, + deepAssignObject === deepObject, +); + +const deepAssignArray = src.assign( + 'deeply.nested', + ['different', 'value'], + deepArray, +); + +console.log( + 'deep array', + deepAssignArray, + deepArray, + deepAssignArray === deepArray, +); + +console.groupEnd(); + +console.group('call'); + +const simpleCallObject = Object.assign({}, simpleObject, { + method: (foo: any, bar: any): string => { + console.log(foo, bar); + console.log('simple scope', this); + + return 'baz'; + }, +}); + +type MethodParam = { + quz: string; +}; + +const deepCallObject = Object.assign({}, deepObject, { + deeply: { + nested: [ + function method({ quz }: MethodParam) { + console.log('deep scope', this); + + return quz; + }, + ], + }, +}); + +console.log(src.get('deeply.nested[0]', deepCallObject)); + +console.log( + 'simple method found', + src.call('method', ['foo', 'bar'], simpleCallObject), +); +console.log( + 'simple method not method', + src.call('simple', ['foo', 'bar'], simpleCallObject), +); +console.log( + 'simple method not found', + src.call('nope', ['foo', 'bar'], simpleCallObject), +); +console.log( + 'simple method matches validator', + src.callWith( + (value: any): boolean => value, + 'method', + ['foo', 'bar'], + simpleCallObject, + ), +); +console.log( + 'simple method does not match validator', + src.callWith( + (value: any): boolean => value.toString(), + 'method', + ['foo', 'bar'], + simpleCallObject, + ), +); + +console.log( + 'native method', + src.call( + 'forEach', + [(value: any) => console.log('value', value)], + ['foo', 'bar'], + ), +); + +console.log( + 'deep method found', + src.call('deeply.nested[0]', [{ quz: 'quz' }], deepCallObject), +); +console.log( + 'deep method found with custom scope', + src.call('deeply.nested[0]', [{ quz: 'quz' }], deepCallObject, { + custom: 'scope', + }), +); +console.log( + 'deep method not method', + src.call('deeply.untouched', [{ quz: 'quz' }], deepCallObject), +); +console.log( + 'deep method not found', + src.call('deeply.nope', [{ quz: 'quz' }], deepCallObject), +); +console.log( + 'deep method matches validator', + src.callWith( + (value: any): any => value as unchanged.withHandler, + 'deeply.nested[0]', + [{ quz: 'quz' }], + deepCallObject, + ), +); +console.log( + 'deep method does not match validator', + src.callWith( + (value: any) => value.toString() as unchanged.withHandler, + 'deeply.nested[0]', + [{ quz: 'quz' }], + deepCallObject, + ), +); + +console.log( + 'window test', + src.call(['addEventListener'], ['click', () => console.log('foo')], window), +); + +class Bar { + constructor(value: any) { + this.value = value; + } + + value: any; + + __getValue() { + return this.value; + } + + getValue() { + return src.call(['__getValue'], [], this); + } +} + +console.log('class test', src.call(['getValue'], [], new Bar('bar'))); + +console.groupEnd(); + +console.group('get'); + +console.log('simple object', src.get('simple', simpleObject)); +console.log('simple array', src.get(1, simpleArray)); +console.log( + 'deep object', + src.get('deeply[0].nested["object with quoted keys"]', deepObject), +); +console.log( + 'deep array', + src.get('[0].nested["object with quoted keys"]', deepObject.deeply), +); + +console.groupEnd(); + +console.group('getWithOr'); + +const gwoGetter = (value: any): boolean => value === 'value'; + +console.log( + 'simple object true', + src.getWithOr(gwoGetter, 'fallback', 'simple', simpleObject), +); +console.log( + 'simple object false', + src.getWithOr(gwoGetter, 'fallback', 'nope', simpleObject), +); +console.log( + 'simple array true', + src.getWithOr(gwoGetter, 'fallback', 1, simpleArray), +); +console.log( + 'simple array false', + src.getWithOr(gwoGetter, 'fallback', 10, simpleArray), +); +console.log( + 'deep object true', + src.getWithOr( + gwoGetter, + 'fallback', + 'deeply[0].nested["object with quoted keys"]', + deepObject, + ), +); +console.log( + 'deep object false', + src.getWithOr(gwoGetter, 'fallback', 'deeply[0].nested.nope', deepObject), +); +console.log( + 'deep array true', + src.getWithOr( + gwoGetter, + 'fallback', + '[0].nested["object with quoted keys"]', + deepObject.deeply, + ), +); +console.log( + 'deep array false', + src.getWithOr(gwoGetter, 'fallback', '[0].nested.nope', deepObject.deeply), +); + +console.groupEnd(); + +console.group('has'); + +console.log('simple object true', src.has('simple', simpleObject)); +console.log('simple object false', src.has('complex', simpleObject)); +console.log('simple array true', src.has(1, simpleArray)); +console.log('simple array false', src.has(7, simpleArray)); +console.log( + 'deep object true', + src.has('deeply[0].nested["object with quoted keys"]', deepObject), +); +console.log( + 'deep object false', + src.has('deeply[0].nested["non-existent object"]', deepObject), +); +console.log( + 'deep array true', + src.has('[0].nested["object with quoted keys"]', deepObject.deeply), +); +console.log( + 'deep array false', + src.has('[0].nested["non-existent object"]', deepObject.deeply), +); +console.log( + 'simple object passes validator', + src.hasWith((value: any) => typeof value === 'string', 'simple', simpleObject), +); +console.log( + 'simple object fails validator', + src.hasWith((value: any) => typeof value === 'number', 'simple', simpleObject), +); +console.log( + 'simple array passes validator', + src.hasWith((value: any) => typeof value === 'string', 1, simpleArray), +); +console.log( + 'simple array fails validator', + src.hasWith((value: any) => typeof value === 'number', 1, simpleArray), +); + +console.groupEnd(); + +console.group('merge'); + +const simpleMergeObject = src.merge( + null, + { + different: 'value', + simple: 'thing', + }, + simpleObject, +); + +console.log( + 'simple object', + simpleMergeObject, + simpleObject, + simpleMergeObject === simpleObject, +); + +const simpleMergeArray = src.merge(null, ['different', 'value'], simpleArray); + +console.log( + 'simple array', + simpleMergeArray, + simpleArray, + simpleMergeArray === simpleArray, +); + +const deepMergeObject = src.merge( + 'deeply[0].nested', + { + different: 'value', + 'object with quoted keys': 'thing', + }, + deepObject, +); + +console.log( + 'deep object', + deepMergeObject, + deepObject, + deepMergeObject === deepObject, +); + +const deepMergeArray = src.merge( + 'deeply.nested', + ['different', 'value'], + deepArray, +); + +console.log( + 'deep array', + deepMergeArray, + deepArray, + deepMergeArray === deepArray, +); + +console.groupEnd(); + +console.group('remove'); + +const simpleRemoveObject = src.remove('simple', simpleObject); + +console.log( + 'simple object', + simpleRemoveObject, + simpleObject, + simpleRemoveObject === simpleObject, +); + +const simpleRemoveArray = src.remove(0, simpleArray); + +console.log( + 'simple array', + simpleRemoveArray, + simpleArray, + simpleRemoveArray === simpleArray, +); + +const deepRemoveObject = src.remove( + 'deeply[0].nested["object with quoted keys"]', + deepObject, +); + +console.log( + 'deep object', + deepRemoveObject, + deepObject, + deepRemoveObject === deepObject, +); + +const deepRemoveArray = src.remove('deeply.nested[0]', deepArray); + +console.log( + 'deep array', + deepRemoveArray, + deepArray, + deepRemoveArray === deepArray, +); + +const deepRemoveArrayInvalid = src.remove('foo.bar.baz', deepArray); + +console.log( + 'deep array invalid', + deepRemoveArrayInvalid, + deepArray, + deepRemoveArrayInvalid === deepArray, +); + +console.groupEnd(); + +console.group('set'); + +const simpleSetObject = src.set('simple', 'new value', simpleObject); + +console.log( + 'simple object', + simpleSetObject, + simpleObject, + simpleSetObject === simpleObject, +); + +const simpleSetArray = src.set(1, 'new value', simpleArray); + +console.log( + 'simple array', + simpleSetArray, + simpleArray, + simpleSetArray === simpleArray, +); + +const deepSetObject = src.set( + 'deeply[0].nested["object with quoted keys"]', + 'new value', + deepObject, +); + +console.log( + 'deep object', + deepSetObject, + deepObject, + deepSetObject === deepObject, +); + +const deepSetArray = src.set('deeply.nested[0]', 'new value', deepArray); + +console.log('deep array', deepSetArray, deepArray, deepSetArray === deepArray); + +console.groupEnd(); + +console.group('setWith'); + +const additionalParam = 'additionalParam'; + +const simpleTransformObject = src.setWith( + (value: any, ...extra: any[]) => { + console.log(value, extra); + + return 'new value'; + }, + 'simple', + simpleObject, + additionalParam, +); + +console.log( + 'simple object', + simpleTransformObject, + simpleObject, + simpleTransformObject === simpleObject, +); + +const simpleTransformArray = src.setWith( + (value: any, ...extra: any[]) => { + console.log(value, extra); + + return 'new value'; + }, + 1, + simpleArray, + additionalParam, +); + +console.log( + 'simple array', + simpleTransformArray, + simpleArray, + simpleTransformArray === simpleArray, +); + +const deepTransformObject = src.setWith( + (value: any, ...extra: any[]) => { + console.log(value, extra); + + return 'new value'; + }, + 'deeply[0].nested["object with quoted keys"]', + deepObject, + additionalParam, +); + +console.log( + 'deep object', + deepTransformObject, + deepObject, + deepTransformObject === deepObject, +); + +const deepTransformArray = src.setWith( + (value: any, ...extra: any[]) => { + console.log(value, extra); + + return 'new value'; + }, + 'deeply.nested[0]', + deepArray, + additionalParam, +); + +console.log( + 'deep array', + deepTransformArray, + deepArray, + deepTransformArray === deepArray, +); + +console.groupEnd(); diff --git a/README.md b/README.md index debb612..185c3b7 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,35 @@ # unchanged -A tiny (~1.9kB minified+gzipped), [fast](https://github.com/planttheidea/unchanged/blob/master/benchmark_results.csv), unopinionated handler for updating JS objects and arrays immutably. +A tiny (~2.0kB minified+gzipped), [fast](https://github.com/planttheidea/unchanged/blob/master/benchmark_results.csv), unopinionated handler for updating JS objects and arrays immutably. -Supports nested key paths via path arrays or [dot-bracket syntax](https://github.com/planttheidea/pathington), and all methods are curriable (with placeholder support) for composability. Can be a drop-in replacement for the `lodash/fp` methods `get`, `set`, `merge`, and `omit` with a 90% smaller footprint. +Supports nested key paths via path arrays or [dotty syntax](https://github.com/planttheidea/pathington), and all methods are curriable (with placeholder support) for composability. Can be a drop-in replacement for the `lodash/fp` methods `get`, `set`, `merge`, and `omit` with a 90% smaller footprint. ## Table of contents - [Usage](#usage) -- [Methods](#methods) +- [Types](#types) +- [Standard methods](#methods) - [get](#get) - [getOr](#getor) - [set](#set) - [remove](#remove) - [has](#has) + - [is](#is) - [add](#add) - [merge](#merge) - [assign](#assign) - [call](#call) - - [transform](#transform) +- [Transform methods] + - [getWith](#getwith) + - [getWithOr](#getwithor) + - [setWith](#setwith) + - [removeWith](#removewith) + - [hasWith](#haswith) + - [isWith](#iswith) + - [addWith](#addwith) + - [mergeWith](#mergewith) + - [assignWith](#assignwith) + - [callWith](#callwith) - [Additional objects](#additional-objects) - [\_\_](#__) - [Differences from other libraries](#differences-from-other-libraries) @@ -29,21 +41,32 @@ Supports nested key paths via path arrays or [dot-bracket syntax](https://github ## Usage -```javascript +```typescript import { __, add, + addWith, assign, + assignWith, call, + callWith, get, + getWith, getOr, + getWithOr, + has, + hasWith, + is, + isWith, merge, + mergeWith, remove, + removeWith, set, - transform + setWith } from "unchanged"; -const object = { +const object: unchanged.Unchangeable = { foo: "foo", bar: [ { @@ -63,22 +86,52 @@ const removeBaz = remove("bar[0].baz"); const sansBaz = removeBaz(object); ``` -NOTE: There is no `default` export, so if you want to import all methods to a single namespace you should use the `import *` syntax: +**NOTE**: There is no `default` export, so if you want to import all methods to a single namespace you should use the `import *` syntax: -```javascript +```typescript import * as uc from "unchanged"; ``` -## Methods +## Types -#### get +This library is both written in, and provided with, types by TypeScript. The internal types used for specific parameters are scoped to the `unchanged` namespace. -`get(path: (Array|number|string), object: (Array|Object)): any` +```typescript +// the path used to compute nested locations +type Path = (number | string)[] | number | string; +// the callback used in transform methods +type withHandler = (value: any, ...extraParams: any[]) => any; +// the generic object that is computed upon, either an array or object +interface Unchangeable { + [key: string]: any; + [index: number]: any; +} +``` + +Notice in the `Unchangeable` interface, there is no reference to symbols. That is because to date, TypeScript does not support Symbols as an index type. If you need to use symbols as object keys, the best workaround I've found is to typecast when it complains: + +```typescript +const symbolKey: string = (Symbol("key") as unknown) as string; + +const object: { [symbolKey]: string } = { + [symbolKey]: "bar" +}; +``` + +If there is a better alternative for having dynamic Symbol indices, let me know! Happy to accept any PRs from those more experienced in TypeScript than myself. + +## Standard methods + +### get + +```typescript +function get(path: unchanged.Path, object: unchanged.Unchangeable): any; +``` Get the value at the `path` requested on the `object` passed. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { foo: [ { bar: "baz" @@ -90,14 +143,20 @@ console.log(get("foo[0].bar", object)); // baz console.log(get(["foo", 0, "bar"], object)); // baz ``` -#### getOr +### getOr -`getOr(fallbackValue: any, path: (Array|number|string), object: (Array|Object)): any` +```typescript +function getOr( + fallbackValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable +): any; +``` Get the value at the `path` requested on the `object` passed, with a fallback value if that path does not exist. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { foo: [ { bar: "baz" @@ -110,14 +169,20 @@ console.log(getOr("blah", ["foo", 0, "bar"], object)); // baz console.log(getOr("blah", "foo[0].nonexistent", object)); // blah ``` -#### set +### set -`set(path: (Array|number|string), value: any, object: (Array|object)): (Array|Object)` +```typescript +function set( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` -Returns a new clone of the `object` passed, with the `value` assigned to the final key on the `path` specified. +Returns a new object based on the `object` passed, with the `value` assigned to the final key on the `path` specified. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { foo: [ { bar: "baz" @@ -129,14 +194,19 @@ console.log(set("foo[0].bar", "quz", object)); // {foo: [{bar: 'quz'}]} console.log(set(["foo", 0, "bar"], "quz", object)); // {foo: [{bar: 'quz'}]} ``` -#### remove +### remove -`remove(path: (Array|number|string), object: (Array|object)): (Array|Object)` +```typescript +function remove( + path: unchanged.Path, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` -Returns a new clone of the `object` passed, with the final key on the `path` removed if it exists. +Returns a new object based on the `object` passed, with the final key on the `path` removed if it exists. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { foo: [ { bar: "baz" @@ -148,14 +218,16 @@ console.log(remove("foo[0].bar", object)); // {foo: [{}]} console.log(remove(["foo", 0, "bar"], object)); // {foo: [{}]} ``` -#### has +### has -`has(path: (Array|number|string), object: (Array|object)): boolean` +```typescript +function has(path: unchanged.Path, object: unchanged.Unchangeable): boolean; +``` Returns `true` if the object has the path provided, `false` otherwise. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { foo: [ { bar: "baz" @@ -168,14 +240,46 @@ console.log(has(["foo", 0, "bar"], object)); // true console.log(has("bar", object)); // false ``` -#### add +### is -`add(path: (Array|number|string), value: any, object: (Array|object)): (Array|Object)` +```typescript +function is( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable +): boolean; +``` -Returns a new clone of the `object` passed, with the `value` added at the `path` specified. This can have different behavior depending on whether the item is an `Object` or an `Array`. +Returns `true` if the value at the `path` in `object` is equal to `value` based on [SameValueZero](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Same-value-zero_equality) equality. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz" + } + ] +}; + +console.log(is("foo[0].bar", "baz", object)); // true +console.log(is(["foo", 0, "bar"], "baz", object)); // true +console.log(is("foo[0].bar", "quz', object)); // false +``` + +### add + +```typescript +function add( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` + +Returns a new object based on the `object` passed, with the `value` added at the `path` specified. This can have different behavior depending on whether the item is an object or an array; objects will simply add / set the key provided, whereas arrays will add a new value to the end. + +```typescript +const object: unchanged.Unchangeable = { foo: [ { bar: 'baz' @@ -194,39 +298,52 @@ console.log(add(['foo', 0, 'quz'], 'added value', object)); // {foo: [{bar: 'baz Notice that the `Object` usage is idential to the `set` method, where a key needs to be specified for assignment. In the case of an `Array`, however, the value is pushed to the array at that key. -NOTE: If you want to add an item to a top-level array, pass `null` as the key: +**NOTE**: If you want to add an item to a top-level array, pass `null` as the key: -```javascript +```typescript const object = ["foo"]; console.log(add(null, "bar", object)); // ['foo', 'bar'] ``` -#### merge +### merge -`merge(path: (Array|number|string), value: any, object: (Array|object)): (Array|Object)` +```typescript +function merge( + path: unchanged.Path, + value: unchanged.Unchangeable, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` Returns a new object that is a deep merge of `value` into `object` at the `path` specified. If you want to perform a shallow merge, see [`assign`](#assign). -```javascript -const object1 = { - oneSpecific: "value", - object: { +```typescript +const object1: unchanged.Unchangeable = { + foo: "bar", + baz: { one: "value1", + deeply: { + nested: "value", + untouched: true + }, two: "value2" } }; -const object2 = { +const object2: unchanged.Unchangeable = { one: "new value", + deeply: { + nested: "other value" + }, three: "value3" }; -console.log(merge("object", object2, object1)); +console.log(merge("baz", object2, object1)); /* { - oneSpecific: 'value', - object: { - one: 'value1', + foo: 'bar', + baz: { + one: 'new value', deeply: { nested: 'other value', untouched: true, @@ -235,15 +352,48 @@ console.log(merge("object", object2, object1)); three: 'value3 } } +``` + +**NOTE**: If you want to `merge` the entirety of both objects, pass `null` as the key: + +```typescript +console.log(merge(null, object2, object1)); +/* +{ + foo: "bar", + baz: { + one: "value1", + deeply: { + nested: "value", + untouched: true + }, + two: "value2" + }, + one: "new value", + deeply: { + nested: "other value" + }, + three: "value3" +} */ ``` -NOTE: If you want to `merge` the entirety of both objects, pass `null` as the key: +### assign -```javascript -const object1 = { - oneSpecific: "value", - object: { +```typescript +function assign( + path: unchanged.Path, + value: unchanged.Unchangeable, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` + +Returns a new object that is a shallow merge of `value` into `object` at the `path` specified. If you want to perform a deep merge, see [`merge`](#merge). + +```typescript +const object1: unchanged.Unchangeable = { + foo: "bar", + baz: { one: "value1", deeply: { nested: "value", @@ -252,7 +402,7 @@ const object1 = { two: "value2" } }; -const object2 = { +const object2: unchanged.Unchangeable = { one: "new value", deeply: { nested: "other value" @@ -260,75 +410,429 @@ const object2 = { three: "value3" }; -console.log(merge(null, object2, object1)); +console.log(assign("baz", object2, object1)); /* { - one: 'new value', - oneSpecific: 'value', - object: { - one: 'value1', + foo: 'bar', + baz: { + one: 'new value', deeply: { - nested: 'value', - untouched: true, + nested: 'other value', }, two: 'value2', + three: 'value3 + } +} +``` + +**NOTE**: If you want to `assign` the entirety of both objects, pass `null` as the key: + +```typescript +console.log(assign(null, object2, object1)); +/* +{ + foo: "bar", + baz: { + one: "value1", + deeply: { + nested: "value", + untouched: true + }, + two: "value2" }, + one: "new value", deeply: { - nested: 'other value', + nested: "other value" }, - three: 'value3 + three: "value3" } */ ``` -#### assign +### call -`assign(path: (Array|number|string), value: any, object: (Array|object)): (Array|Object)` +```typescript +function call( + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable, + context?: any = object +): any; +``` -Returns a new object that is a shallow merge of `value` into `object` at the `path` specified. If you want to perform a deep merge, see [`merge`](#merge). +Call the method at the `path` requested on the `object` passed, and return what it's call returns. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar(a, b) { + return a + b; + } + } + ] +}; + +console.log(call("foo[0].bar", [1, 2], object)); // 3 +console.log(call(["foo", 0, "bar"], [1, 2], object)); // 3 +``` + +You can also provide an optional fourth parameter of `context`, which will be the `this` value in the method call. This will default to the `object` itself. + +```typescript +const object: unchanged.Unchangeable = { + calculate: true, + foo: [ + { + bar(a, b) { + return this.calculate ? a + b : 0; + } + } + ] +}; + +console.log(call("foo[0].bar", [1, 2], object)); // 3 +console.log(call("foo[0].bar", [1, 2], object, {})); // 0 +``` + +**NOTE**: Because `context` is optional, it cannot be independently curried; you must apply it in the call when the `object` is passed. + +## Transform methods + +Each standard method has it's own related `With` method, which accepts a callback `fn` as the first curried parameter. In most cases this callback serves as a transformer for the value retrieved, set, merged, etc.; the exception is `removeWith`, where the callback serves as a validator as to whether to remove or not. + +The signature of all callbacks is the `withHandler` specified in [`Types`](#types). Because `extraParams` are optional parameters, they cannot be independently curried; you must apply them in the call when the `object` is passed. + +### getWith + +```typescript +function getWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraParams?: any[] +): any; +``` + +Get the return value of `fn` based on the value at the `path` requested on the `object` passed. `fn` is called with the current value at the `path` as the first parameter, and any additional parameters passed as `extraParams` following that. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz" + } + ] +}; +const fn: unchanged.withHandler = (value: any, nullValue: any): any => + currentValue === nullValue ? null : currentValue; + +console.log(getWith(fn, "foo[0].bar", object)); // 'baz' +console.log(getWith(fn, "foo[0].bar", object, "baz")); // null +console.log(getWith(fn, ["foo", 0, "bar"], object)); // 'baz' +console.log(getWith(fn, ["foo", 0, "bar"], object, "baz")); // null +``` + +### getWithOr + +```typescript +function getWithOr( + fn: unchanged.withHandler, + fallbackValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraParams?: any[] +): any; +``` + +Get the return value of `fn` based on the value at the `path` requested on the `object` passed, falling back to `fallbackValue` when no match is found at `path`. When a match is found, `fn` is called with the current value at the `path` as the first parameter, and any additional parameters passed as `extraParams` following that. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz" + } + ] +}; +const fn: unchanged.withHandler = (value: any, nullValue: any): any => + currentValue === nullValue ? null : currentValue; + +console.log(getWithOr(fn, "quz", "foo[0].bar", object)); // 'baz' +console.log(getWithOr(fn, "quz", "foo[0].bar", object, "baz")); // null +console.log(getWithOr(fn, "quz", "foo[0].notFound", object, "baz")); // 'quz' +console.log(getWithOr(fn, "quz", ["foo", 0, "bar"], object)); // 'baz' +console.log(getWithOr(fn, "quz", ["foo", 0, "bar"], object, "baz")); // null +console.log(getWithOr(fn, "quz", ["foo", 0, "notFound"], object, "baz")); // 'quz' +``` + +### setWith + +```typescript +function setWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraParams?: any[] +): unchanged.Unchangeable; +``` + +Returns a new object based on the `object` passed, with the return value of `fn` assigned to the final key on the `path` specified. `fn` is called with the current value at the `path` as the first parameter, and any additional parameters passed as `extraParams` following that. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz" + } + ] +}; +const fn: unchanged.withHandler = (value: any, preventUpdate: boolean): any => + preventUpdate ? currentValue : "quz"; + +console.log(setWith(fn, "foo[0].bar", object)); // {foo: [{bar: 'quz'}]} +console.log(setWith(fn, "foo[0].bar", object, true)); // {foo: [{bar: 'baz'}]} +console.log(setWith(fn, ["foo", 0, "bar"], object)); // {foo: [{bar: 'quz'}]} +console.log(setWith(fn, ["foo", 0, "bar"], object, true)); // {foo: [{bar: 'baz'}]} +``` + +### removeWith + +```typescript +function removeWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraParams?: any[] +): unchanged.Unchangeable; +``` + +Returns a new object based on the `object` passed, with the final key on the `path` removed if it exists and the return from `fn` is truthy. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz" + } + ] +}; +const fn: unchanged.withHandler = ( + value: any, + shouldNotRemove: boolean +): boolean => !shouldNotRemove && value === "baz"; + +console.log(removeWith(fn, "foo[0].bar", object)); // {foo: [{}]} +console.log(removeWith(fn, "foo[0].bar", object, true)); // {foo: [{bar: 'baz'}]} +console.log(removeWith([fn, "foo", 0, "bar"], object)); // {foo: [{}]} +console.log(removeWith([fn, "foo", 0, "bar"], object, true)); // {foo: [{bar: 'baz'}]} +``` + +### hasWith + +```typescript +function hasWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraParams?: any[] +): boolean; +``` + +Returns `true` if the return value of `fn` based on the value returned from `path` in the `object` returns truthy, `false` otherwise. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz" + } + ] +}; +const fn: unchanged.withHandler = ( + value: any, + shouldBeNull: boolean +): boolean => (shouldBeNull ? value === null : value === "baz"); + +console.log(hasWith(fn, "foo[0].bar", object)); // true +console.log(hasWith(fn, "foo[0].bar", object, true)); // false +console.log(hasWith(fn, ["foo", 0, "bar"], object)); // true +console.log(hasWith(fn, ["foo", 0, "bar"], object, true)); // false +console.log(hasWith(fn, "bar", object)); // false +``` + +### isWith -```javascript -const object1 = { - oneSpecific: "value", - object: { +```typescript +function isWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable +): boolean; +``` + +Returns `true` if the return value of `fn` based on the value returned from `path` in the `object` is equal to `value` based on [SameValueZero](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Same-value-zero_equality) equality. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz", + quz: "not baz" + } + ] +}; +const fn: unchanged.withHandler = (value: any): number => + value && value.length === 3; + +console.log(isWith(fn, "foo[0].bar", object)); // true +console.log(isWith(fn, ["foo", 0, "bar"], object)); // true +console.log(isWith(fn, "foo[0].quz", object)); // false +``` + +### addWith + +```typescript +function addWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` + +Returns a new object based on the `object` passed, with the return value of `fn` added at the `path` specified. This can have different behavior depending on whether the item is an object or an array; objects will simply add / set the key provided, whereas arrays will add a new value to the end. + +```typescript +const object: unchanged.Unchangeable = { + foo: [ + { + bar: "baz" + } + ] +}; +const fn: unchanged.withHandler = (value: any) => + value + ? value + .split("") + .reverse() + .join("") + : "new value"; + +// object +console.log(addWith(fn, "foo", object)); // {foo: [{bar: 'baz'}, 'new value']} +console.log(addWith(fn, ["foo"], object)); // {foo: [{bar: 'baz'}, 'new value']} + +// array +console.log(addWith(fn, "foo[0].bar", object)); // {foo: [{bar: 'zab'}]} +console.log(addWith(fn, ["foo", 0, "bar"], object)); // {foo: [{bar: 'zab''}]} +``` + +### mergeWith + +```typescript +function mergeWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` + +Returns a new object that is a deep merge of the return value of `fn` into `object` at the `path` specified if a valid mergeable object, else returns the original object. If you want to perform a shallow merge, see [`assignWith`](#assignwith). + +```typescript +const object1: unchanged.Unchangeable = { + foo: "bar", + baz: { one: "value1", deeply: { nested: "value", - untouched: false + untouched: true }, two: "value2" } }; -const object2 = { +const object2: unchanged.Unchangeable = { one: "new value", deeply: { nested: "other value" }, three: "value3" }; +const fn: unchanged.withHandler = (value: any) => + value && value.one === "value1" ? object2 : null; -console.log(assign("object", object2, object1)); +console.log(mergeWith(fn, "baz", object1)); /* { - oneSpecific: 'value', - object: { - one: 'value1', + foo: 'bar', + baz: { + one: 'new value', deeply: { nested: 'other value', + untouched: true, }, two: 'value2', three: 'value3 } } */ +console.log(mergeWith(fn, "baz.deeply", object1)); +/* +// untouched object1 +{ + foo: "bar", + baz: { + one: "value1", + deeply: { + nested: 'value', + untouched: true, + }, + two: "value2" + } +} +*/ ``` -NOTE: If you want to `assign` the entirety of both objects, pass `null` as the key: +**NOTE**: If you want to `merge` the entirety of both objects, pass `null` as the key: -```javascript -const object1 = { - oneSpecific: "value", - object: { +```typescript +console.log(mergeWith(fn, null, object1)); +/* +{ + foo: "bar", + baz: { + one: "value1", + deeply: { + nested: "value", + untouched: true + }, + two: "value2" + }, + one: "new value", + deeply: { + nested: "other value" + }, + three: "value3" +} +*/ +``` + +### assignWith + +```typescript +function assignWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable +): unchanged.Unchangeable; +``` + +Returns a new object that is a shallow merge of the return value of `fn` into `object` at the `path` specified if a valid mergeable object, else returns the original object. If you want to perform a deep merge, see [`mergeWith`](#mergeWith). + +```typescript +const object1: unchanged.Unchangeable = { + foo: "bar", + baz: { one: "value1", deeply: { nested: "value", @@ -337,43 +841,62 @@ const object1 = { two: "value2" } }; -const object2 = { +const object2: unchanged.Unchangeable = { one: "new value", deeply: { nested: "other value" }, three: "value3" }; +const fn: unchanged.withHandler = (value: any) => + value && value.one === "value1" ? object2 : null; -console.log(assign(null, object2, object1)); +console.log(assignWith(fn, "baz", object1)); /* { - one: 'new value', - oneSpecific: 'value', - object: { - one: 'value1', + foo: 'bar', + baz: { + one: 'new value', + deeply: { + nested: 'other value', + }, + two: 'value2', + three: 'value3 + } +} +*/ +console.log(assignWith(fn, "baz.deeply", object1)); +/* +// untouched object1 +{ + foo: "bar", + baz: { + one: "value1", deeply: { nested: 'value', untouched: true, }, - two: 'value2', - }, - deeply: { - nested: 'other value', - }, - three: 'value3 + two: "value2" + } } */ ``` -#### call +### callWith -`call(path: (Array|number|string), parameters: Array, object: (Array|Object)[, context: any])` +```typescript +function callWith( + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable, + context?: any = object +): any; +``` -Call the method at the `path` requested on the `object` passed, and return what it's call returns. +Call the method returned from `fn` based on the `path` specified on the `object`, and if a function return what it's call returns. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { foo: [ { bar(a, b) { @@ -382,15 +905,21 @@ const object = { } ] }; - -console.log(call("foo[0].bar", [1, 2], object)); // 3 -console.log(call(["foo", 0, "bar"], [1, 2], object)); // 3 +const fn: unchanged.withHandler = (value: any): any => + typeof value === fn + ? fn + : () => + console.error("Error: Requested call of a method that does not exist."); + +console.log(callWith(fn, "foo[0].bar", [1, 2], object)); // 3 +console.log(callWith(fn, ["foo", 0, "bar"], [1, 2], object)); // 3 +callWith(fn, "foo[1].nope", object); // Error: Requested call of a method that does not exist. ``` You can also provide an optional fourth parameter of `context`, which will be the `this` value in the method call. This will default to the `object` itself. -```javascript -const object = { +```typescript +const object: unchanged.Unchangeable = { calculate: true, foo: [ { @@ -400,45 +929,25 @@ const object = { } ] }; - -console.log(call("foo[0].bar", [1, 2], object)); // 3 -console.log(call("foo[0].bar", [1, 2], object, {})); // 0 -``` - -**NOTE**: Because `context` is an optional parameter, it cannot be independently curried; you must apply it in the call when the `object` is passed. - -#### transform - -`transform(path: (Array|number|string), fn: function, object: (Array|object)[, ...extraParams: Array]): (Array|Object)` - -Returns a new clone of the `object` passed, with the return value of `fn` assigned to the final key on the `path` specified. `fn` is called with the current value at the `path` as the first parameter, and any additional parameters passed as `extraParams` following that. - -```javascript -const object = { - foo: [ - { - bar: "baz" - } - ] -}; -const fn = (currentValue, preventUpdate) => - preventUpdate ? currentValue : "quz"; - -console.log(transform("foo[0].bar", fn, object)); // {foo: [{bar: 'quz'}]} -console.log(transform("foo[0].bar", fn, object, true)); // {foo: [{bar: 'baz'}]} -console.log(transform(["foo", 0, "bar"], fn, object)); // {foo: [{bar: 'quz'}]} -console.log(transform(["foo", 0, "bar"], fn, object, true)); // {foo: [{bar: 'baz'}]} +const fn: unchanged.withHandler = (value: any): any => + typeof value === fn + ? fn + : () => + console.error("Error: Requested call of a method that does not exist."); + +console.log(callWith(fn, "foo[0].bar", [1, 2], object)); // 3 +console.log(callWith(fn, "foo[0].bar", [1, 2], object, {})); // 0 ``` -**NOTE**: Because `extraParams` are optional parameters, they cannot be independently curried; you must apply them in the call when the `object` is passed. +**NOTE**: Because `context` is optional, it cannot be independently curried; you must apply it in the call when the `object` is passed. ## Additional objects -#### \_\_ +### \_\_ A placeholder value used to identify "gaps" in a curried function, allowing for earlier application of arguments later in the argument order. -```javascript +```typescript import {__, set} from 'unchanged'; const thing = { @@ -452,26 +961,35 @@ setFooOnThing('bar'); ## Differences from other libraries -#### lodash +### lodash [`lodash/fp`](https://lodash.com/) (the functional programming implementation of `lodash`) is identical in implementation to `unchanged`'s methods, just with a _10.5x_ larger footprint. These methods should map directly: +- _lodash_ => _unchanged_ - `curry.placeholder` => `__` - `get` => `get` - `getOr` => `getOr` - `merge` => `merge` - `omit` => `remove` -- `set` => `set` (also maps to `add` for objects only) +- `set` => `set` + +### ramda -NOTE: There is no direct parallel for the `add` method in `lodash/fp`; the closest is `concat` but that is array-specific and does not support nested keys. +[`ramda`](http://ramdajs.com/) is similar in its implementation, however the first big difference is that dot-bracket syntax is not supported by `ramda`, only path arrays. The related methods are: -#### ramda +- _ramda_ => _unchanged_ +- `__` => `__` +- `path` => `get` +- `pathOr` => `getOr` +- `merge` => `merge` +- `omit` => `remove` +- `assocPath` => `set` -[`ramda`](http://ramdajs.com/) is similar in its implementation, however the first big difference is that dot-bracket syntax is not supported by `ramda`, only path arrays. Another difference is that the `ramda` methods that clone objects (`assocPath`, for example) only work with objects; arrays are implicitly converted into objects, which can make updating collections challenging. +Another difference is that the `ramda` methods that clone objects (`assocPath`, for example) only work with objects; arrays are implicitly converted into objects, which can make updating collections challenging. The last main difference is the way that objects are copied, example: -```javascript +```typescript function Foo(value) { this.value = value; } @@ -497,7 +1015,7 @@ console.log(unchangedResult instanceof Foo); // true This can make `ramda` more performant in certain scenarios, but at the cost of having potentially unexpected behavior. -#### Other immutability libraries +### Other immutability libraries This includes popular solutions like [Immutable.js](https://facebook.github.io/immutable-js/), [seamless-immutable](https://github.com/rtfeldman/seamless-immutable), [mori](http://swannodette.github.io/mori/), etc. These solutions all work well, but with one caveat: _you need to buy completely into their system_. Each of these libraries redefines how the objects are stored internally, and require that you learn a new, highly specific API to use these custom objects. `unchanged` is unopinionated, accepting standard JS objects and returning standard JS objects, no transformation or learning curve required. @@ -516,16 +1034,15 @@ This includes popular solutions like [Immutable.js](https://facebook.github.io/i Standard stuff, clone the repo and `npm install` dependencies. The npm scripts available: -- `build` => run webpack to build development `dist` file with NODE_ENV=development -- `build:minified` => run webpack to build production `dist` file with NODE_ENV=production +- `benchmark` => run benchmark suite comparing top-level and deeply-nested `get` and `set` operations with `lodash` and `ramda` +- `build` => run `rollup` to build `dist` files for CommonJS, ESM, and UMD consumers +- `clean` => run `rimraf` on the `dist` folder - `dev` => run webpack dev server to run example app / playground -- `dist` => runs `build` and `build:minified` +- `dist` => runs `clean` and `build` - `lint` => run ESLint against all files in the `src` folder +- `lint:fix` => run `lint` with autofixing applied - `prepublish` => runs `prepublish:compile` when publishing -- `prepublish:compile` => run `lint`, `test:coverage`, `transpile:es`, `transpile:lib`, `dist` +- `prepublish:compile` => run `lint`, `test:coverage`, `dist` - `test` => run AVA test functions with `NODE_ENV=test` - `test:coverage` => run `test` but with `nyc` for coverage checker - `test:watch` => run `test`, but with persistent watcher -- `transpile:lib` => run babel against all files in `src` to create files in `lib` -- `transpile:es` => run babel against all files in `src` to create files in `es`, preserving ES2015 modules (for - [`pkg.module`](https://github.com/rollup/rollup/wiki/pkg.module)) diff --git a/__tests__/index.ts b/__tests__/index.ts new file mode 100644 index 0000000..7c172ef --- /dev/null +++ b/__tests__/index.ts @@ -0,0 +1,3073 @@ +import { parse } from 'pathington'; + +import { + add, + addWith, + assign, + assignWith, + call, + callWith, + get, + getOr, + getWith, + getWithOr, + has, + hasWith, + is, + isWith, + merge, + mergeWith, + remove, + removeWith, + set, + setWith, +} from '../src'; + +describe('add', () => { + it('should add the value to the object at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const value: any = 'value'; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = add(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: value, + }); + }); + + it('should add the value to the object at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const value: any = 'value'; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = add(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: value, + }); + }); + + it('should add the value to the object at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'value'; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = add(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [value], + }); + }); + + it('should add the value to the object at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const value: any = 'value'; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = add(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [value], + }); + }); + + it('should add to the array object directly if an empty path', () => { + const path: null = null; + const value: any = 'value'; + const object: unchanged.Unchangeable = []; + + const result: unchanged.Unchangeable = add(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual([value]); + }); + + it('should return the value directly if the object is not an array and path is empty', () => { + const path: null = null; + const value: any = 'value'; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = add(path, value, object); + + expect(result).toBe(value); + }); +}); + +describe('addWith', () => { + it('should add the value to the object at the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => ({ value }); + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { + foo: 'bar', + }; + + const result: unchanged.Unchangeable = addWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: { + value: object[path[0]], + }, + }); + }); + + it('should add the value to the object at the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => ({ value }); + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { + foo: 'bar', + }; + + const result: unchanged.Unchangeable = addWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: { + value: object[path], + }, + }); + }); + + it('should add the value to the object at the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => ({ value }); + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = addWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + value: object[path[0]][path[1]], + }, + ], + }); + }); + + it('should add the value to the object at the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => ({ value }); + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = addWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + value: object[parsedPath[0]][parsedPath[1]], + }, + ], + }); + }); + + it('should add to the array object directly if an empty path', () => { + const fn: unchanged.withHandler = (value: any) => ({ value }); + const path: null = null; + const object: unchanged.Unchangeable = []; + + const result: unchanged.Unchangeable = addWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual([ + { + value: undefined, + }, + ]); + }); + + it('should return the value directly if the object is not an array and path is empty', () => { + const fn: unchanged.withHandler = (value: any) => ({ value }); + const path: null = null; + const value: any = 'value'; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = addWith(fn, path, object); + + expect(result).toEqual({ + value: object, + }); + }); +}); + +describe('assign', () => { + it('should create a new object with the value set at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const value: any = { bar: 'baz' }; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: value, + }); + }); + + it('should create a new object with the value assigned at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const value: any = { bar: 'baz' }; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz' }, + untouched: true, + }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: { + ...object[path[0]], + ...value, + }, + }); + }); + + it('should create a new object with the value set at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const value: any = { bar: 'baz' }; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: value, + }); + }); + + it('should create a new object with the value assigned at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const value: any = { bar: 'baz', deeply: { nested: 'value' } }; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz', deeply: { set: 'stuff' } }, + untouched: true, + }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: { + ...object[path], + ...value, + }, + }); + }); + + it('should create a new object with the value set at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = { bar: 'baz' }; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [value], + }); + }); + + it('should create a new object with the value assigned at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = { bar: 'baz', deeply: { nested: 'value' } }; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz', deeply: { set: 'stuff' } }], + untouched: true, + }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + ...object[path[0]][path[1]], + ...value, + }, + ], + }); + }); + + it('should create a new object with the value set at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const value: any = { bar: 'baz' }; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [value], + }); + }); + + it('should create a new object with the value assigned at the nested array path', () => { + const path: unchanged.Path = 'foo[0]'; + const value: any = { baz: 'quz' }; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz' }], + untouched: true, + }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + ...object[parsedPath[0]][parsedPath[1]], + ...value, + }, + ], + }); + }); + + it('should create a new object with the value created at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [value], + }); + }); + + it('should create a new object with the value created at the nested string path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = assign(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [value], + }); + }); + + it('should return the assigned objects if the path is empty', () => { + const path: unchanged.Path = []; + const value: any = { foo: 'bar' }; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = assign(path, value, object); + + expect(result).toEqual({ + ...object, + ...value, + }); + }); + + it('should return the value if the object is not cloneable', () => { + const path: unchanged.Path = []; + const value: any = { foo: 'bar' }; + const object: any = 123; + + const result: any = assign(path, value, object); + + expect(result).toBe(value); + }); +}); + +describe('assignWith', () => { + it('should create a new object with the value set at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: { + value: object[path[0]], + }, + }); + }); + + it('should create a new object with the value assigned at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz' }, + untouched: true, + }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: { + ...object[path[0]], + value: object[path[0]], + }, + }); + }); + + it('should create a new object with the value set at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: { + value: object[path], + }, + }); + }); + + it('should create a new object with the value assigned at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz' }, + untouched: true, + }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: { + ...object[path], + value: object[path], + }, + }); + }); + + it('should create a new object with the value set at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + value: object[path[0]][path[1]], + }, + ], + }); + }); + + it('should create a new object with the value assigned at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz' }], + untouched: true, + }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + ...object[path[0]][path[1]], + value: object[path[0]][path[1]], + }, + ], + }); + }); + + it('should create a new object with the value set at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + value: object[parsedPath[0]][parsedPath[1]], + }, + ], + }); + }); + + it('should create a new object with the value assigned at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz' }], + untouched: true, + }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + ...object[parsedPath[0]][parsedPath[1]], + value: object[parsedPath[0]][parsedPath[1]], + }, + ], + }); + }); + + it('should create a new object with the value created at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + value: undefined, + }, + ], + }); + }); + + it('should create a new object with the value created at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = assignWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + value: undefined, + }, + ], + }); + }); + + it('should return the merged objects if the path is empty', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = assignWith(fn, path, object); + + expect(result).toEqual({ + ...object, + value: object, + }); + }); + + it('should return the original objects if the path is empty and the fn returns falsy', () => { + const fn: unchanged.withHandler = (value: any): object => null; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = assignWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + expect(() => mergeWith(fn, path, object)).toThrowError(); + }); + + it('should return the value returned by fn if the object is not cloneable', () => { + const fn: unchanged.withHandler = (value: any): object => null; + const path: unchanged.Path = []; + const value: any = { foo: 'bar' }; + const object: any = 123; + + const result: any = assignWith(fn, path, object); + + expect(result).toBe(null); + }); +}); + +describe('call', () => { + it('should call the function at the simple array path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const path: unchanged.Path = ['foo']; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path[0]]: fn }; + + const result: string = call(path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should call the function at the simple array path with the custom context value', () => { + const path: unchanged.Path = ['foo']; + const parameters: any[] = [123, null]; + const context: object = { iam: 'context' }; + + const fn: unchanged.withHandler = jest.fn().mockImplementation(function () { + expect(this).toBe(context); + + return 'called'; + }); + + const object: unchanged.Unchangeable = { [path[0]]: fn }; + + const result: string = call(path, parameters, object, context); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should call the function at the simple string path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const path: unchanged.Path = 'foo'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path]: fn }; + + const result: string = call(path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should call the function at the nested array path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const path: unchanged.Path = ['foo', 0]; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path[0]]: [fn] }; + + const result: string = call(path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should call the function at the nested string path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const path: unchanged.Path = 'foo[0]'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path.split('[')[0]]: [fn] }; + + const result: string = call(path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should return undefined if no match found at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = {}; + + const result: string = call(path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match found at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = {}; + + const result: string = call(path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match found at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { foo: [] }; + + const result: string = call(path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match found at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { foo: [] }; + + const result: string = call(path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should call the object if the path is empty and the object is a function', () => { + const path: unchanged.Path = []; + const parameters: any[] = [123, null]; + const object: Function = jest.fn().mockReturnValue('called'); + + const result: any = call(path, parameters, object); + + expect(object).toBeCalledTimes(1); + expect(object).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should return undefined if the path is empty and the object is not function', () => { + const path: unchanged.Path = []; + const parameters: any[] = [123, null]; + const object: null = null; + + const result: any = call(path, parameters, object); + + expect(result).toBe(undefined); + }); +}); + +describe('callWith', () => { + it('should call the function returned by fn at the simple array path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): Function => value; + const path: unchanged.Path = ['foo']; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path[0]]: fn }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should call the function returned by fn at the simple array path with custom context', () => { + const fnWith: unchanged.withHandler = (value: any): Function => value; + const path: unchanged.Path = ['foo']; + const parameters: any[] = [123, null]; + const context: object = { iam: 'context' }; + + const fn: unchanged.withHandler = jest.fn().mockImplementation(function () { + expect(this).toBe(context); + + return 'called'; + }); + + const object: unchanged.Unchangeable = { [path[0]]: fn }; + + const result: string = callWith(fnWith, path, parameters, object, context); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should return undefined if fn returns a non-function at the simple array path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): boolean => value === fn; + const path: unchanged.Path = ['foo']; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path[0]]: fn }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(0); + + expect(result).toBe(undefined); + }); + + it('should call the function returned by fn at the simple string path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): any => value; + const path: unchanged.Path = 'foo'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path]: fn }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should return undefined if fn returns a non-function at the simple string path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): any => value === fn; + const path: unchanged.Path = 'foo'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path]: fn }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(0); + + expect(result).toBe(undefined); + }); + + it('should call the function returned by fn at the nested array path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): any => value; + const path: unchanged.Path = ['foo', 0]; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path[0]]: [fn] }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should return undefined if fn returns a non-function at the nested array path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): any => value === fn; + const path: unchanged.Path = ['foo', 0]; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path[0]]: [fn] }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(0); + + expect(result).toBe(undefined); + }); + + it('should call the function returned by fn at the nested string path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): any => value; + const path: unchanged.Path = 'foo[0]'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path.split('[')[0]]: [fn] }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(1); + expect(fn).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should return undefined if fn returns a non-function at the nested string path', () => { + const fn: unchanged.withHandler = jest.fn().mockReturnValue('called'); + + const fnWith: unchanged.withHandler = (value: any): any => value === fn; + const path: unchanged.Path = 'foo[0]'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { [path.split('[')[0]]: [fn] }; + + const result: string = callWith(fnWith, path, parameters, object); + + expect(fn).toBeCalledTimes(0); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match found at the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value; + const path: unchanged.Path = ['foo']; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = {}; + + const result: string = callWith(fn, path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match found at the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value; + const path: unchanged.Path = 'foo'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = {}; + + const result: string = callWith(fn, path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match found at the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value; + const path: unchanged.Path = ['foo', 0]; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { foo: [] }; + + const result: string = callWith(fn, path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match found at the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value; + const path: unchanged.Path = 'foo[0]'; + const parameters: any[] = [123, null]; + const object: unchanged.Unchangeable = { foo: [] }; + + const result: string = callWith(fn, path, parameters, object); + + expect(result).toBe(undefined); + }); + + it('should call the object if the path is empty and the object returned from fn is a function', () => { + const fn: unchanged.withHandler = (value: any) => value; + const path: unchanged.Path = []; + const parameters: any[] = [123, null]; + const object: Function = jest.fn().mockReturnValue('called'); + + const result: any = callWith(fn, path, parameters, object); + + expect(object).toBeCalledTimes(1); + expect(object).toBeCalledWith(...parameters); + + expect(result).toEqual('called'); + }); + + it('should return undefined if the path is empty and the object returned from fn is a not function', () => { + const fn: unchanged.withHandler = (value: any) => !value; + const path: unchanged.Path = []; + const parameters: any[] = [123, null]; + const object: Function = jest.fn().mockReturnValue('called'); + + const result: any = callWith(fn, path, parameters, object); + + expect(object).toBeCalledTimes(0); + + expect(result).toBe(undefined); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = []; + const parameters: any[] = [123, null]; + const object: Function = jest.fn().mockReturnValue('called'); + + expect(() => callWith(fn, path, parameters, object)).toThrowError(); + }); +}); + +describe('get', () => { + it('should get the value at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toEqual(object[path[0]]); + }); + + it('should get the value at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toEqual(object[path]); + }); + + it('should get the value at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toEqual(object[path[0]][path[1]]); + }); + + it('should get the value at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: unchanged.Unchangeable = get(path, object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual(object[parsedPath[0]][parsedPath[1]]); + }); + + it('should return the object itself if the path is empty', () => { + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toBe(object); + }); + + it('should return undefined if no match at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = get(path, object); + + expect(result).toBe(undefined); + }); +}); + +describe('getOr', () => { + it('should get the value at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toEqual(object[path[0]]); + }); + + it('should get the value at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toEqual(object[path]); + }); + + it('should get the value at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toEqual(object[path[0]][path[1]]); + }); + + it('should get the value at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual(object[parsedPath[0]][parsedPath[1]]); + }); + + it('should return the object itself if the path is empty', () => { + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toBe(object); + }); + + it('should return the fallback if no match at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback if no match at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback if no match at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback if no match at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getOr(fallbackValue, path, object); + + expect(result).toBe(fallbackValue); + }); +}); + +describe('getWith', () => { + it('should get the value at the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should get the value at the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should get the value at the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should get the value at the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should return the result of the callback with the object passed if the path is empty', () => { + const fn: unchanged.withHandler = (value: any) => value && value.foo; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toBe(object.foo); + }); + + it('should return undefined if no match at the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match at the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match at the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toBe(undefined); + }); + + it('should return undefined if no match at the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: unchanged.Unchangeable = getWith(fn, path, object); + + expect(result).toBe(undefined); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + expect(() => getWith(fn, path, object)).toThrowError(); + }); +}); + +describe('getWithOr', () => { + it('should get the value at the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toEqual(true); + }); + + it('should get the value at the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toEqual(true); + }); + + it('should get the value at the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toEqual(true); + }); + + it('should get the value at the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toEqual(true); + }); + + it('should return the result of the callback with the object passed if the path is empty', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toBe(false); + }); + + it('should return the fallback if no match at the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback if no match at the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback if no match at the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback if no match at the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + const fallbackValue: string = 'fallback'; + + const result: unchanged.Unchangeable = getWithOr( + fn, + fallbackValue, + path, + object, + ); + + expect(result).toBe(fallbackValue); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + const fallbackValue: string = 'fallback'; + + expect(() => getWithOr(fn, fallbackValue, path, object)).toThrowError(); + }); +}); + +describe('has', () => { + it('should return true with the value at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: boolean = has(path, object); + + expect(result).toEqual(true); + }); + + it('should return true with the value at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: boolean = has(path, object); + + expect(result).toEqual(true); + }); + + it('should return true with the value at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: boolean = has(path, object); + + expect(result).toEqual(true); + }); + + it('should return true with the value at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: boolean = has(path, object); + + expect(result).toEqual(true); + }); + + it('should return true if the path is empty and the object is existy', () => { + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: boolean = has(path, object); + + expect(result).toBe(true); + }); + + it('should return false if the path is empty and the object is not existy', () => { + const path: unchanged.Path = []; + const object: null = null; + + const result: boolean = has(path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + const result: boolean = has(path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + + const result: boolean = has(path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: boolean = has(path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: boolean = has(path, object); + + expect(result).toBe(false); + }); +}); + +describe('hasWith', () => { + it('should return true with the value at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should return true with the value at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should return true with the value at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should return true with the value at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toEqual(true); + }); + + it('should return true if the path is empty and the object is existy', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value && typeof value === 'object'; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toBe(true); + }); + + it('should return false if the path is empty and the object is not existy', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value && typeof value === 'object'; + const path: unchanged.Path = []; + const object: null = null; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => typeof value === 'string'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + + const result: boolean = hasWith(fn, path, object); + + expect(result).toBe(false); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + expect(() => hasWith(fn, path, object)).toThrowError(); + }); +}); + +describe('is', () => { + it('should return true with the value matching at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = object[path[0]]; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = 'baz'; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true with the value matching at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = object[path]; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = 'baz'; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true with the value matching at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const value: any = object[path[0]][path[1]]; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const value: any = 'quz'; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true with the value matching at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const parsedPath: unchanged.ParsedPath = parse(path); + + const value: any = object[parsedPath[0]][parsedPath[1]]; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const value: any = 'quz'; + + const result: boolean = is(path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true if the path is empty and the value matches', () => { + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = object; + + const result: boolean = is(path, value, object); + + expect(result).toBe(true); + }); + + it('should return false if the path is empty and the value does not match', () => { + const path: unchanged.Path = []; + const object: null = null; + const value: any = undefined; + + const result: boolean = is(path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + const value: any = 'bar'; + + const result: boolean = is(path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + const value: any = 'bar'; + + const result: boolean = is(path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + const value: any = 'baz'; + + const result: boolean = is(path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + const value: any = 'baz'; + + const result: boolean = is(path, value, object); + + expect(result).toBe(false); + }); +}); + +describe('isWith', () => { + it('should return true with the value matching at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = 'blah'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = 'baz'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true with the value matching at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = 'blah'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = 'baz'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true with the value matching at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const value: any = 'blah'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + const value: any = 'quz'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true with the value matching at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const value: any = 'blah'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(true); + }); + + it('should return false with the value not matching at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value === 'bar' ? 'blah' : value; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + }; + + const value: any = 'quz'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toEqual(false); + }); + + it('should return true if the path is empty and the value matches', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value && value.foo === 'bar' ? 'blah' : value; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar' }; + const value: any = 'blah'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toBe(true); + }); + + it('should return false if the path is empty and the value does not match', () => { + const fn: unchanged.withHandler = (value: any): boolean => + value && value.foo === 'bar' ? 'blah' : value; + const path: unchanged.Path = []; + const object: null = null; + const value: any = 'blah'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + const value: any = 'bar'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = {}; + const value: any = 'bar'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [], + }; + const value: any = 'baz'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toBe(false); + }); + + it('should return false if no match at the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [], + }; + const value: any = 'baz'; + + const result: boolean = isWith(fn, path, value, object); + + expect(result).toBe(false); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + const value: any = 'bar'; + + expect(() => isWith(fn, path, value, object)).toThrowError(); + }); +}); + +describe('merge', () => { + it('should create a new object with the value set at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const value: any = { bar: 'baz' }; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: value, + }); + }); + + it('should create a new object with the value set at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const value: any = { bar: 'baz', deeply: { nested: 'value' } }; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: value, + }); + }); + + it('should create a new object with the value merged at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const value: any = { bar: 'baz', deeply: { nested: 'value' } }; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz', deeply: { set: 'stuff' } }, + untouched: true, + }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: { + ...object[path], + ...value, + deeply: { + ...object[path].deeply, + ...value.deeply, + }, + }, + }); + }); + + it('should create a new object with the value set at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = { bar: 'baz', deeply: { nested: 'value' } }; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [value], + }); + }); + + it('should create a new object with the value merged at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = { bar: 'baz', deeply: { nested: 'value' } }; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz', deeply: { set: 'stuff' } }], + untouched: true, + }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + ...object[path[0]][path[1]], + ...value, + deeply: { + ...object[path[0]][path[1]].deeply, + ...value.deeply, + }, + }, + ], + }); + }); + + it('should create a new object with the value set at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const value: any = { bar: 'baz' }; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [value], + }); + }); + + it('should create a new object with the value merged at the nested array path', () => { + const path: unchanged.Path = 'foo[0]'; + const value: any = { baz: 'quz' }; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz' }], + untouched: true, + }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + ...object[parsedPath[0]][parsedPath[1]], + ...value, + }, + ], + }); + }); + + it('should create a new object with the value created at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [value], + }); + }); + + it('should create a new object with the value created at the nested string path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = merge(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [value], + }); + }); + + it('should return the merged objects if the path is empty', () => { + const path: unchanged.Path = []; + const value: any = { foo: 'bar' }; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = merge(path, value, object); + + expect(result).toEqual({ + ...object, + ...value, + }); + }); + + it('should return the value if the object is not cloneable', () => { + const path: unchanged.Path = []; + const value: any = { foo: 'bar' }; + const object: any = 123; + + const result: any = merge(path, value, object); + + expect(result).toBe(value); + }); +}); + +describe('mergeWith', () => { + it('should create a new object with the value set at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: { + value: object[path[0]], + }, + }); + }); + + it('should create a new object with the value merged at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz' }, + untouched: true, + }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: { + ...object[path[0]], + value: object[path[0]], + }, + }); + }); + + it('should do nothing if the return from fun is falsy at the simple array path', () => { + const fn: unchanged.withHandler = (value: any): boolean => !value; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz' }, + untouched: true, + }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should create a new object with the value set at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: { + value: object[path], + }, + }); + }); + + it('should create a new object with the value merged at the simple string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { + foo: { bar: 'nope', baz: 'quz' }, + untouched: true, + }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: { + ...object[path], + value: object[path], + }, + }); + }); + + it('should create a new object with the value set at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + value: object[path[0]][path[1]], + }, + ], + }); + }); + + it('should create a new object with the value merged at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz' }], + untouched: true, + }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + ...object[path[0]][path[1]], + value: object[path[0]][path[1]], + }, + ], + }); + }); + + it('should create a new object with the value set at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + value: object[parsedPath[0]][parsedPath[1]], + }, + ], + }); + }); + + it('should create a new object with the value merged at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [{ bar: 'baz' }], + untouched: true, + }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + ...object[parsedPath[0]][parsedPath[1]], + value: object[parsedPath[0]][parsedPath[1]], + }, + ], + }); + }); + + it('should create a new object with the value created at the nested array path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [ + { + value: undefined, + }, + ], + }); + }); + + it('should create a new object with the value created at the nested string path', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = mergeWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [ + { + value: undefined, + }, + ], + }); + }); + + it('should return the merged objects if the path is empty', () => { + const fn: unchanged.withHandler = (value: any): object => ({ + value, + }); + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = mergeWith(fn, path, object); + + expect(result).toEqual({ + ...object, + value: object, + }); + }); + + it('should return the original objects if the path is empty and the fn returns falsy', () => { + const fn: unchanged.withHandler = (value: any): object => null; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = mergeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + expect(() => mergeWith(fn, path, object)).toThrowError(); + }); + + it('should return the value returned by fn if the object is not cloneable', () => { + const fn: unchanged.withHandler = (value: any): object => null; + const path: unchanged.Path = []; + const value: any = { foo: 'bar' }; + const object: any = 123; + + const result: any = mergeWith(fn, path, object); + + expect(result).toBe(null); + }); +}); + +describe('remove', () => { + it('should remove the key from the object in the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = remove(path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + bar: 'baz', + }); + }); + + it('should remove the key from the object in the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = remove(path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + bar: 'baz', + }); + }); + + it('should remove the key from the object in the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { foo: ['bar', 'quz'], bar: 'baz' }; + + const result = remove(path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + foo: ['quz'], + bar: 'baz', + }); + }); + + it('should remove the key from the object in the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { foo: ['bar', 'quz'], bar: 'baz' }; + + const result = remove(path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + foo: ['quz'], + bar: 'baz', + }); + }); + + it('should return the object if no match found in the simple array path', () => { + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { bar: 'baz' }; + + const result = remove(path, object); + + expect(result).toBe(object); + }); + + it('should return the object if no match found in the simple string path', () => { + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { bar: 'baz' }; + + const result = remove(path, object); + + expect(result).toBe(object); + }); + + it('should return the object if no match found in the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { foo: [], bar: 'baz' }; + + const result = remove(path, object); + + expect(result).toBe(object); + }); + + it('should return the object if no match found in the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { foo: [], bar: 'baz' }; + + const result = remove(path, object); + + expect(result).toBe(object); + }); + + it('should return a new empty object if the path is empty', () => { + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = remove(path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({}); + }); +}); + +describe('removeWith', () => { + it('should remove the key from the object if fn returns truthy in the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + bar: 'baz', + }); + }); + + it('should return the object if fn returns falsy in the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should remove the key from the object if fn returns truthy in the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + bar: 'baz', + }); + }); + + it('should return the object if fn returns falsy in the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should remove the key from the object if fn returns truthy in the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { foo: ['bar', 'quz'], bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + foo: ['quz'], + bar: 'baz', + }); + }); + + it('should return the object if fn returns falsy in the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { foo: ['bar', 'quz'], bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should remove the key from the object if fn returns truthy in the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'bar'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { foo: ['bar', 'quz'], bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + foo: ['quz'], + bar: 'baz', + }); + }); + + it('should return the object if fn returns falsy in the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { foo: ['bar', 'quz'], bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should return the object if no match found in the simple array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should return the object if no match found in the simple string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should return the object if no match found in the nested array path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { foo: [], bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should return the object if no match found in the nested string path', () => { + const fn: unchanged.withHandler = (value: any) => value === 'baz'; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { foo: [], bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should return a new empty object if fn returns truthy and the path is empty', () => { + const fn: unchanged.withHandler = (value: any) => value; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({}); + }); + + it('should return the object if fn returns falsy and the path is empty', () => { + const fn: unchanged.withHandler = (value: any) => Array.isArray(value); + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { foo: 'bar', bar: 'baz' }; + + const result = removeWith(fn, path, object); + + expect(result).toBe(object); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + expect(() => removeWith(fn, path, object)).toThrowError(); + }); +}); + +describe('set', () => { + it('should create a new object with the value set at the simple array path', () => { + const path: unchanged.Path = ['foo']; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = set(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: value, + }); + }); + + it('should create a new object with the value set at the simple string path', () => { + const path: unchanged.Path = 'foo'; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = set(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: value, + }); + }); + + it('should create a new object with the value set at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = set(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [value], + }); + }); + + it('should create a new object with the value set at the nested string path', () => { + const path: unchanged.Path = 'foo[0]'; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = set(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [value], + }); + }); + + it('should create a new object with the value created at the nested array path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = set(path, value, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [value], + }); + }); + + it('should create a new object with the value created at the nested string path', () => { + const path: unchanged.Path = ['foo', 0]; + const value: any = 'new value'; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = set(path, value, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [value], + }); + }); + + it('should return the value passed if the path is empty', () => { + const path: unchanged.Path = []; + const value: any = { foo: 'bar' }; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = set(path, value, object); + + expect(result).toBe(value); + }); +}); + +describe('setWith', () => { + it('should create a new object with the value set at the simple array path', () => { + const fn: unchanged.withHandler = (value: string): string => `--${value}--`; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = setWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: `--${object[path[0]]}--`, + }); + }); + + it('should create a new object with the value set at the simple string path', () => { + const fn: unchanged.withHandler = (value: string): string => `--${value}--`; + const path: unchanged.Path = 'foo'; + const object: unchanged.Unchangeable = { foo: 'bar', untouched: true }; + + const result: unchanged.Unchangeable = setWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path]: `--${object[path]}--`, + }); + }); + + it('should create a new object with the value set at the nested array path', () => { + const fn: unchanged.withHandler = (value: string): string => `--${value}--`; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = setWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: [`--${object[path[0]][path[1]]}--`], + }); + }); + + it('should create a new object with the value set at the nested string path', () => { + const fn: unchanged.withHandler = (value: string): string => `--${value}--`; + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: ['bar'], + untouched: true, + }; + + const result: unchanged.Unchangeable = setWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: [`--${object[parsedPath[0]][parsedPath[1]]}--`], + }); + }); + + it('should create a new object with the value created at the nested array path', () => { + const fn: unchanged.withHandler = (value: string): string => `--${value}--`; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = setWith(fn, path, object); + + expect(result).not.toBe(object); + expect(result).toEqual({ + ...object, + [path[0]]: ['--undefined--'], + }); + }); + + it('should create a new object with the value created at the nested string path', () => { + const fn: unchanged.withHandler = (value: string): string => `--${value}--`; + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: unchanged.Unchangeable = setWith(fn, path, object); + + expect(result).not.toBe(object); + + const parsedPath: unchanged.ParsedPath = parse(path); + + expect(result).toEqual({ + ...object, + [parsedPath[0]]: ['--undefined--'], + }); + }); + + it('should return the value passed if the path is empty', () => { + const fn: unchanged.withHandler = (value: { untouched: boolean }): string => + `--${value.untouched}--`; + const path: unchanged.Path = []; + const object: unchanged.Unchangeable = { untouched: true }; + + const result: any = setWith(fn, path, object); + + expect(result).toBe('--true--'); + }); + + it('should throw if the function passed is not a function', () => { + const fn: null = null; + const path: unchanged.Path = ['foo']; + const object: unchanged.Unchangeable = {}; + + expect(() => setWith(fn, path, object)).toThrowError(); + }); +}); diff --git a/__tests__/utils.ts b/__tests__/utils.ts new file mode 100644 index 0000000..e42c6ef --- /dev/null +++ b/__tests__/utils.ts @@ -0,0 +1,1116 @@ +import { parse } from 'pathington'; +import React from 'react'; + +import { + assignFallback, + callIfFunction, + cloneArray, + cloneIfPossible, + getCoalescedValue, + getDeepClone, + getFullPath, + getOwnProperties, + getMergedObject, + getValueAtPath, + getCloneOrEmptyObject, + getNewEmptyChild, + getNewEmptyObject, + getParsedPath, + getShallowClone, + isCloneable, + isEmptyPath, + isGlobalConstructor, + isSameValueZero, + getCloneAtPath, + reduce, + splice, + throwInvalidFnError, +} from '../src/utils'; + +describe('assignFallback', () => { + it('should return the target if no source exists', () => { + const target: object = {}; + const source: null = null; + + const result: object = assignFallback(target, source); + + expect(result).toBe(target); + }); + + it('should shallowly merge the source into the target', () => { + const symbol: symbol = Symbol('baz'); + const target: object = { + foo: 'bar', + }; + const source: object = { + bar: 'baz', + [symbol]: 'quz', + }; + + const result: object = assignFallback(target, source); + + expect(result).toEqual({ + ...target, + ...source, + }); + }); +}); + +describe('callIfFunction', () => { + it('should call the object if it is a function', () => { + const object: Function = jest.fn().mockReturnValue('returned'); + const context: object = {}; + const parameters: any[] = ['foo', 123]; + + const result: string = callIfFunction(object, context, parameters); + + expect(result).toBe('returned'); + expect(object).toBeCalledTimes(1); + expect(object).toBeCalledWith(...parameters); + }); + + it('should do nothing if the object is not a function', () => { + const object: string = 'foo'; + const context: object = {}; + const parameters: any[] = ['foo', 123]; + + const result: void = callIfFunction(object, context, parameters); + + expect(result).toBe(undefined); + }); +}); + +describe('cloneArray', () => { + it('should clone the contents of the array into a new array', () => { + const array: any[] = ['foo', 123, Symbol('bar'), { baz: 'quz' }, []]; + + const result: any[] = cloneArray(array); + + expect(result).not.toBe(array); + expect(result).toEqual(array); + }); +}); + +describe('cloneIfPossible', () => { + it('should clone the object if it is cloneable', () => { + const object: object = { foo: 'bar' }; + + const result: unchanged.Unchangeable = cloneIfPossible(object); + + expect(result).not.toBe(object); + expect(result).toEqual(object); + }); + + it('should not clone the object if it is not cloneable', () => { + const object: object = React.createElement('div', {}); + + const result: unchanged.Unchangeable = cloneIfPossible(object); + + expect(result).toBe(object); + }); +}); + +describe('getCoalescedValue', () => { + it('should return the fallback value if undefined', () => { + const value: void = undefined; + const fallbackValue: number = 123; + + const result: number = getCoalescedValue(value, fallbackValue); + + expect(result).toBe(fallbackValue); + }); + + it('should return the value if not undefined', () => { + const value: null = null; + const fallbackValue: number = 123; + + const result: null = getCoalescedValue(value, fallbackValue); + + expect(result).toBe(value); + }); +}); + +describe('getDeepClone', () => { + it('should create a deep clone on the object at the simple path specified', () => { + const value: string = 'value'; + + const path: unchanged.Path = 'deeply'; + const object: unchanged.Unchangeable = { + untouched: { + existing: 'value', + }, + }; + const callback = jest + .fn() + .mockImplementation((ref: unchanged.Unchangeable, key: string) => { + expect(ref).toEqual(object); + expect(key).toEqual(path); + + ref[key] = value; + }); + + const result: unchanged.Unchangeable = getDeepClone(path, object, callback); + + expect(callback).toBeCalledTimes(1); + + expect(result).toEqual({ + ...object, + deeply: value, + }); + }); + + it('should create a deep clone on the object at the deep path specified', () => { + const value: string = 'value'; + + const path: unchanged.Path = 'deeply[0].nested'; + const object: unchanged.Unchangeable = { + untouched: { + existing: 'value', + }, + }; + const callback = jest + .fn() + .mockImplementation((ref: unchanged.Unchangeable, key: string) => { + expect(ref).toEqual({}); + expect(key).toEqual(path.split('.')[1]); + + ref[key] = value; + }); + + const result: unchanged.Unchangeable = getDeepClone(path, object, callback); + + expect(callback).toBeCalledTimes(1); + + expect(result).toEqual({ + ...object, + deeply: [ + { + nested: value, + }, + ], + }); + }); + + it('should create a deep clone on a new object if not present at the path specified', () => { + const value: string = 'value'; + + const path: unchanged.Path = 'deeply[0].nested'; + const object: null = null; + const callback = jest + .fn() + .mockImplementation((ref: unchanged.Unchangeable, key: string) => { + expect(ref).toEqual({}); + expect(key).toEqual(path.split('.')[1]); + + ref[key] = value; + }); + + const result: unchanged.Unchangeable = getDeepClone(path, object, callback); + + expect(callback).toBeCalledTimes(1); + + expect(result).toEqual({ + deeply: [ + { + nested: value, + }, + ], + }); + }); +}); + +describe('getFullPath', () => { + it('should return the added index if both path and value are arrays', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [[]], + }; + const fn: void = undefined; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual(['foo', 0, 0]); + }); + + it('should return the added index if path is a string and value is an array', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [[]], + }; + const fn: void = undefined; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual('foo[0][0]'); + }); + + it('should return the added index if path is an array and value is not', () => { + const path: unchanged.Path = ['foo', 'bar']; + const object: unchanged.Unchangeable = { + foo: {}, + }; + const fn: void = undefined; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual(path); + }); + + it('should return the added index if path is an empty string and value is an array', () => { + const path: unchanged.Path = null; + const object: unchanged.Unchangeable = []; + const fn: void = undefined; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual('[0]'); + }); + + it('should return the added index if both path and value returned from fn are arrays', () => { + const path: unchanged.Path = ['foo', 0]; + const object: unchanged.Unchangeable = { + foo: [[]], + }; + const fn: any = (value: any): any => value; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual(['foo', 0, 0]); + }); + + it('should return the added index if path is a string and value returned from fn is an array', () => { + const path: unchanged.Path = 'foo[0]'; + const object: unchanged.Unchangeable = { + foo: [[]], + }; + const fn: any = (value: any): any => value; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual('foo[0][0]'); + }); + + it('should return the added index if path is an array and value returned from fn is not', () => { + const path: unchanged.Path = ['foo', 'bar']; + const object: unchanged.Unchangeable = { + foo: {}, + }; + const fn: any = (value: any): any => value; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual(path); + }); + + it('should return the added index if path is an empty string and value returned from fn is an array', () => { + const path: unchanged.Path = null; + const object: unchanged.Unchangeable = []; + const fn: any = (value: any): any => value; + + const result = getFullPath(path, object, fn); + + expect(result).toEqual('[0]'); + }); +}); + +describe('getOwnProperties', () => { + it('should get all keys and symbols in the object passed', () => { + const symbol: symbol = Symbol('baz'); + const object: object = { + foo: 'bar', + bar: 'baz', + [symbol]: 'quz', + }; + + const result: (string | Symbol)[] = getOwnProperties(object); + + expect(result).toEqual([].concat(Object.keys(object), [symbol])); + }); + + it('should get only keys if no symbols in the object passed exist', () => { + const object: object = { + foo: 'bar', + bar: 'baz', + }; + + const result: (string | Symbol)[] = getOwnProperties(object); + + expect(result).toEqual(Object.keys(object)); + }); + + it('should get only get enumerable symbols in the object passed', () => { + const symbol: symbol = Symbol('baz'); + const object: object = { + foo: 'bar', + bar: 'baz', + [symbol]: 'quz', + }; + + Object.defineProperty(object, Symbol('quz'), { + value: 'blah', + }); + + const result: (string | Symbol)[] = getOwnProperties(object); + + expect(result).toEqual([].concat(Object.keys(object), [symbol])); + }); +}); + +describe('getMergedObject', () => { + it('should shallowly clone the second object if the objects are different types', () => { + const object1: object = { key: 'value' }; + const object2: string[] = ['key', 'value']; + const isDeep: boolean = false; + + const result: unchanged.Unchangeable = getMergedObject( + object1, + object2, + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual(object2); + }); + + it('should deeply clone the second object if the objects are different types', () => { + const object1: object = { key: 'value' }; + const object2: string[] = ['key', 'value']; + const isDeep: boolean = true; + + const result: unchanged.Unchangeable = getMergedObject( + object1, + object2, + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual(object2); + }); + + it('should merge the arrays if both objects are arrays and is not deep merge', () => { + const object1: string[] = ['one']; + const object2: string[] = ['two']; + const isDeep: boolean = false; + + const result: unchanged.Unchangeable = getMergedObject( + object1, + object2, + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual([...object1, ...object2]); + + expect(result[0]).toStrictEqual(object1[0]); + expect(result[1]).toStrictEqual(object2[0]); + }); + + it('should merge the arrays if both objects are arrays and is deep merge', () => { + const object1: string[] = ['one']; + const object2: string[] = ['two']; + const isDeep: boolean = true; + + const result: unchanged.Unchangeable = getMergedObject( + object1, + object2, + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual([...object1, ...object2]); + + expect(result[0]).toStrictEqual(object1[0]); + expect(result[1]).toStrictEqual(object2[0]); + }); + + it('should merge the objects if both objects are objects and is not deep merge', () => { + const object1: { date: { willBe: string }; deep: { key: string } } = { + date: { willBe: 'overwritten' }, + deep: { key: 'value' }, + }; + const object2: { + date: Date; + deep: { otherKey: string }; + untouched: string; + } = { + date: new Date(), + deep: { otherKey: 'otherValue' }, + untouched: 'value', + }; + const isDeep: boolean = false; + + const result: unchanged.Unchangeable = getMergedObject( + object1, + object2, + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual({ + date: object2.date, + deep: object2.deep, + untouched: object2.untouched, + }); + }); + + it('should merge the objects if both objects are objects and is deep merge', () => { + const object1: { date: { willBe: string }; deep: { key: string } } = { + date: { willBe: 'overwritten' }, + deep: { key: 'value' }, + }; + const object2: { + date: Date; + deep: { otherKey: string }; + untouched: string; + } = { + date: new Date(), + deep: { otherKey: 'otherValue' }, + untouched: 'value', + }; + const isDeep: boolean = true; + + const result: unchanged.Unchangeable = getMergedObject( + object1, + object2, + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual({ + date: object2.date, + deep: { + ...object1.deep, + ...object2.deep, + }, + untouched: object2.untouched, + }); + }); + + it('should merge the objects if the objects are custom objects and is not deep merge', () => { + class Foo { + value: any; + [key: string]: any; + + constructor(value: any) { + if (value && value.constructor === Object) { + return Object.keys(value).reduce((reduced: Foo, key: string) => { + const deepValue = + value[key] && value[key].constructor === Object + ? new Foo(value[key]) + : value[key]; + + if (reduced[key]) { + reduced[key].value = deepValue; + } else { + reduced[key] = { + value: deepValue, + }; + } + + return reduced; + }, this); + } + + this.value = value; + + return this; + } + } + + const object1: { date: { willBe: string }; deep: { key: string } } = { + date: { willBe: 'overwritten' }, + deep: { key: 'value' }, + }; + const object2: { + date: Date; + deep: { otherKey: string }; + untouched: string; + } = { + date: new Date(), + deep: { otherKey: 'otherValue' }, + untouched: 'value', + }; + const isDeep: boolean = false; + + const result: unchanged.Unchangeable = getMergedObject( + new Foo(object1), + new Foo(object2), + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual( + new Foo({ + date: object2.date, + deep: object2.deep, + untouched: object2.untouched, + }), + ); + }); + + it('should merge the objects if the objects are custom objects and is deep merge', () => { + class Foo { + value: any; + [key: string]: any; + + constructor(value: any) { + if (value && value.constructor === Object) { + return Object.keys(value).reduce((reduced: Foo, key: string) => { + const deepValue = + value[key] && value[key].constructor === Object + ? new Foo(value[key]) + : value[key]; + + if (reduced[key]) { + reduced[key].value = deepValue; + } else { + reduced[key] = { + value: deepValue, + }; + } + + return reduced; + }, this); + } + + this.value = value; + + return this; + } + } + const object1: { date: { willBe: string }; deep: { key: string } } = { + date: { willBe: 'overwritten' }, + deep: { key: 'value' }, + }; + const object2: { + date: Date; + deep: { otherKey: string }; + untouched: string; + } = { + date: new Date(), + deep: { otherKey: 'otherValue' }, + untouched: 'value', + }; + const isDeep: boolean = true; + + const result: unchanged.Unchangeable = getMergedObject( + new Foo(object1), + new Foo(object2), + isDeep, + ); + + expect(result).not.toBe(object1); + expect(result).not.toBe(object2); + + expect(result).toEqual( + new Foo({ + date: object2.date, + deep: { + ...object1.deep, + ...object2.deep, + }, + untouched: object2.untouched, + }), + ); + }); +}); + +describe('getValueAtPath', () => { + it('should return the matching value when there is a simple path', () => { + const path: unchanged.Path = 'path'; + const object: unchanged.Unchangeable = { + [path]: 'value', + }; + const fallbackValue: undefined = undefined; + + const result: string = getValueAtPath(path, object, fallbackValue); + + expect(result).toEqual(object[path]); + }); + + it('should return the matching value when there is a nested path', () => { + const path: unchanged.Path = 'deeply.nested'; + const object: unchanged.Unchangeable = { + deeply: { + nested: 'value', + }, + }; + const fallbackValue: undefined = undefined; + + const result: string = getValueAtPath(path, object, fallbackValue); + + expect(result).toEqual(object.deeply.nested); + }); + + it('should return undefined when the object does not exist', () => { + const path: unchanged.Path = 'path'; + const object: null = null; + const fallbackValue: undefined = undefined; + + const result: void = getValueAtPath(path, object, fallbackValue); + + expect(result).toBe(undefined); + }); + + it('should return the fallback when the object does not exist and a fallback is provided', () => { + const path: unchanged.Path = 'path'; + const object: null = null; + const fallbackValue: string = 'fallback'; + + const result: void = getValueAtPath(path, object, fallbackValue); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback when the object does not have a simple path match', () => { + const path: unchanged.Path = 'nonexistent.nested'; + const object: unchanged.Unchangeable = { + deeply: { + nested: 'value', + }, + }; + const fallbackValue: string = 'fallback'; + + const result: void = getValueAtPath(path, object, fallbackValue); + + expect(result).toBe(fallbackValue); + }); + + it('should return the fallback when the object does not have a nested path match', () => { + const path: unchanged.Path = 'deeply.nonexistent'; + const object: unchanged.Unchangeable = { + deeply: { + nested: 'value', + }, + }; + const fallbackValue: string = 'fallback'; + + const result: void = getValueAtPath(path, object, fallbackValue); + + expect(result).toBe(fallbackValue); + }); +}); + +describe('getCloneOrEmptyObject', () => { + it('should get a shallow clone of the object if it is cloneable', () => { + const object: object = { foo: 'bar' }; + const nextKey: number = 0; + + const result: unchanged.Unchangeable = getCloneOrEmptyObject( + object, + nextKey, + ); + + expect(result).not.toBe(object); + expect(result).toEqual(object); + }); + + it('should get an empty object based on the next key if the object is not cloneable', () => { + const object: RegExp = /foo/; + const nextKey: number = 0; + + const result: unchanged.Unchangeable = getCloneOrEmptyObject( + object, + nextKey, + ); + + expect(result).not.toBe(object); + expect(result).toEqual([]); + }); +}); + +describe('getNewEmptyChild', () => { + it('should return an array when the key is a number', () => { + const key: number = 0; + + const result: unchanged.Unchangeable = getNewEmptyChild(key); + + expect(result).toEqual([]); + }); + + it('should return an object when the key is not a number', () => { + const key: string = 'foo'; + + const result: unchanged.Unchangeable = getNewEmptyChild(key); + + expect(result).toEqual({}); + }); +}); + +describe('getNewEmptyObject', () => { + it('should return an empty array if the object passed is an array', () => { + const object: any[] = ['foo', 123]; + + const result: unchanged.Unchangeable = getNewEmptyObject(object); + + expect(result).toEqual([]); + }); + + it('should return an empty object if the object passed is an object', () => { + const object: object = { foo: 'bar' }; + + const result: unchanged.Unchangeable = getNewEmptyObject(object); + + expect(result).toEqual({}); + }); +}); + +describe('getParsedPath', () => { + it('should return the path passed if an array', () => { + const path: unchanged.Path = ['foo', (Symbol('bar') as unknown) as string]; + + const result: unchanged.ParsedPath = getParsedPath(path); + + expect(result).toBe(path); + }); + + it('should return the path parsed as an array', () => { + const path: unchanged.Path = 'foo[0]'; + + const result: unchanged.ParsedPath = getParsedPath(path); + + expect(result).not.toBe(path); + + expect(result).toEqual(parse(path)); + }); +}); + +describe('getShallowClone', () => { + it('should return a shallow clone of the object if a plain object', () => { + const object: object = { foo: 'bar' }; + + const result: unchanged.Unchangeable = getShallowClone(object); + + expect(result).not.toBe(object); + expect(result).toEqual(object); + }); + + it('should return a shallow clone of the array if an array', () => { + const object: any[] = ['foo', 123, Symbol('bar')]; + + const result: unchanged.Unchangeable = getShallowClone(object); + + expect(result).not.toBe(object); + expect(result).toEqual(object); + }); + + it('should return an empty object if the object is a global constructor', () => { + const object: Function = RegExp; + + const result: unchanged.Unchangeable = getShallowClone(object); + + expect(result).not.toBe(object); + expect(result).toEqual({}); + }); + + it('should return a shallow clone of the custom object when a custom object', () => { + class Foo { + value: any; + + constructor(value: any) { + this.value = value; + } + } + + const object: Foo = new Foo('bar'); + + const result: unchanged.Unchangeable = getShallowClone(object); + + expect(result).not.toBe(object); + expect(result).toEqual(object); + }); +}); + +describe('isCloneable', () => { + it('should return false if the object passed is falsy', () => { + const object: null = null; + + const result: boolean = isCloneable(object); + + expect(result).toBe(false); + }); + + it('should return false if the object is not of type object', () => { + const object: boolean = true; + + const result: boolean = isCloneable(object); + + expect(result).toBe(false); + }); + + it('should return false if the object is a React element', () => { + const object: object = React.createElement('div', {}); + + const result: boolean = isCloneable(object); + + expect(result).toBe(false); + }); + + it('should return false if the object is a Date object', () => { + const object: Date = new Date(); + + const result: boolean = isCloneable(object); + + expect(result).toBe(false); + }); + + it('should return false if the object is a RegExp object', () => { + const object: RegExp = /foo/; + + const result: boolean = isCloneable(object); + + expect(result).toBe(false); + }); + + it('should return true if the object is cloneable', () => { + const object: object = { foo: 'bar' }; + + const result: boolean = isCloneable(object); + + expect(result).toBe(true); + }); +}); + +describe('isEmptyPath', () => { + it('should return true if the object is undefined', () => { + const object: undefined = undefined; + + const result = isEmptyPath(object); + + expect(result).toBe(true); + }); + + it('should return true if the object is null', () => { + const object: null = null; + + const result = isEmptyPath(object); + + expect(result).toBe(true); + }); + + it('should return true if the object is an empty array', () => { + const object: unchanged.Path = []; + + const result = isEmptyPath(object); + + expect(result).toBe(true); + }); + + it('should return true if the object is a populated array', () => { + const object: unchanged.Path = ['foo']; + + const result = isEmptyPath(object); + + expect(result).toBe(false); + }); + + it('should return true if the object is a string', () => { + const object: unchanged.PathItem = 'foo'; + + const result = isEmptyPath(object); + + expect(result).toBe(false); + }); + + it('should return true if the object is a number', () => { + const object: unchanged.PathItem = 0; + + const result = isEmptyPath(object); + + expect(result).toBe(false); + }); +}); + +describe('isGlobalConstructor', () => { + it('should return false if the object passed is not a funtion', () => { + const object: object = { foo: 'bar' }; + + const result: boolean = isGlobalConstructor(object); + + expect(result).toBe(false); + }); + + it('should return false if the object passed is not a global funtion based on given name', () => { + const object: Function = function foo() {}; + + expect(object.name).toBe('foo'); + + const result: boolean = isGlobalConstructor(object); + + expect(result).toBe(false); + }); + + it('should return false if the object passed is not a global funtion based on derived name', () => { + const object: Function = function foo() {}; + + // @ts-ignore + delete object.name; + + expect(object.name).toBe(''); + + const result: boolean = isGlobalConstructor(object); + + expect(result).toBe(false); + }); + + it('should return true if the object passed is a global funtion based on its given name', () => { + const object: Function = RegExp; + + expect(object.name).toBe('RegExp'); + + const result: boolean = isGlobalConstructor(object); + + expect(result).toBe(true); + }); + + it('should return true if the object passed is a global funtion based on derived name', () => { + const object: Function = RegExp; + + // @ts-ignore + delete object.name; + + expect(object.name).toBe(''); + + const result: boolean = isGlobalConstructor(object); + + expect(result).toBe(true); + }); +}); + +describe('isSameValueZero', () => { + it('will return true if values are strictly equal', () => { + const value1: object = { foo: 'bar' }; + const value2: object = value1; + + const result: boolean = isSameValueZero(value1, value2); + + expect(result).toBe(true); + }); + + it('will return true if values are both NaN', () => { + const value1: number = NaN; + const value2: number = NaN; + + const result: boolean = isSameValueZero(value1, value2); + + expect(result).toBe(true); + }); + + it('will return false if values are not NaN and not strictly equal', () => { + const value1: object = { foo: 'bar' }; + const value2: object = { foo: 'bar' }; + + const result: boolean = isSameValueZero(value1, value2); + + expect(result).toBe(false); + }); +}); + +describe('getCloneAtPath', () => { + it('should call onMatch and return the object based on a simple path', () => { + const path: unchanged.ParsedPath = ['key']; + const object: unchanged.Unchangeable = { + [path[0]]: 'value', + untouched: true, + }; + const onMatch: Function = jest.fn().mockImplementation((a, b) => { + a[b] = 'new value'; + }); + + const result: string = getCloneAtPath(path, object, onMatch, 0); + + expect(onMatch).toBeCalledTimes(1); + expect(onMatch).toBeCalledWith(object, path[0]); + + expect(result).toEqual({ + ...object, + [path[0]]: 'new value', + }); + }); + + it('should call onMatch and return the object based on a nested path', () => { + const path: unchanged.ParsedPath = ['deeply', 'nested', 'key']; + const object: unchanged.Unchangeable = { + [path[0]]: { + [path[1]]: { + [path[2]]: 'value', + }, + }, + untouched: true, + }; + const onMatch: Function = jest.fn().mockImplementation((a, b) => { + a[b] = 'new value'; + }); + + const result: string = getCloneAtPath(path, object, onMatch, 0); + + expect(onMatch).toBeCalledTimes(1); + expect(onMatch).toBeCalledWith(object[path[0]][path[1]], path[2]); + + expect(result).toEqual({ + ...object, + [path[0]]: { + ...object[path[0]], + [path[1]]: { + ...object[path[1]], + [path[2]]: 'new value', + }, + }, + }); + }); +}); + +describe('reduce', () => { + it('should reduce the array to a new value', () => { + const array: any[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + const fn: Function = (total: number, value: number): number => + total + value; + const initialValue: number = 0; + + const result = reduce(array, fn, initialValue); + + expect(result).toEqual(55); + }); +}); + +describe('splice', () => { + it('should mutatively remove the index specified from the array', () => { + const array: any[] = ['foo', 123, {}, []]; + const splicedIndex: number = 1; + + const result: void = splice(array, splicedIndex); + + expect(result).toBe(undefined); + expect(array).toEqual(['foo', {}, []]); + }); + + it('should do nothing when the array is empty', () => { + const array: any[] = []; + const splicedIndex: number = 1; + + const result: void = splice(array, splicedIndex); + + expect(result).toBe(undefined); + expect(array).toEqual([]); + }); +}); + +describe('throwInvalidFnError', () => { + it('should throw an error', () => { + expect(() => throwInvalidFnError()).toThrowError(); + }); +}); diff --git a/benchmark_results.csv b/benchmark_results.csv index 7c4c364..46ff191 100644 --- a/benchmark_results.csv +++ b/benchmark_results.csv @@ -1,57 +1,57 @@ Test,1000 ops,5000 ops,10000 ops,50000 ops,100000 ops,500000 ops,1000000 ops,5000000 ops ---,---,---,---,---,---,---,---,--- -[get object property] native,0.116ms,0.085ms,0.166ms,0.906ms,0.052ms,0.257ms,0.514ms,2.603ms -[get object property] lodash fp (array),1.918ms,4.437ms,2.159ms,6.975ms,15.230ms,90.665ms,169.574ms,501.533ms -[get object property] lodash fp (dotty),0.729ms,3.131ms,2.506ms,6.971ms,13.883ms,69.317ms,138.180ms,691.202ms -[get object property] ramda,0.375ms,1.664ms,1.193ms,2.798ms,1.250ms,6.612ms,13.049ms,64.981ms -[get object property] unchanged (array),0.646ms,2.285ms,1.087ms,3.398ms,3.108ms,13.152ms,26.072ms,128.196ms -[get object property] unchanged (dotty),0.742ms,2.809ms,1.129ms,3.079ms,2.577ms,13.095ms,25.778ms,128.703ms ----,---,---,---,---,---,---,---,--- -[get array index] native,0.137ms,0.281ms,1.637ms,0.426ms,0.859ms,4.433ms,8.932ms,50.178ms -[get array index] lodash fp (array),0.617ms,3.579ms,3.170ms,6.789ms,13.639ms,70.240ms,135.158ms,676.611ms -[get array index] lodash fp (dotty),0.303ms,1.019ms,2.735ms,7.439ms,13.679ms,67.977ms,136.463ms,679.973ms -[get array index] ramda,0.550ms,2.160ms,1.717ms,5.061ms,4.397ms,21.573ms,43.340ms,217.640ms -[get array index] unchanged (array),0.508ms,2.585ms,1.764ms,4.059ms,3.752ms,18.879ms,35.380ms,175.624ms -[get array index] unchanged (dotty),1.225ms,1.461ms,1.490ms,3.519ms,3.726ms,18.277ms,36.375ms,182.211ms ----,---,---,---,---,---,---,---,--- -[get nested object property] native,0.101ms,0.114ms,0.644ms,0.463ms,0.057ms,0.257ms,0.514ms,2.573ms -[get nested object property] lodash fp (array),0.212ms,0.840ms,2.260ms,7.239ms,12.564ms,67.057ms,125.553ms,625.152ms -[get nested object property] lodash fp (dotty),1.780ms,5.110ms,4.334ms,15.341ms,30.670ms,153.588ms,308.078ms,1540.915ms -[get nested object property] ramda,0.186ms,0.515ms,2.994ms,4.642ms,4.725ms,23.207ms,46.810ms,231.949ms -[get nested object property] unchanged (array),1.093ms,3.334ms,2.574ms,2.481ms,4.773ms,23.688ms,46.939ms,236.320ms -[get nested object property] unchanged (dotty),1.627ms,2.415ms,3.708ms,3.261ms,6.173ms,30.697ms,61.369ms,307.122ms ----,---,---,---,---,---,---,---,--- -[get nested array index] native,0.153ms,0.306ms,1.060ms,1.144ms,0.848ms,4.325ms,8.780ms,49.862ms -[get nested array index] lodash fp (array),0.347ms,1.219ms,3.357ms,7.706ms,15.040ms,75.571ms,151.148ms,757.858ms -[get nested array index] lodash fp (dotty),2.517ms,4.495ms,6.589ms,23.865ms,47.769ms,237.624ms,479.357ms,2392.699ms -[get nested array index] ramda,0.256ms,0.685ms,1.795ms,5.742ms,5.293ms,26.051ms,51.608ms,253.607ms -[get nested array index] unchanged (array),0.604ms,3.140ms,4.921ms,3.010ms,5.904ms,29.486ms,55.567ms,282.436ms -[get nested array index] unchanged (dotty),1.142ms,3.495ms,5.747ms,8.723ms,17.383ms,86.640ms,172.555ms,862.254ms ----,---,---,---,---,---,---,---,--- -[set object property] native,0.228ms,0.555ms,1.559ms,3.341ms,4.885ms,26.190ms,50.910ms,243.077ms -[set object property] lodash fp (array),6.482ms,16.637ms,7.278ms,30.402ms,60.171ms,299.628ms,600.053ms,2999.012ms -[set object property] lodash fp (dotty),2.289ms,10.070ms,7.843ms,36.548ms,71.983ms,360.512ms,719.654ms,3574.434ms -[set object property] ramda,0.471ms,2.798ms,1.455ms,2.477ms,5.093ms,25.233ms,50.551ms,256.745ms -[set object property] unchanged (array),0.626ms,5.479ms,2.780ms,4.286ms,8.390ms,40.561ms,80.853ms,403.406ms -[set object property] unchanged (dotty),1.217ms,3.942ms,4.140ms,5.540ms,10.825ms,54.170ms,108.024ms,538.439ms ----,---,---,---,---,---,---,---,--- -[set array index] native,0.321ms,1.171ms,3.379ms,5.897ms,11.915ms,61.737ms,118.298ms,585.297ms -[set array index] lodash fp (array),2.617ms,15.685ms,9.097ms,39.058ms,77.748ms,389.382ms,780.629ms,3888.813ms -[set array index] lodash fp (dotty),1.683ms,8.696ms,9.632ms,41.932ms,83.676ms,414.534ms,834.122ms,4166.328ms -[set array index] ramda,1.117ms,6.384ms,7.671ms,33.929ms,67.075ms,339.691ms,714.706ms,3600.909ms -[set array index] unchanged (array),1.433ms,6.665ms,4.824ms,11.483ms,22.733ms,113.685ms,227.678ms,1119.196ms -[set array index] unchanged (dotty),0.449ms,4.154ms,4.495ms,11.170ms,22.217ms,111.098ms,218.671ms,1133.341ms ----,---,---,---,---,---,---,---,--- -[set nested object property] native,0.546ms,2.275ms,2.662ms,5.057ms,10.295ms,54.320ms,101.069ms,490.751ms -[set nested object property] lodash fp (array),7.952ms,14.294ms,15.757ms,71.264ms,142.468ms,709.878ms,1412.276ms,7043.912ms -[set nested object property] lodash fp (dotty),2.239ms,11.207ms,17.811ms,83.458ms,163.582ms,819.956ms,1633.168ms,8214.029ms -[set nested object property] ramda,1.337ms,4.479ms,6.406ms,26.015ms,51.840ms,262.279ms,534.301ms,2652.373ms -[set nested object property] unchanged (array),1.235ms,7.042ms,5.423ms,10.905ms,21.544ms,105.944ms,208.247ms,1044.315ms -[set nested object property] unchanged (dotty),0.435ms,1.678ms,5.007ms,14.186ms,24.061ms,120.933ms,242.707ms,1196.733ms ----,---,---,---,---,---,---,---,--- -[set nested array index] native,0.560ms,3.414ms,4.037ms,12.154ms,26.791ms,127.735ms,256.322ms,1265.598ms -[set nested array index] lodash fp (array),3.576ms,18.066ms,15.863ms,68.628ms,136.479ms,674.058ms,1344.967ms,6691.562ms -[set nested array index] lodash fp (dotty),2.507ms,12.163ms,18.747ms,78.506ms,156.579ms,770.007ms,1550.808ms,7751.158ms -[set nested array index] ramda,2.020ms,8.044ms,12.309ms,51.756ms,102.909ms,523.324ms,1059.910ms,5285.697ms -[set nested array index] unchanged (array),1.356ms,8.710ms,9.974ms,36.003ms,72.810ms,365.679ms,716.201ms,3564.909ms -[set nested array index] unchanged (dotty),1.412ms,12.873ms,10.772ms,43.103ms,85.060ms,422.666ms,849.515ms,4230.747ms \ No newline at end of file +[get object property] native,0.138ms,0.099ms,0.194ms,1.015ms,0.098ms,0.304ms,0.657ms,3.096ms +[get object property] lodash fp (array),2.222ms,6.384ms,2.526ms,9.205ms,12.409ms,95.453ms,194.018ms,565.575ms +[get object property] lodash fp (dotty),0.763ms,3.725ms,2.840ms,7.954ms,15.933ms,83.901ms,157.768ms,799.766ms +[get object property] ramda,0.389ms,3.746ms,2.112ms,0.710ms,1.440ms,8.463ms,15.151ms,74.420ms +[get object property] unchanged (array),0.694ms,4.098ms,3.388ms,2.140ms,4.341ms,20.535ms,41.308ms,204.487ms +[get object property] unchanged (dotty),0.727ms,2.282ms,1.125ms,4.263ms,3.978ms,21.908ms,44.795ms,214.152ms +---,---,---,---,---,---,---,---,--- +[get array index] native,0.168ms,0.336ms,1.839ms,0.503ms,1.020ms,5.301ms,11.630ms,55.452ms +[get array index] lodash fp (array),0.665ms,3.469ms,3.739ms,7.541ms,15.163ms,74.841ms,151.961ms,754.557ms +[get array index] lodash fp (dotty),0.318ms,1.149ms,2.785ms,8.614ms,15.006ms,75.609ms,153.904ms,763.142ms +[get array index] ramda,0.546ms,2.033ms,2.375ms,5.943ms,5.395ms,26.245ms,52.514ms,267.940ms +[get array index] unchanged (array),0.448ms,2.530ms,2.144ms,3.002ms,5.734ms,28.107ms,56.312ms,283.232ms +[get array index] unchanged (dotty),0.522ms,2.524ms,3.951ms,2.881ms,5.452ms,28.696ms,56.771ms,281.766ms +---,---,---,---,---,---,---,---,--- +[get nested object property] native,0.177ms,0.125ms,0.728ms,0.517ms,0.058ms,0.291ms,0.600ms,2.890ms +[get nested object property] lodash fp (array),0.231ms,0.915ms,2.508ms,9.231ms,22.643ms,76.718ms,137.211ms,695.112ms +[get nested object property] lodash fp (dotty),1.826ms,6.134ms,5.519ms,16.964ms,34.783ms,176.541ms,344.724ms,1748.713ms +[get nested object property] ramda,0.185ms,0.511ms,3.304ms,5.387ms,5.357ms,26.258ms,52.563ms,268.836ms +[get nested object property] unchanged (array),0.426ms,3.305ms,3.911ms,2.337ms,5.022ms,24.701ms,50.579ms,251.299ms +[get nested object property] unchanged (dotty),0.664ms,5.036ms,4.559ms,3.532ms,7.079ms,34.940ms,72.772ms,348.123ms +---,---,---,---,---,---,---,---,--- +[get nested array index] native,0.195ms,0.363ms,1.241ms,1.432ms,1.210ms,5.164ms,10.547ms,59.440ms +[get nested array index] lodash fp (array),0.398ms,1.430ms,4.927ms,8.810ms,18.804ms,86.672ms,172.379ms,865.479ms +[get nested array index] lodash fp (dotty),2.078ms,9.583ms,7.259ms,28.865ms,58.039ms,291.403ms,583.478ms,2938.883ms +[get nested array index] ramda,0.340ms,1.080ms,2.169ms,7.146ms,6.287ms,31.547ms,63.452ms,317.151ms +[get nested array index] unchanged (array),0.531ms,3.055ms,7.313ms,3.941ms,7.004ms,37.230ms,73.732ms,352.254ms +[get nested array index] unchanged (dotty),1.071ms,5.837ms,6.128ms,9.787ms,20.575ms,99.716ms,192.645ms,963.711ms +---,---,---,---,---,---,---,---,--- +[set object property] native,0.237ms,0.641ms,1.782ms,3.946ms,6.376ms,31.737ms,59.796ms,286.608ms +[set object property] lodash fp (array),10.054ms,19.092ms,8.648ms,34.153ms,68.316ms,346.581ms,686.756ms,3422.712ms +[set object property] lodash fp (dotty),2.594ms,8.802ms,9.005ms,40.352ms,80.644ms,406.577ms,811.770ms,4048.518ms +[set object property] ramda,0.517ms,4.035ms,1.247ms,3.122ms,6.123ms,30.204ms,61.129ms,308.764ms +[set object property] unchanged (array),0.718ms,3.880ms,5.025ms,5.431ms,10.863ms,53.893ms,107.052ms,544.295ms +[set object property] unchanged (dotty),0.839ms,6.174ms,3.907ms,7.536ms,15.414ms,75.414ms,156.433ms,762.264ms +---,---,---,---,---,---,---,---,--- +[set array index] native,0.393ms,1.200ms,3.303ms,7.035ms,14.437ms,70.575ms,134.214ms,653.764ms +[set array index] lodash fp (array),2.552ms,18.888ms,10.489ms,44.345ms,88.839ms,447.208ms,899.255ms,4598.493ms +[set array index] lodash fp (dotty),2.753ms,13.452ms,10.803ms,48.132ms,98.886ms,486.316ms,974.213ms,4863.323ms +[set array index] ramda,1.419ms,7.291ms,8.731ms,38.894ms,77.183ms,389.679ms,782.479ms,3899.422ms +[set array index] unchanged (array),1.483ms,8.289ms,5.256ms,14.457ms,29.536ms,137.278ms,275.799ms,1385.062ms +[set array index] unchanged (dotty),0.501ms,4.286ms,4.636ms,13.794ms,27.573ms,139.254ms,278.754ms,1403.869ms +---,---,---,---,---,---,---,---,--- +[set nested object property] native,0.420ms,1.164ms,4.524ms,6.045ms,12.772ms,61.088ms,115.786ms,581.754ms +[set nested object property] lodash fp (array),12.289ms,16.878ms,18.022ms,86.544ms,167.376ms,847.402ms,1693.723ms,8483.003ms +[set nested object property] lodash fp (dotty),2.438ms,15.991ms,20.183ms,94.682ms,190.674ms,944.250ms,1887.299ms,9406.902ms +[set nested object property] ramda,1.477ms,5.295ms,7.510ms,32.401ms,58.188ms,293.330ms,584.549ms,2926.187ms +[set nested object property] unchanged (array),2.677ms,4.461ms,5.044ms,10.838ms,20.997ms,107.293ms,211.742ms,1056.181ms +[set nested object property] unchanged (dotty),0.666ms,3.119ms,5.134ms,12.715ms,25.832ms,127.086ms,257.454ms,1280.485ms +---,---,---,---,---,---,---,---,--- +[set nested array index] native,0.543ms,3.975ms,5.077ms,14.565ms,30.363ms,137.218ms,271.223ms,1350.483ms +[set nested array index] lodash fp (array),4.566ms,16.831ms,16.508ms,72.553ms,146.428ms,725.282ms,1454.054ms,7268.689ms +[set nested array index] lodash fp (dotty),2.688ms,14.192ms,18.616ms,84.659ms,169.493ms,839.906ms,1678.044ms,8401.912ms +[set nested array index] ramda,2.098ms,9.228ms,14.369ms,58.027ms,113.253ms,574.311ms,1147.671ms,5739.981ms +[set nested array index] unchanged (array),1.434ms,13.491ms,10.443ms,39.798ms,79.282ms,399.261ms,799.325ms,3995.922ms +[set nested array index] unchanged (dotty),1.871ms,10.817ms,11.901ms,51.390ms,98.743ms,494.316ms,990.243ms,4959.485ms \ No newline at end of file diff --git a/benchmarks/get.js b/benchmarks/get.js index f9284e5..c3424a8 100644 --- a/benchmarks/get.js +++ b/benchmarks/get.js @@ -1,7 +1,7 @@ /* eslint no-unused-vars: 0 */ const _ = require('lodash/fp'); const {path} = require('ramda'); -const {get} = require('../lib'); +const {get} = require('../dist/unchanged.cjs'); /** * Data @@ -71,7 +71,7 @@ module.exports = { arrayGetNative(cycles) { const maxIndex = array.length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -81,7 +81,7 @@ module.exports = { arrayGetLodashFp(cycles) { const maxIndex = array.length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -91,7 +91,7 @@ module.exports = { arrayGetLodashFpDotty(cycles) { const maxIndex = array.length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -101,7 +101,7 @@ module.exports = { arrayGetRamda(cycles) { const maxIndex = array.length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -111,7 +111,7 @@ module.exports = { arrayGetUnchanged(cycles) { const maxIndex = array.length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -121,11 +121,11 @@ module.exports = { arrayGetUnchangedDotty(cycles) { const maxIndex = array.length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); val = get(0, array); } - } + }, }; diff --git a/benchmarks/getin.js b/benchmarks/getin.js index a544c27..3e170de 100644 --- a/benchmarks/getin.js +++ b/benchmarks/getin.js @@ -1,7 +1,7 @@ /* eslint no-unused-vars: 0 */ const _ = require('lodash/fp'); const {path} = require('ramda'); -const {get} = require('../lib'); +const {get} = require('../dist/unchanged.cjs'); /** * Data @@ -14,7 +14,7 @@ module.exports = { // objects objectGetInNative(cycles) { const obj = { - data: {value} + data: {value}, }; let val; @@ -25,7 +25,7 @@ module.exports = { }, objectGetInLodashFp(cycles) { const obj = { - data: {value} + data: {value}, }; let val; @@ -36,7 +36,7 @@ module.exports = { }, objectGetInLodashFpDotty(cycles) { const obj = { - data: {value} + data: {value}, }; let val; @@ -47,7 +47,7 @@ module.exports = { }, objectGetInRamda(cycles) { const obj = { - data: {value} + data: {value}, }; let val; @@ -58,7 +58,7 @@ module.exports = { }, objectGetInUnchanged(cycles) { const obj = { - data: {value} + data: {value}, }; let val; @@ -69,7 +69,7 @@ module.exports = { }, objectGetInUnchangedDotty(cycles) { const obj = { - data: {value} + data: {value}, }; let val; @@ -84,7 +84,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -95,7 +95,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -106,7 +106,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -117,7 +117,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -128,7 +128,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); @@ -139,11 +139,11 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let index, val; + let index; let val; for (let i = 0; i < cycles; i++) { index = ~~(Math.random() * maxIndex); val = get(`[0][${index}]`, arr); } - } + }, }; diff --git a/benchmarks/index.js b/benchmarks/index.js index af323d9..b33697a 100644 --- a/benchmarks/index.js +++ b/benchmarks/index.js @@ -1,7 +1,7 @@ -const fs = require('fs'); -const Table = require('cli-table'); +const fs = require("fs"); +const Table = require("cli-table"); -const {repeats, test} = require('./test'); +const { repeats, test } = require("./test"); const { objectGetNative, @@ -16,7 +16,7 @@ const { arrayGetRamda, arrayGetUnchanged, arrayGetUnchangedDotty -} = require('./get'); +} = require("./get"); const { objectGetInNative, @@ -31,7 +31,7 @@ const { arrayGetInLodashFpDotty, arrayGetInUnchanged, arrayGetInUnchangedDotty -} = require('./getin'); +} = require("./getin"); const { objectSetNative, @@ -46,7 +46,7 @@ const { arraySetRamda, arraySetUnchanged, arraySetUnchangedDotty -} = require('./set'); +} = require("./set"); const { objectSetInNative, @@ -61,105 +61,105 @@ const { arraySetInRamda, arraySetInUnchanged, arraySetInUnchangedDotty -} = require('./setin'); +} = require("./setin"); -const TABLE_HEAD = repeats.map((number) => { +const TABLE_HEAD = repeats.map(number => { return `${number} ops`; }); const TEST_TITLES = { - getArray: 'get array index', - getInArray: 'get nested array index', - getInObject: 'get nested object property', - getObject: 'get object property', - setArray: 'set array index', - setInArray: 'set nested array index', - setInObject: 'set nested object property', - setObject: 'set object property' + getArray: "get array index", + getInArray: "get nested array index", + getInObject: "get nested object property", + getObject: "get object property", + setArray: "set array index", + setInArray: "set nested array index", + setInObject: "set nested object property", + setObject: "set object property" }; const TESTS = { getObject: { native: objectGetNative, - 'lodash fp (array)': objectGetLodashFp, - 'lodash fp (dotty)': objectGetLodashFpDotty, + "lodash fp (array)": objectGetLodashFp, + "lodash fp (dotty)": objectGetLodashFpDotty, ramda: objectGetRamda, - 'unchanged (array)': objectGetUnchanged, - 'unchanged (dotty)': objectGetUnchangedDotty + "unchanged (array)": objectGetUnchanged, + "unchanged (dotty)": objectGetUnchangedDotty }, getArray: { native: arrayGetNative, - 'lodash fp (array)': arrayGetLodashFp, - 'lodash fp (dotty)': arrayGetLodashFpDotty, + "lodash fp (array)": arrayGetLodashFp, + "lodash fp (dotty)": arrayGetLodashFpDotty, ramda: arrayGetRamda, - 'unchanged (array)': arrayGetUnchanged, - 'unchanged (dotty)': arrayGetUnchangedDotty + "unchanged (array)": arrayGetUnchanged, + "unchanged (dotty)": arrayGetUnchangedDotty }, getInObject: { native: objectGetInNative, - 'lodash fp (array)': objectGetInLodashFp, - 'lodash fp (dotty)': objectGetInLodashFpDotty, + "lodash fp (array)": objectGetInLodashFp, + "lodash fp (dotty)": objectGetInLodashFpDotty, ramda: objectGetInRamda, - 'unchanged (array)': objectGetInUnchanged, - 'unchanged (dotty)': objectGetInUnchangedDotty + "unchanged (array)": objectGetInUnchanged, + "unchanged (dotty)": objectGetInUnchangedDotty }, getInArray: { native: arrayGetInNative, - 'lodash fp (array)': arrayGetInLodashFp, - 'lodash fp (dotty)': arrayGetInLodashFpDotty, + "lodash fp (array)": arrayGetInLodashFp, + "lodash fp (dotty)": arrayGetInLodashFpDotty, ramda: arrayGetInRamda, - 'unchanged (array)': arrayGetInUnchanged, - 'unchanged (dotty)': arrayGetInUnchangedDotty + "unchanged (array)": arrayGetInUnchanged, + "unchanged (dotty)": arrayGetInUnchangedDotty }, setObject: { native: objectSetNative, - 'lodash fp (array)': objectSetLodashFp, - 'lodash fp (dotty)': objectSetLodashFpDotty, + "lodash fp (array)": objectSetLodashFp, + "lodash fp (dotty)": objectSetLodashFpDotty, ramda: objectSetRamda, - 'unchanged (array)': objectSetUnchanged, - 'unchanged (dotty)': objectSetUnchangedDotty + "unchanged (array)": objectSetUnchanged, + "unchanged (dotty)": objectSetUnchangedDotty }, setArray: { native: arraySetNative, - 'lodash fp (array)': arraySetLodashFp, - 'lodash fp (dotty)': arraySetLodashFpDotty, + "lodash fp (array)": arraySetLodashFp, + "lodash fp (dotty)": arraySetLodashFpDotty, ramda: arraySetRamda, - 'unchanged (array)': arraySetUnchanged, - 'unchanged (dotty)': arraySetUnchangedDotty + "unchanged (array)": arraySetUnchanged, + "unchanged (dotty)": arraySetUnchangedDotty }, setInObject: { native: objectSetInNative, - 'lodash fp (array)': objectSetInLodashFp, - 'lodash fp (dotty)': objectSetInLodashFpDotty, + "lodash fp (array)": objectSetInLodashFp, + "lodash fp (dotty)": objectSetInLodashFpDotty, ramda: objectSetInRamda, - 'unchanged (array)': objectSetInUnchanged, - 'unchanged (dotty)': objectSetInUnchangedDotty + "unchanged (array)": objectSetInUnchanged, + "unchanged (dotty)": objectSetInUnchangedDotty }, setInArray: { native: arraySetInNative, - 'lodash fp (array)': arraySetInLodashFp, - 'lodash fp (dotty)': arraySetInLodashFpDotty, + "lodash fp (array)": arraySetInLodashFp, + "lodash fp (dotty)": arraySetInLodashFpDotty, ramda: arraySetInRamda, - 'unchanged (array)': arraySetInUnchanged, - 'unchanged (dotty)': arraySetInUnchangedDotty + "unchanged (array)": arraySetInUnchanged, + "unchanged (dotty)": arraySetInUnchangedDotty } }; -const results = [['Test', ...TABLE_HEAD].join(',')]; +const results = [["Test", ...TABLE_HEAD].join(",")]; -Object.keys(TESTS).forEach((testType) => { +Object.keys(TESTS).forEach(testType => { const testTitle = TEST_TITLES[testType]; - console.log(''); + console.log(""); console.log(`Running benchmarks for ${testTitle}...`); - results.push(new Array(TABLE_HEAD.length + 1).fill('---')); + results.push(new Array(TABLE_HEAD.length + 1).fill("---")); const typeTable = new Table({ - head: ['', ...TABLE_HEAD] + head: ["", ...TABLE_HEAD] }); - Object.keys(TESTS[testType]).forEach((testName) => { + Object.keys(TESTS[testType]).forEach(testName => { const result = test(testName, TESTS[testType][testName]); const resultRow = [testName, ...result]; @@ -169,19 +169,19 @@ Object.keys(TESTS).forEach((testType) => { .map((result, index) => { return index === 0 ? `[${testTitle}] ${result}` : result; }) - .join(',') + .join(",") ); }); console.log(typeTable.toString()); }); -console.log(''); +console.log(""); // write to file if (fs && fs.writeFileSync) { - fs.writeFileSync('benchmark_results.csv', results.join('\n'), 'utf8'); - console.log('benchmarks done! Results saved to benchmark_results.csv'); + fs.writeFileSync("benchmark_results.csv", results.join("\n"), "utf8"); + console.log("benchmarks done! Results saved to benchmark_results.csv"); } else { - console.log('benchmarks done!'); + console.log("benchmarks done!"); } diff --git a/benchmarks/set.js b/benchmarks/set.js index d1cdd11..5384ba4 100644 --- a/benchmarks/set.js +++ b/benchmarks/set.js @@ -1,7 +1,7 @@ /* eslint no-unused-vars: 0 */ const _ = require('lodash/fp'); const {assoc} = require('ramda'); -const {set} = require('../lib'); +const {set} = require('../dist/unchanged.cjs'); /** * Data @@ -84,7 +84,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -98,7 +98,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -112,7 +112,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -126,7 +126,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -140,7 +140,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -154,7 +154,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -163,5 +163,5 @@ module.exports = { set(index, newVal, newArr); } - } + }, }; diff --git a/benchmarks/setin.js b/benchmarks/setin.js index 3830d74..d9e32b8 100644 --- a/benchmarks/setin.js +++ b/benchmarks/setin.js @@ -1,7 +1,7 @@ /* eslint no-unused-vars: 0 */ const _ = require('lodash/fp'); const {assocPath} = require('ramda'); -const {set} = require('../lib'); +const {set} = require('../dist/unchanged.cjs'); /** * Data @@ -14,20 +14,20 @@ module.exports = { // objects objectSetInNative(cycles) { const obj = { - data: {value} + data: {value}, }; for (let i = 0; i < cycles; i++) { Object.assign({}, obj, { data: Object.assign({}, obj.data, { - value: Math.random() - }) + value: Math.random(), + }), }); } }, objectSetInLodashFp(cycles) { const obj = { - data: {value} + data: {value}, }; let newValue; @@ -40,7 +40,7 @@ module.exports = { }, objectSetInLodashFpDotty(cycles) { const obj = { - data: {value} + data: {value}, }; let newValue; @@ -53,7 +53,7 @@ module.exports = { }, objectSetInRamda(cycles) { const obj = { - data: {value} + data: {value}, }; let newValue; @@ -66,7 +66,7 @@ module.exports = { }, objectSetInUnchanged(cycles) { const obj = { - data: {value} + data: {value}, }; let newValue; @@ -79,7 +79,7 @@ module.exports = { }, objectSetInUnchangedDotty(cycles) { const obj = { - data: {value} + data: {value}, }; let newValue; @@ -96,7 +96,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let newArr, index; + let newArr; let index; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -110,7 +110,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let newArr, index; + let newArr; let index; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -125,7 +125,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let newArr, index; + let newArr; let index; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -140,7 +140,7 @@ module.exports = { const arr = [array]; const maxIndex = arr[0].length - 1; - let newArr, index; + let newArr; let index; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -155,7 +155,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -168,7 +168,7 @@ module.exports = { const arr = array; const maxIndex = arr.length - 1; - let newArr, index, newVal; + let newArr; let index; let newVal; for (let i = 0; i < cycles; i++) { newArr = [].concat(arr); @@ -176,5 +176,5 @@ module.exports = { set(`[0][${index}]`, Math.random(), newArr); } - } + }, }; diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..8d02b16 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,146 @@ +declare namespace unchanged { + export type PathItem = number | string; + export type ParsedPath = PathItem[]; + export type Path = PathItem | ParsedPath; + + export interface Unchangeable { + [key: string]: any; + [index: number]: any; + } + + export type withHandler = (value: any, ...extraArgs: any[]) => any; +} + +declare module 'unchanged' { + export function add( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function addWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function assign( + path: unchanged.Path, + objectToAssign: unchanged.Unchangeable, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function assignWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function call( + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable | Function, + context?: any, + ): any; + + export function callWith( + fn: unchanged.withHandler, + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable | Function, + context?: any, + ...extraArgs: any[] + ): any; + + export function get( + path: unchanged.Path, + object: unchanged.Unchangeable, + ): any; + + export function getOr( + fallbackValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): any; + + export function getWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): any; + + export function getWithOr( + fn: unchanged.withHandler, + fallbackValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): any; + + export function has( + path: unchanged.Path, + object: unchanged.Unchangeable, + ): boolean; + + export function hasWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): boolean; + + export function is( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): boolean; + + export function isWith( + fn: unchanged.withHandler, + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): boolean; + + export function merge( + path: unchanged.Path, + objectToMerge: unchanged.Unchangeable, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function mergeWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function remove( + path: unchanged.Path, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function removeWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function set( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function setWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..8cef775 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,9 @@ +module.exports = { + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], + roots: [""], + testRegex: "/__tests__/.*\\.(ts|tsx)$", + transform: { + "\\.(ts|tsx)$": "ts-jest" + }, + verbose: true +}; diff --git a/package.json b/package.json index d63c2f4..7fa7353 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,6 @@ { "author": "tony_quetano@planttheidea.com", - "ava": { - "failFast": true, - "files": [ - "test/*.js" - ], - "require": [ - "@babel/register" - ], - "sources": [ - "src/*.js" - ], - "verbose": true - }, + "browser": "dist/unchanged.js", "browserslist": [ "defaults", "Explorer >= 9", @@ -25,40 +13,39 @@ "url": "https://github.com/planttheidea/unchanged/issues" }, "dependencies": { - "curriable": "^1.0.0", + "curriable": "^1.2.4", "pathington": "^1.1.5" }, "description": "A tiny, fast, unopinionated handler for updating JS objects and arrays immutably", "devDependencies": { - "@babel/cli": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/preset-env": "^7.0.0", - "@babel/register": "^7.0.0", - "ava": "^1.0.0-beta.8", - "babel-eslint": "^9.0.0", - "babel-loader": "^8.0.0", + "@types/jest": "^23.3.12", + "@types/node": "^10.12.18", + "@types/ramda": "^0.25.45", + "@types/react": "^16.7.18", + "babel-loader": "^8.0.5", "benchmark": "^2.1.4", "cli-table": "^0.3.1", - "eslint": "^5.4.0", - "eslint-config-rapid7": "^3.0.4", - "eslint-friendly-formatter": "^4.0.1", - "eslint-loader": "^2.1.1", + "eslint": "^5.12.0", "html-webpack-plugin": "^3.2.0", "in-publish": "^2.0.0", + "jest": "^23.6.0", "lodash": "^4.17.10", "nyc": "^13.0.1", - "optimize-js-plugin": "^0.0.4", - "performance-now": "^2.1.0", - "ramda": "^0.25.0", - "react": "^16.4.1", + "ramda": "^0.26.1", + "react": "^16.7.0", "react-dom": "^16.4.2", - "rollup": "^0.66.1", - "rollup-plugin-babel": "^4.0.1", - "rollup-plugin-node-resolve": "^3.3.0", - "rollup-plugin-uglify": "^6.0.0", - "sinon": "^6.1.5", + "rollup": "^1.0.2", + "rollup-plugin-babel-minify": "^6.2.0", + "rollup-plugin-node-resolve": "^4.0.0", + "rollup-plugin-typescript2": "^0.18.1", + "ts-jest": "^23.10.4", + "ts-loader": "^5.3.3", + "tslint": "^5.11.0", + "tslint-config-airbnb": "^5.11.0", + "tslint-loader": "^3.5.4", + "typescript": "^3.1.3", "webpack": "^4.16.5", - "webpack-cli": "^3.1.0", + "webpack-cli": "^3.2.0", "webpack-dev-server": "^3.1.5" }, "keywords": [ @@ -67,33 +54,29 @@ ], "license": "MIT", "homepage": "https://github.com/planttheidea/unchanged#readme", - "main": "lib/index.js", - "module": "es/index.js", + "main": "dist/unchanged.cjs.js", + "module": "dist/unchanged.esm.js", "name": "unchanged", "repository": { "type": "git", "url": "git+https://github.com/planttheidea/unchanged.git" }, "scripts": { - "benchmark": "npm run transpile:lib && NODE_ENV=production node ./benchmarks/index.js", + "benchmark": "npm run dist && NODE_ENV=production node ./benchmarks/index.js", "build": "NODE_ENV=production rollup -c", - "clean": "npm run clean:lib && npm run clean:es && npm run clean:dist", - "clean:dist": "rimraf dist", - "clean:lib": "rimraf lib", - "clean:es": "rimraf es", - "dev": "NODE_ENV=development webpack-dev-server --colors --progress --config=webpack/webpack.config.dev.js", - "dist": "npm run clean:dist && npm run build", - "lint": "NODE_ENV=test eslint src", - "lint:fix": "NODE_ENV=test eslint src --fix", + "clean": "rimraf dist", + "dev": "NODE_ENV=development webpack-dev-server --colors --progress --config=webpack/webpack.config.js", + "dist": "npm run clean && npm run build", + "lint": "NODE_ENV=test tslint 'src/*.ts'", + "lint:fix": "npm run lint -- --fix", "prepublish": "if in-publish; then npm run prepublish:compile; fi", - "prepublish:compile": "npm run lint && npm run test:coverage && npm run transpile:lib && npm run transpile:es && npm run dist", + "prepublish:compile": "npm run lint && npm run test:coverage && npm run dist", "start": "npm run dev", - "test": "NODE_PATH=. NODE_ENV=production BABEL_ENV=test ava", - "test:coverage": "nyc npm test", - "test:watch": "npm test -- --watch", - "transpile:lib": "npm run clean:lib && BABEL_ENV=lib babel src --out-dir lib", - "transpile:es": "npm run clean:es && BABEL_ENV=es babel src --out-dir es" + "test": "NODE_PATH=. jest", + "test:coverage": "npm run test -- --coverage", + "test:watch": "npm run test -- --watch" }, "sideEffects": false, - "version": "1.5.2" + "types": "dist/index.d.ts", + "version": "2.0.0" } diff --git a/rollup.config.js b/rollup.config.js index 0f74b30..e809fdb 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,47 +1,71 @@ -import babel from 'rollup-plugin-babel'; -import resolve from 'rollup-plugin-node-resolve'; -import {uglify} from 'rollup-plugin-uglify'; +import resolve from "rollup-plugin-node-resolve"; +import minify from "rollup-plugin-babel-minify"; +import typescript from "rollup-plugin-typescript2"; -import pkg from './package.json'; +import pkg from "./package.json"; -const DEV_CONFIG = { - external: Object.keys(pkg.dependencies), - input: 'src/index.js', +const EXTERNALS = [ + ...Object.keys(pkg.dependencies || {}), + ...Object.keys(pkg.peerDependencies || {}) +]; + +const UMD_CONFIG = { + external: EXTERNALS, + input: "src/index.ts", output: { - exports: 'named', - file: 'dist/unchanged.js', - format: 'umd', - globals: Object.keys(pkg.dependencies).reduce((globals, pkgName) => { - globals[pkgName] = pkgName; + exports: "named", + file: pkg.browser, + format: "umd", + globals: EXTERNALS.reduce((globals, name) => { + globals[name] = name; return globals; }, {}), - name: 'unchanged', - sourcemap: true, + name: pkg.name, + sourcemap: true }, plugins: [ resolve({ + browser: true, main: true, - module: true, - }), - babel({ - exclude: 'node_modules/**', + module: true }), - ], + typescript({ + typescript: require("typescript") + }) + ] }; -export default [ - DEV_CONFIG, - { - ...DEV_CONFIG, - output: { - ...DEV_CONFIG.output, - file: 'dist/unchanged.min.js', - sourcemap: false, +const FORMATTED_CONFIG = { + ...UMD_CONFIG, + output: [ + { + ...UMD_CONFIG.output, + file: pkg.main, + format: "cjs" }, - plugins: [ - ...DEV_CONFIG.plugins, - uglify(), - ], + { + ...UMD_CONFIG.output, + file: pkg.module, + format: "es" + } + ] +}; + +const MINIFIED_CONFIG = { + ...UMD_CONFIG, + output: { + ...UMD_CONFIG.output, + file: pkg.browser.replace(".js", ".min.js"), + sourcemap: false }, -]; + plugins: [ + ...UMD_CONFIG.plugins, + minify({ + comments: false, + sourceMap: false + }) + ] +}; + +export default [UMD_CONFIG, FORMATTED_CONFIG, MINIFIED_CONFIG]; diff --git a/src/curriable.d.ts b/src/curriable.d.ts new file mode 100644 index 0000000..a46053b --- /dev/null +++ b/src/curriable.d.ts @@ -0,0 +1,5 @@ +declare module 'curriable' { + export const __: Symbol | number; + + export function curry(fn: Function, arity?: number): Function; +} diff --git a/src/handlers.ts b/src/handlers.ts new file mode 100644 index 0000000..84d7d82 --- /dev/null +++ b/src/handlers.ts @@ -0,0 +1,463 @@ +// utils +import { + callIfFunction, + getDeepClone, + getFullPath, + getMergedObject, + getValueAtPath, + getNewEmptyObject, + isCloneable, + isEmptyPath, + isSameValueZero, + splice, + throwInvalidFnError, +} from './utils'; + +const { isArray } = Array; +const { slice } = Array.prototype; + +/** + * @function createCall + * + * @description + * create handlers for call / callWith + * + * @param isWithHandler is the method using a with handler + * @returns call / callWith + */ +export const createCall: Function = (isWithHandler: boolean): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable | Function, + context: any = object, + ): any { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 5); + + if (isEmptyPath(path)) { + return callIfFunction(fn(object, ...extraArgs), context, parameters); + } + + const value: any = getValueAtPath(path, object); + + if (value === void 0) { + return; + } + + const result: any = fn(value, ...extraArgs); + + return callIfFunction(result, context, parameters); + }; + } + + return ( + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable | Function, + context = object, + ): any => { + const callable: any = isEmptyPath(path) + ? object + : getValueAtPath(path, object); + + return callIfFunction(callable, context, parameters); + }; +}; + +/** + * @function createGet + * + * @description + * create handlers for get / getWith + * + * @param isWithHandler is the method using a with handler + * @returns get / getWith + */ +export const createGet: Function = (isWithHandler: boolean): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): any { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 4); + + if (isEmptyPath(path)) { + return fn(object, ...extraArgs); + } + + const value: any = getValueAtPath(path, object); + + return value === void 0 ? value : fn(value, ...extraArgs); + }; + } + + return (path: unchanged.Path, object: unchanged.Unchangeable): any => + isEmptyPath(path) ? object : getValueAtPath(path, object); +}; + +/** + * @function createGetOr + * + * @description + * create handlers for getOr / getWithOr + * + * @param isWithHandler is the method using a with handler + * @returns getOr / getWithOr + */ +export const createGetOr: Function = (isWithHandler: boolean): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + noMatchValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): any { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 4); + + if (isEmptyPath(path)) { + return fn(object, ...extraArgs); + } + + const value: any = getValueAtPath(path, object); + + return value === void 0 ? noMatchValue : fn(value, ...extraArgs); + }; + } + + return ( + noMatchValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): any => + isEmptyPath(path) ? object : getValueAtPath(path, object, noMatchValue); +}; + +/** + * @function createHas + * + * @description + * create handlers for has / hasWith + * + * @param isWithHandler is the method using a with handler + * @returns has / hasWith + */ +export const createHas: Function = (isWithHandler: boolean): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): boolean { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 3); + + if (isEmptyPath(path)) { + return !!fn(object, ...extraArgs); + } + + const value: any = getValueAtPath(path, object); + + return value !== void 0 && !!fn(value, ...extraArgs); + }; + } + + return (path: unchanged.Path, object: unchanged.Unchangeable): boolean => + isEmptyPath(path) + ? object != null + : getValueAtPath(path, object) !== void 0; +}; + +/** + * @function createIs + * + * @description + * create handlers for is / isWith + * + * @param isWithHandler is the method using a with handler + * @returns is / isWith + */ +export const createIs: Function = (isWithHandler: boolean): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): boolean { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 4); + + if (isEmptyPath(path)) { + return isSameValueZero(fn(object, ...extraArgs), value); + } + + return isSameValueZero( + fn(getValueAtPath(path, object), ...extraArgs), + value, + ); + }; + } + + return ( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): boolean => + isEmptyPath(path) + ? isSameValueZero(object, value) + : isSameValueZero(getValueAtPath(path, object), value); +}; + +/** + * @function createMerge + * + * @description + * create handlers for merge / mergeWith + * + * @param isWithHandler is the method using a with handler + * @param isDeep is the handler for a deep merge or shallow + * @returns merge / mergeWith + */ +export const createMerge: Function = ( + isWithHandler: boolean, + isDeep: boolean, +): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 3); + + if (!isCloneable(object)) { + return fn(object, ...extraArgs); + } + + if (isEmptyPath(path)) { + const objectToMerge: any = fn(object, ...extraArgs); + + return objectToMerge + ? getMergedObject(object, objectToMerge, isDeep) + : object; + } + + let hasChanged: boolean = false; + + const result: unchanged.Unchangeable = getDeepClone( + path, + object, + (ref: unchanged.Unchangeable, key: string): void => { + const objectToMerge: any = fn(ref[key], ...extraArgs); + + if (objectToMerge) { + ref[key] = getMergedObject(ref[key], objectToMerge, isDeep); + + hasChanged = true; + } + }, + ); + + return hasChanged ? result : object; + }; + } + + return ( + path: unchanged.Path, + objectToMerge: unchanged.Unchangeable, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable => { + if (!isCloneable(object)) { + return objectToMerge; + } + + return isEmptyPath(path) + ? getMergedObject(object, objectToMerge, true) + : getDeepClone( + path, + object, + (ref: unchanged.Unchangeable, key: string): void => { + ref[key] = getMergedObject(ref[key], objectToMerge, isDeep); + }, + ); + }; +}; + +/** + * @function createRemove + * + * @description + * create handlers for remove / removeWith + * + * @param isWithHandler is the method using a with handler + * @returns remove / removeWith + */ +export const createRemove: Function = (isWithHandler: boolean): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 3); + + if (isEmptyPath(path)) { + const emptyObject: unchanged.Unchangeable = getNewEmptyObject(object); + + return fn(emptyObject, ...extraArgs) ? emptyObject : object; + } + + const value: any = getValueAtPath(path, object); + + return value !== void 0 && fn(value, ...extraArgs) + ? getDeepClone( + path, + object, + (ref: unchanged.Unchangeable, key: string): void => { + if (isArray(ref)) { + splice(ref, key); + } else { + delete ref[key]; + } + }, + ) + : object; + }; + } + + return ( + path: unchanged.Path, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable => { + if (isEmptyPath(path)) { + return getNewEmptyObject(object); + } + + return getValueAtPath(path, object) !== void 0 + ? getDeepClone( + path, + object, + (ref: unchanged.Unchangeable, key: string): void => { + if (isArray(ref)) { + splice(ref, key); + } else { + delete ref[key]; + } + }, + ) + : object; + }; +}; + +/** + * @function createSet + * + * @description + * create handlers for set / setWith + * + * @param isWithHandler is the method using a with handler + * @returns set / setWith + */ +export const createSet: Function = (isWithHandler: boolean): Function => { + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable { + if (typeof fn !== 'function') { + throwInvalidFnError(); + } + + const extraArgs: any[] = slice.call(arguments, 3); + + return isEmptyPath(path) + ? fn(object, ...extraArgs) + : getDeepClone( + path, + object, + (ref: unchanged.Unchangeable, key: string): void => { + ref[key] = fn(ref[key], ...extraArgs); + }, + ); + }; + } + + return ( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable => + isEmptyPath(path) + ? value + : getDeepClone( + path, + object, + (ref: unchanged.Unchangeable, key: string): void => { + ref[key] = value; + }, + ); +}; + +/** + * @function createAdd + * + * @description + * create handlers for add / addWith + * + * @param isWithHandler is the method using a with handler + * @returns add / addWith + */ +export const createAdd: Function = (isWithHandler: boolean): Function => { + const add: Function = createSet(isWithHandler); + + if (isWithHandler) { + return function ( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable { + return add.apply( + this, + [fn, getFullPath(path, object, fn), object].concat( + slice.call(arguments, 3), + ), + ); + }; + } + + return ( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable => add(getFullPath(path, object), value, object); +}; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index ccf5e07..0000000 --- a/src/index.js +++ /dev/null @@ -1,220 +0,0 @@ -// external dependencies -import { - __, - curry, -} from 'curriable'; - -// utils -import { - callIfFunction, - callNestedProperty, - getDeepClone, - getMergedObject, - getNestedProperty, - getNewEmptyObject, - hasNestedProperty, - isArray, - isCloneable, - isEmptyPath, - splice, -} from './utils'; - -export {__}; - -/** - * @function assign - * - * @description - * get the shallowly-merged object at path - * - * @param {Array|null|number|string} path the path to match on the object - * @param {Array<*>|Object} objectToAssign the object to merge - * @param {Array<*>|Object} object the object to merge with - * @returns {Array<*>|Object} the new merged object - */ -export const assign = curry((path, objectToAssign, object) => { - if (!isCloneable(object)) { - return objectToAssign; - } - - return isEmptyPath(path) - ? getMergedObject(object, objectToAssign, false) - : getDeepClone(path, object, (ref, key) => { - ref[key] = getMergedObject(ref[key], objectToAssign, false); - }); -}); - -/** - * @function call - * - * @description - * call a nested method at the path requested with the parameters provided - * - * @param {Array|null|number|string} path the path to get the value at - * @param {Array<*>} parameters the parameters to call the method with - * @param {Array<*>|Object} object the object to call the method from - * @param {*} context the context to set as "this" in the function call - */ -export const call = curry( - (path, parameters, object, context = object) => - isEmptyPath(path) - ? callIfFunction(object, context, parameters) - : callNestedProperty(path, context, parameters, object), - // eslint-disable-next-line no-magic-numbers - 3 -); - -/** - * @function get - * - * @description - * get the value to the object at the path requested - * - * @param {Array|null|number|string} path the path to get the value at - * @param {Array<*>|Object} object the object to get the value from - * @returns {*} the value requested - */ -export const get = curry((path, object) => (isEmptyPath(path) ? object : getNestedProperty(path, object))); - -/** - * @function getOr - * - * @description - * get the value to the object at the path requested, or noMatchValue if nothing - * is there. - * - * @param {*} noMatchValue the fallback value if nothing is found at the given path - * @param {Array|null|number|string} path the path to get the value at - * @param {Array<*>|Object} object the object to get the value from - * @returns {*} the value requested - */ -export const getOr = curry((noMatchValue, path, object) => - isEmptyPath(path) ? object : getNestedProperty(path, object, noMatchValue) -); - -/** - * @function has - * - * @description - * does the nested path exist on the object - * - * @param {Array|null|number|string} path the path to match on the object - * @param {Array<*>|Object} object the object to get the value from - * @returns {boolean} does the path exist - */ -/* eslint-disable eqeqeq */ -export const has = curry((path, object) => (isEmptyPath(path) ? object != null : hasNestedProperty(path, object))); -/* eslint-enable */ - -/** - * @function merge - * - * @description - * get the deeply-merged object at path - * - * @param {Array|null|number|string} path the path to match on the object - * @param {Array<*>|Object} objectToMerge the object to merge - * @param {Array<*>|Object} object the object to merge with - * @returns {Array<*>|Object} the new merged object - */ -export const merge = curry((path, objectToMerge, object) => { - if (!isCloneable(object)) { - return objectToMerge; - } - - return isEmptyPath(path) - ? getMergedObject(object, objectToMerge, true) - : getDeepClone(path, object, (ref, key) => { - ref[key] = getMergedObject(ref[key], objectToMerge, true); - }); -}); - -/** - * @function removeobject with quoted keys - * - * @description - * remove the value in the object at the path requested - * - * @param {Array|number|string} path the path to remove the value at - * @param {Array<*>|Object} object the object to remove the value from - * @returns {Array<*>|Object} a new object with the same structure and the value removed - */ -export const remove = curry((path, object) => { - if (isEmptyPath(path)) { - return getNewEmptyObject(object); - } - - return hasNestedProperty(path, object) - ? getDeepClone(path, object, (ref, key) => { - if (isArray(ref)) { - splice(ref, key); - } else { - delete ref[key]; - } - }) - : object; -}); - -/** - * @function set - * - * @description - * set the value in the object at the path requested - * - * @param {Array|number|string} path the path to set the value at - * @param {*} value the value to set - * @param {Array<*>|Object} object the object to set the value in - * @returns {Array<*>|Object} a new object with the same structure and the value assigned - */ -export const set = curry((path, value, object) => - isEmptyPath(path) - ? value - : getDeepClone(path, object, (ref, key) => { - ref[key] = value; - }) -); - -/** - * @function transform - * - * @description - * perform same operation as set, but using a callback function that receives - * the value (and additional parameters, if provided) to get the value to set - * - * @param {Array|number|string} path the path to set the value at - * @param {function} fn the function to transform the retrieved value with - * @param {Array<*>|Object} object the object to set the value in - * @param {...Array} extraArgs additional arguments to pass to the transform function - * @returns {Array<*>|Object} a new object with the same structure and the value assigned - */ -export const transform = curry( - (path, fn, object, ...extraArgs) => - isEmptyPath(path) - ? fn(object, ...extraArgs) - : getDeepClone(path, object, (ref, key) => (ref[key] = fn(ref[key], ...extraArgs))), - // eslint-disable-next-line no-magic-numbers - 3 -); - -/** - * @function add - * - * @description - * add the value to the object at the path requested - * - * @param {Array|null|number|string} path the path to assign the value at - * @param {*} value the value to assign - * @param {Array<*>|Object} object the object to assignobject the value in - * @returns {Array<*>|Object} a new object with the same structure and the value added - */ -export const add = curry((path, value, object) => { - const isPathEmpty = isEmptyPath(path); - const valueAtPath = isPathEmpty ? object : getNestedProperty(path, object); - const fullPath = isArray(valueAtPath) - ? isArray(path) - ? path.concat([valueAtPath.length]) - : `${isPathEmpty ? '' : path}[${valueAtPath.length}]` - : path; - - return set(fullPath, value, object); -}); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..4520b50 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,57 @@ +// external dependencies +import { __, curry } from 'curriable'; + +// handlers +import { + createAdd, + createCall, + createGet, + createGetOr, + createHas, + createIs, + createMerge, + createRemove, + createSet, +} from './handlers'; + +export { __ }; + +export const add = curry(createAdd(false), 3); + +export const addWith = curry(createAdd(true), 3); + +export const assign = curry(createMerge(false, false), 3); + +export const assignWith = curry(createMerge(true, false), 3); + +export const call = curry(createCall(false), 3); + +export const callWith = curry(createCall(true), 4); + +export const get = curry(createGet(false), 2); + +export const getOr = curry(createGetOr(false), 3); + +export const getWith = curry(createGet(true), 3); + +export const getWithOr = curry(createGetOr(true), 4); + +export const has = curry(createHas(false), 2); + +export const hasWith = curry(createHas(true), 3); + +export const is = curry(createIs(false), 3); + +export const isWith = curry(createIs(true), 4); + +export const merge = curry(createMerge(false, true), 3); + +export const mergeWith = curry(createMerge(true, true), 3); + +export const remove = curry(createRemove(false), 2); + +export const removeWith = curry(createRemove(true), 3); + +export const set = curry(createSet(false), 3); + +export const setWith = curry(createSet(true), 3); diff --git a/src/pathington.d.ts b/src/pathington.d.ts new file mode 100644 index 0000000..2098539 --- /dev/null +++ b/src/pathington.d.ts @@ -0,0 +1,5 @@ +declare module 'pathington' { + export function parse( + path: string | number | (number | string)[], + ): (number | string)[]; +} diff --git a/src/unchanged.d.ts b/src/unchanged.d.ts new file mode 100644 index 0000000..8d02b16 --- /dev/null +++ b/src/unchanged.d.ts @@ -0,0 +1,146 @@ +declare namespace unchanged { + export type PathItem = number | string; + export type ParsedPath = PathItem[]; + export type Path = PathItem | ParsedPath; + + export interface Unchangeable { + [key: string]: any; + [index: number]: any; + } + + export type withHandler = (value: any, ...extraArgs: any[]) => any; +} + +declare module 'unchanged' { + export function add( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function addWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function assign( + path: unchanged.Path, + objectToAssign: unchanged.Unchangeable, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function assignWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function call( + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable | Function, + context?: any, + ): any; + + export function callWith( + fn: unchanged.withHandler, + path: unchanged.Path, + parameters: any[], + object: unchanged.Unchangeable | Function, + context?: any, + ...extraArgs: any[] + ): any; + + export function get( + path: unchanged.Path, + object: unchanged.Unchangeable, + ): any; + + export function getOr( + fallbackValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable, + ): any; + + export function getWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): any; + + export function getWithOr( + fn: unchanged.withHandler, + fallbackValue: any, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): any; + + export function has( + path: unchanged.Path, + object: unchanged.Unchangeable, + ): boolean; + + export function hasWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): boolean; + + export function is( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): boolean; + + export function isWith( + fn: unchanged.withHandler, + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): boolean; + + export function merge( + path: unchanged.Path, + objectToMerge: unchanged.Unchangeable, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function mergeWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function remove( + path: unchanged.Path, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function removeWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; + + export function set( + path: unchanged.Path, + value: any, + object: unchanged.Unchangeable, + ): unchanged.Unchangeable; + + export function setWith( + fn: unchanged.withHandler, + path: unchanged.Path, + object: unchanged.Unchangeable, + ...extraArgs: any[] + ): unchanged.Unchangeable; +} diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index e785406..0000000 --- a/src/utils.js +++ /dev/null @@ -1,465 +0,0 @@ -// external dependencies -import {parse} from 'pathington'; - -const O = Object; -const {create, getOwnPropertySymbols, getPrototypeOf, keys, propertyIsEnumerable} = O; -const {toString: toStringObject} = O.prototype; - -const {toString: toStringFunction} = Function.prototype; - -/** - * @constant {Symbol} REACT_ELEMENT - */ -// eslint-disable-next-line no-magic-numbers -const REACT_ELEMENT = typeof Symbol === 'function' && typeof Symbol.for === 'function' ? Symbol.for('react.element') : 0xeac7; - -/** - * @constant {RegExp} FUNCTION_NAME - */ -const FUNCTION_NAME = /^\s*function\s*([^\(]*)/i; - -/** - * @function isArray - */ -export const {isArray} = Array; - -/** - * @function cloneArray - * - * @description - * shallowly clone an array - * - * @param {Array} array the array to clone - * @returns {Array} the cloned array - */ -export const cloneArray = (array) => { - const cloned = new array.constructor(); - - for (let index = 0; index < array.length; index++) { - cloned[index] = array[index]; - } - - return cloned; -}; - -/** - * @function reduce - * - * @description - * a slimmer, simpler reduce than native (for performance) - * - * @param {Array} array the array to reduce - * @param {function} fn the function to reduce each iteration of the array with - * @param {any} initialValue the initial value of the reduction - * @returns {any} the reduced array value - */ -export const reduce = (array, fn, initialValue) => { - let value = initialValue; - - for (let index = 0; index < array.length; index++) { - value = fn(value, array[index]); - } - - return value; -}; - -/** - * @function getOwnProperties - * - * @description - * get the own properties of an object, either keys or symbols - * - * @param {Object} object the object to get all keys and symbols of - * @returns {Array} the own properties of the object - */ -export const getOwnProperties = (object) => { - const ownSymbols = getOwnPropertySymbols(object); - - if (!ownSymbols.length) { - return keys(object); - } - - return keys(object).concat( - reduce( - ownSymbols, - (enumerableSymbols, symbol) => { - if (propertyIsEnumerable.call(object, symbol)) { - enumerableSymbols.push(symbol); - } - - return enumerableSymbols; - }, - [] - ) - ); -}; - -/** - * @function assignFallback - * - * @description - * a simple implementation of Object.assign - * - * @param {Object} target the target object - * @param {Object} source the object to merge into target - * @returns {Object} the shallowly-merged object - */ -export const assignFallback = (target, source) => { - if (!source) { - return target; - } - - return reduce( - getOwnProperties(source), - (clonedObject, property) => { - clonedObject[property] = source[property]; - - return clonedObject; - }, - Object(target) - ); -}; - -const assign = typeof O.assign === 'function' ? O.assign : assignFallback; - -/** - * @function isCloneable - * - * @description - * can the object be cloned - * - * - the object exists and is an object - * - the object is not a Date or RegExp - * - the object is not a React element - * - * @param {*} object the object to test - * @returns {boolean} can the object be merged - */ -export const isCloneable = (object) => { - if (!object || typeof object !== 'object') { - return false; - } - - const type = toStringObject.call(object); - - return type !== '[object Date]' && type !== '[object RegExp]' && object.$$typeof !== REACT_ELEMENT; -}; - -/** - * @function isGlobalConstructor - * - * @description - * is the function passed a global constructor function - * - * @param {function} fn the function to test - * @returns {boolean} is the function a global constructor - */ -export const isGlobalConstructor = (fn) => - typeof fn === 'function' && global[fn.name || toStringFunction.call(fn).split(FUNCTION_NAME)[1]] === fn; - -/** - * @function callIfFunction - * - * @description - * call the object passed if it is a function and return its return, else return undefined - * - * @param {*} object the object to conditionally call if a function - * @param {*} context the context to apply to the call - * @param {Array<*>} parameters the parametesr to apply the function with - * @returns {*} the restulf of the call or undefined - */ -export const callIfFunction = (object, context, parameters) => - typeof object === 'function' ? object.apply(context, parameters) : void 0; - -/** - * @function getShallowClone - * - * @description - * get a shallow clone of the value passed based on the type requested (maintaining prototype if possible) - * - * @param {Array<*>|Object} object the object to clone - * @param {number|string} key the key to base the object type fromisReactElement(object) || - * @returns {Array<*>|Object} a shallow clone of the value - */ -export const getShallowClone = (object) => { - if (object.constructor === O) { - return assign({}, object); - } - - if (isArray(object)) { - return cloneArray(object); - } - - return isGlobalConstructor(object.constructor) ? {} : assign(create(getPrototypeOf(object)), object); -}; - -/** - * @function getNewEmptyChild - * - * @description - * get a new empty child for the type of key provided - * - * @param {number|string} key the key to test - * @returns {Array|Object} the empty child - */ -export const getNewEmptyChild = (key) => (typeof key === 'number' ? [] : {}); - -/** - * @function getNewEmptyObject - * - * @description - * get a new empty object for the type of key provided - * - * @param {Array|Object} object the object to get an empty value of - * @returns {Array|Object} the empty object - */ -export const getNewEmptyObject = (object) => (isArray(object) ? [] : {}); - -/** - * @function cloneIfPossible - * - * @description - * clone the object passed if it is mergeable, else return itself - * - * @param {*} object he object to clone - * @returns {*} the cloned object - */ -export const cloneIfPossible = (object) => (isCloneable(object) ? getShallowClone(object) : object); - -/** - * @function getNewChildClone - * - * @description - * get the shallow clone of the child when it is the correct type - * - * @param {Array<*>|Object} object the object to clone - * @param {number|string} nextKey the key that the next object will be based from - * @returns {Array<*>|Object} the clone of the key at object - */ -export const getNewChildClone = (object, nextKey) => - isCloneable(object) ? getShallowClone(object) : getNewEmptyChild(nextKey); - -/** - * @function getCoalescedValue - * - * @description - * get the value if it is not undefined, else get the fallback - *` - * @param {any} value the main value to return - * @param {any} fallbackValue the value to return if main is undefined - * @returns {any} the coalesced value - */ -export const getCoalescedValue = (value, fallbackValue) => (value === void 0 ? fallbackValue : value); - -/** - * @function onMatchAtPath - * - * @description - * when there is a match for the path requested, call onMatch, else return the noMatchValue - * - * @param {Array} path the path to find a match at - * @param {Array<*>|Object} object the object to find the path in - * @param {function} onMatch when a match is found, call this method - * @param {boolean} shouldClone should the object be cloned - * @param {*} noMatchValue when no match is found, return this value - * @param {number} [index=0] the index of the key to process - * @returns {*} either the return from onMatch or the noMatchValue - */ -export const onMatchAtPath = (path, object, onMatch, shouldClone, noMatchValue, index = 0) => { - const key = path[index]; - const nextIndex = index + 1; - - if (nextIndex === path.length) { - const result = object || shouldClone ? onMatch(object, key) : noMatchValue; - - return shouldClone ? object : result; - } - - if (shouldClone) { - object[key] = onMatchAtPath( - path, - getNewChildClone(object[key], path[nextIndex]), - onMatch, - shouldClone, - noMatchValue, - nextIndex - ); - - return object; - } - - return object && object[key] - ? onMatchAtPath(path, object[key], onMatch, shouldClone, noMatchValue, nextIndex) - : noMatchValue; -}; - -/** - * @function getMergedObject - * - * @description - * get the objects merged into a new object - * - * @param {Array<*>|Object} object1 the object to merge into - * @param {Array<*>|Object} object2 the object to merge - * @param {boolean} isDeep is the object deeply merged - * @returns {Array<*>|Object} the merged object - */ -export const getMergedObject = (object1, object2, isDeep) => { - const isObject1Array = isArray(object1); - - if (isObject1Array !== isArray(object2) || !isCloneable(object1)) { - return cloneIfPossible(object2); - } - - if (isObject1Array) { - return object1.concat(object2); - } - - const target = - object1.constructor === O || isGlobalConstructor(object1.constructor) ? {} : create(getPrototypeOf(object1)); - - return reduce( - getOwnProperties(object2), - (clone, key) => { - clone[key] = - isDeep && isCloneable(object2[key]) ? getMergedObject(object1[key], object2[key], isDeep) : object2[key]; - - return clone; - }, - assign(target, object1) - ); -}; - -/** - * @function getParsedPath - * - * @description - * get the path array, either as-is if already an array, or parsed by pathington - * - * @param {Array|number|string} path the path to parse - * @returns {Array} the parsed path - */ -export const getParsedPath = (path) => (isArray(path) ? path : parse(path)); - -/** - * @function callNestedProperty - * - * @description - * parse the path passed and call the nested method at that path - * - * @param {Array|number|string} path the path to retrieve values from the object - * @param {*} context the context that the method is called with - * @param {Array<*>} parameters the parameters to call the method with - * @param {*} object the object to get values from - * @returns {*} the retrieved values - */ -export const callNestedProperty = (path, context, parameters, object) => { - const parsedPath = getParsedPath(path); - - if (parsedPath.length === 1) { - return object ? callIfFunction(object[parsedPath[0]], context, parameters) : void 0; - } - - return onMatchAtPath(parsedPath, object, (ref, key) => callIfFunction(ref[key], context, parameters)); -}; - -/** - * @function getNestedProperty - * - * @description - * parse the path passed and get the nested property at that path - * - * @param {Array|number|string} path the path to retrieve values from the object - * @param {*} object the object to get values from - * @param {*} noMatchValue an optional fallback value to be returned when the nested property isn't found - * @returns {*} the retrieved values - */ -export const getNestedProperty = (path, object, noMatchValue) => { - const parsedPath = getParsedPath(path); - - if (parsedPath.length === 1) { - return object ? getCoalescedValue(object[parsedPath[0]], noMatchValue) : noMatchValue; - } - - return onMatchAtPath( - parsedPath, - object, - (ref, key) => getCoalescedValue(ref[key], noMatchValue), - false, - noMatchValue - ); -}; - -/** - * @function getDeepClone - * - * @description - * parse the path passed and clone the object at that path - * - * @param {Array|number|string} path the path to deeply modify the object on - * @param {Array<*>|Object} object the objeisCurrentKeyArrayct to modify - * @param {function} onMatch the callback to execute - * @returns {Array<*>|Object} the clone object - */ -export const getDeepClone = (path, object, onMatch) => { - const parsedPath = getParsedPath(path); - const topLevelClone = isCloneable(object) ? getShallowClone(object) : getNewEmptyChild(parsedPath[0]); - - if (parsedPath.length === 1) { - onMatch(topLevelClone, parsedPath[0]); - - return topLevelClone; - } - - return onMatchAtPath(parsedPath, topLevelClone, onMatch, true); -}; - -/** - * @function hasNestedProperty - * - * @description - * parse the path passed and determine if a value at the path exists - * - * @param {Array|number|string} path the path to retrieve values from the object - * @param {*} object the object to get values from - * @returns {boolean} does the nested path exist - */ -export const hasNestedProperty = (path, object) => getNestedProperty(path, object) !== void 0; - -/* eslint-disable eqeqeq */ -/** - * @function isEmptyPath - * - * @description - * is the object passed an empty key value - * - * @param {*} object the object to test - * @returns {boolean} is the object an empty key value - */ -export const isEmptyPath = (object) => object == null || (isArray(object) && !object.length); -/* eslint-enable */ - -/** - * @function splice - * - * @description - * splice a single item from the array - * - * @param {Array<*>} array array to splice from - * @param {number} splicedIndex index to splice at - */ -export const splice = (array, splicedIndex) => { - if (array.length) { - const {length} = array; - - let index = splicedIndex; - - while (index < length - 1) { - array[index] = array[index + 1]; - - ++index; - } - - --array.length; - } -}; diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..75c8b30 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,537 @@ +// external dependencies +import { parse } from 'pathington'; + +const O = Object; +const { create, getOwnPropertySymbols, keys, propertyIsEnumerable } = O; +const { toString: toStringObject } = O.prototype; + +const { toString: toStringFunction } = Function.prototype; + +const { isArray } = Array; + +/** + * @constant FUNCTION_NAME the RegExp expression matching function names + */ +const FUNCTION_NAME = /^\s*function\s*([^\(]*)/i; + +/** + * @constant REACT_ELEMENT the symbol / number specific to react elements + */ +const REACT_ELEMENT: symbol | number = + typeof Symbol === 'function' && typeof Symbol.for === 'function' + ? Symbol.for('react.element') + : 0xeac7; + +/** + * @function cloneArray + * + * @description + * clone an array to a new array + * + * @param array the array to clone + * @returns the cloned array + */ +export const cloneArray: Function = (array: any[]): any[] => { + // @ts-ignore + const cloned = new array.constructor(); + + for (let index = 0; index < array.length; index++) { + cloned[index] = array[index]; + } + + return cloned; +}; + +/** + * @function reduce + * + * @description + * a targeted reduce method faster than the native + * + * @param array the array to reduce + * @param fn the method to reduce each array value with + * @param initialValue the initial value of the reduction + * @returns the reduced value + */ +export const reduce = (array: any[], fn: Function, initialValue: any): any => { + let value: any = initialValue; + + for (let index: number = 0; index < array.length; index++) { + value = fn(value, array[index]); + } + + return value; +}; + +/** + * @function getOwnProperties + * + * @description + * get the all properties (keys and symbols) of the object passed + * + * @param object the object to get the properties of + * @returns the keys and symbols the object has + */ +export const getOwnProperties: Function = ( + object: unchanged.Unchangeable, +): (string | symbol)[] => { + const ownSymbols: symbol[] = getOwnPropertySymbols(object); + + if (!ownSymbols.length) { + return keys(object); + } + + return keys(object).concat( + reduce( + ownSymbols, + (enumerableSymbols: symbol[], symbol: symbol): symbol[] => { + if (propertyIsEnumerable.call(object, symbol)) { + enumerableSymbols.push(symbol); + } + + return enumerableSymbols; + }, + [], + ), + ); +}; + +/** + * @function assignFallback + * + * @description + * a targeted fallback if native Object.assign is unavailable + * + * @param target the object to shallowly merge into + * @param source the object to shallowly merge into target + * @returns the shallowly merged object + */ +export const assignFallback: Function = ( + target: unchanged.Unchangeable, + source: unchanged.Unchangeable, +): unchanged.Unchangeable => { + if (!source) { + return target; + } + + return reduce( + getOwnProperties(source), + ( + clonedObject: unchanged.Unchangeable, + property: string, + ): unchanged.Unchangeable => { + clonedObject[property] = source[property]; + + return clonedObject; + }, + Object(target), + ); +}; + +const assign: Function = + typeof O.assign === 'function' ? O.assign : assignFallback; + +/** + * @function isCloneable + * + * @description + * is the object passed considered cloneable + * + * @param object the object that is being checked for cloneability + * @returns whether the object can be cloned + */ +export const isCloneable: Function = (object: any): boolean => { + if ( + !object || + typeof object !== 'object' || + object.$$typeof === REACT_ELEMENT + ) { + return false; + } + + const type: string = toStringObject.call(object); + + return type !== '[object Date]' && type !== '[object RegExp]'; +}; + +/** + * @function isEmptyPath + * + * @description + * is the path passed an empty path + * + * @param path the path to check for emptiness + * @returns whether the path passed is considered empty + */ +export const isEmptyPath: Function = (path: any): boolean => + path == null || (isArray(path) && !path.length); + +/** + * @function isGlobalConstructor + * + * @description + * is the fn passed a global constructor + * + * @param fn the fn to check if a global constructor + * @returns whether the fn passed is a global constructor + */ +export const isGlobalConstructor: Function = (fn: any): boolean => + typeof fn === 'function' && + // @ts-ignore + global[fn.name || toStringFunction.call(fn).split(FUNCTION_NAME)[1]] === fn; + +/** + * @function callIfFunction + * + * @description + * if the object passed is a function, call it and return its return, else return undefined + * + * @param object the object to call if a function + * @param context the context to call the function with + * @param parameters the parameters to call the function with + * @returns the result of the function call, or undefined + */ +export const callIfFunction = ( + object: any, + context: any, + parameters: any[], +): any => + typeof object === 'function' ? object.apply(context, parameters) : void 0; + +/** + * @function getNewEmptyChild + * + * @description + * get a new empty child object based on the key passed + * + * @param key the key to base the empty child on + * @returns the empty object the child is built from + */ +export const getNewEmptyChild: Function = (key: any): unchanged.Unchangeable => + typeof key === 'number' ? [] : {}; + +/** + * @function getNewEmptyObject + * + * @description + * get a new empty object based on the object passed + * + * @param object the object to base the empty object on + * @returns an empty version of the object passed + */ +export const getNewEmptyObject: Function = ( + object: unchanged.Unchangeable, +): unchanged.Unchangeable => (isArray(object) ? [] : {}); + +/** + * @function getShallowClone + * + * @description + * create a shallow clone of the object passed, respecting its prototype + * + * @param object the object to clone + * @returns a shallow clone of the object passed + */ +export const getShallowClone = ( + object: unchanged.Unchangeable, +): unchanged.Unchangeable => { + if (object.constructor === O) { + return assign({}, object); + } + + if (isArray(object)) { + return cloneArray(object); + } + + return isGlobalConstructor(object.constructor) + ? {} + : assign(create(object.__proto__), object); +}; + +/** + * @function isSameValueZero + * + * @description + * are the values equal based on SameValueZero + * + * @param value1 the first value to test + * @param value2 the second value to test + * @returns are the two values passed equal based on SameValueZero + */ +export const isSameValueZero: Function = (value1: any, value2: any): boolean => + value1 === value2 || (value1 !== value1 && value2 !== value2); + +/** + * @function cloneIfPossible + * + * @description + * clone the object if it can be cloned, otherwise return the object itself + * + * @param object the object to clone + * @returns a cloned version of the object, or the object itself if not cloneable + */ +export const cloneIfPossible: Function = (object: any): any => + isCloneable(object) ? getShallowClone(object) : object; + +/** + * @function getCloneOrEmptyObject + * + * @description + * if the object is cloneable, get a clone of the object, else get a new + * empty child object based on the key + * + * @param object the object to clone + * @param nextKey the key to base the empty child object on + * @returns a clone of the object, or an empty child object + */ +export const getCloneOrEmptyObject: Function = ( + object: unchanged.Unchangeable, + nextKey: any, +): unchanged.Unchangeable => + isCloneable(object) ? getShallowClone(object) : getNewEmptyChild(nextKey); + +/** + * @function getCoalescedValue + * + * @description + * return the value if not undefined, otherwise return the fallback value + * + * @param value the value to coalesce if undefined + * @param fallbackValue the value to coalesce to + * @returns the coalesced value + */ +export const getCoalescedValue: Function = ( + value: any, + fallbackValue: any, +): any => (value === void 0 ? fallbackValue : value); + +/** + * @function getParsedPath + * + * @description + * parse the path passed into an array path + * + * @param path the path to parse + * @returns the parsed path + */ +export const getParsedPath: Function = ( + path: unchanged.Path, +): unchanged.ParsedPath => (isArray(path) ? path : parse(path)); + +/** + * @function getCloneAtPath + * + * @description + * get a new object, cloned at the path specified while leveraging + * structural sharing for the rest of the properties + * + * @param path the path to clone at + * @param object the object with cloned children at path + * @param onMatch the method to call once the end of the path is reached + * @param index the path index + * @returns the object deeply cloned at the path specified + */ +export const getCloneAtPath: Function = ( + path: unchanged.ParsedPath, + object: unchanged.Unchangeable, + onMatch: Function, + index: number, +): any => { + const key: unchanged.PathItem = path[index]; + const nextIndex: number = index + 1; + + if (nextIndex === path.length) { + onMatch(object, key); + } else { + object[key] = getCloneAtPath( + path, + getCloneOrEmptyObject(object[key], path[nextIndex]), + onMatch, + nextIndex, + ); + } + + return object; +}; + +/** + * @function getDeepClone + * + * @description + * get a clone of the object at the path specified + * + * @param path the path to clone at + * @param object the object to clone at the path + * @param onMatch once a patch match is found, the callback to fire + * @returns the clone of the object at path specified + */ +export const getDeepClone: Function = ( + path: unchanged.Path, + object: unchanged.Unchangeable, + onMatch: Function, +): unchanged.Unchangeable => { + const parsedPath: unchanged.ParsedPath = getParsedPath(path); + const topLevelClone: unchanged.Unchangeable = getCloneOrEmptyObject( + object, + parsedPath[0], + ); + + if (parsedPath.length === 1) { + onMatch(topLevelClone, parsedPath[0]); + + return topLevelClone; + } + + return getCloneAtPath(parsedPath, topLevelClone, onMatch, 0); +}; + +/** + * @function getMergedObject + * + * @description + * merge the source into the target, either deeply or shallowly + * + * @param target the object to merge into + * @param source the object being merged into the target + * @param isDeep is the merge a deep merge + * @returns the merged object + */ +export const getMergedObject: Function = ( + target: unchanged.Unchangeable, + source: unchanged.Unchangeable, + isDeep: boolean, +): unchanged.Unchangeable => { + const isObject1Array: boolean = isArray(target); + + if (isObject1Array !== isArray(source) || !isCloneable(target)) { + return cloneIfPossible(source); + } + + if (isObject1Array) { + return target.concat(source); + } + + const targetClone: unchanged.Unchangeable = + target.constructor === O || isGlobalConstructor(target.constructor) + ? {} + : create(target.__proto__); + + return reduce( + getOwnProperties(source), + (clone: unchanged.Unchangeable, key: string): unchanged.Unchangeable => { + clone[key] = + isDeep && isCloneable(source[key]) + ? getMergedObject(target[key], source[key], isDeep) + : source[key]; + + return clone; + }, + assign(targetClone, target), + ); +}; + +/** + * @function getValueAtPath + * + * @description + * get the value at the nested property, or the fallback provided + * + * @param path the path to get the value from + * @param object the object to get the value from at path + * @param noMatchValue the value returned if no match is found + * @returns the matching value, or the fallback provided + */ +export const getValueAtPath: Function = ( + path: unchanged.Path, + object: unchanged.Unchangeable, + noMatchValue?: any, +) => { + const parsedPath = getParsedPath(path); + + if (parsedPath.length === 1) { + return object + ? getCoalescedValue(object[parsedPath[0]], noMatchValue) + : noMatchValue; + } + + let ref: any = object; + let key: number | string = parsedPath[0]; + + for (let index: number = 0; index < parsedPath.length - 1; index++) { + if (!ref || !ref[key]) { + return noMatchValue; + } + + ref = ref[key]; + key = parsedPath[index + 1]; + } + + return ref ? getCoalescedValue(ref[key], noMatchValue) : noMatchValue; +}; + +/** + * @function getFullPath + * + * @description + * get the path to add to, based on the object and fn passed + * + * @param path the path to add to + * @param object the object traversed by the path + * @param fn the function to transform the retrieved value with + * @returns the full path to add to + */ +export const getFullPath: Function = ( + path: unchanged.Path, + object: unchanged.Unchangeable, + fn?: Function, +): unchanged.Path => { + const isPathEmpty: boolean = isEmptyPath(path); + const valueAtPath: any = isPathEmpty + ? object + : fn + ? fn(getValueAtPath(path, object)) + : getValueAtPath(path, object); + + return isArray(valueAtPath) + ? isArray(path) + ? path.concat([valueAtPath.length]) + : `${isPathEmpty ? '' : path}[${valueAtPath.length}]` + : path; +}; + +/** + * @function splice + * + * @description + * a faster, more targeted version of the native splice + * + * @param array the array to remove the value from + * @param splicedIndex the index of the value to remove + */ +export const splice: Function = (array: any[], splicedIndex: number): void => { + if (array.length) { + const { length } = array; + + let index: number = splicedIndex; + + while (index < length - 1) { + array[index] = array[index + 1]; + + ++index; + } + + --array.length; + } +}; + +/** + * @function throwInvalidFnError + * + * @description + * throw the TypeError based on the invalid handler + * + * @throws + */ +export const throwInvalidFnError: Function = (): never => { + throw new TypeError('handler passed is not of type "function".'); +}; diff --git a/test/utils.js b/test/utils.js index 1309e0c..f4841da 100644 --- a/test/utils.js +++ b/test/utils.js @@ -223,61 +223,61 @@ test('if getNewEmptyObject will return an object when the object passed is not a t.deepEqual(result, {}); }); -test('if getNewChildClone will get a shallow clone of the object when it is an array and the key type should be an array', (t) => { +test('if getCloneOrEmptyObject will get a shallow clone of the object when it is an array and the key type should be an array', (t) => { const object = ['array']; const nextKey = 0; - const result = utils.getNewChildClone(object, nextKey); + const result = utils.getCloneOrEmptyObject(object, nextKey); t.not(result, object); t.deepEqual(result, object); }); -test('if getNewChildClone will assignFallback the numeric key to the object when the object is not an array (even though the key says it should be)', (t) => { +test('if getCloneOrEmptyObject will assignFallback the numeric key to the object when the object is not an array (even though the key says it should be)', (t) => { const object = {array: false}; const nextKey = 0; - const result = utils.getNewChildClone(object, nextKey); + const result = utils.getCloneOrEmptyObject(object, nextKey); t.not(result, object); t.deepEqual(result, {...object}); }); -test('if getNewChildClone will get a shallow clone of the object when it is an object and the key type should be an object', (t) => { +test('if getCloneOrEmptyObject will get a shallow clone of the object when it is an object and the key type should be an object', (t) => { const object = {array: true}; const nextKey = 'key'; - const result = utils.getNewChildClone(object, nextKey); + const result = utils.getCloneOrEmptyObject(object, nextKey); t.not(result, object); t.deepEqual(result, object); }); -test('if getNewChildClone will get a new array when the key type should be an array', (t) => { +test('if getCloneOrEmptyObject will get a new array when the key type should be an array', (t) => { const object = undefined; const nextKey = 0; - const result = utils.getNewChildClone(object, nextKey); + const result = utils.getCloneOrEmptyObject(object, nextKey); t.not(result, object); t.deepEqual(result, []); }); -test('if getNewChildClone will get a new object when the object doe not exist and the key type should be an object', (t) => { +test('if getCloneOrEmptyObject will get a new object when the object doe not exist and the key type should be an object', (t) => { const object = undefined; const nextKey = 'key'; - const result = utils.getNewChildClone(object, nextKey); + const result = utils.getCloneOrEmptyObject(object, nextKey); t.not(result, object); t.deepEqual(result, {}); }); -test('if getNewChildClone will get a new array when the object doe not exist and the key type should be an array', (t) => { +test('if getCloneOrEmptyObject will get a new array when the object doe not exist and the key type should be an array', (t) => { const object = undefined; const nextKey = 0; - const result = utils.getNewChildClone(object, nextKey); + const result = utils.getCloneOrEmptyObject(object, nextKey); t.not(result, object); t.deepEqual(result, []); @@ -449,7 +449,7 @@ test('if callNestedProperty will return undefined when the object does not have t.is(result, undefined); }); -test('if getNestedProperty will get the nested value in the object', (t) => { +test('if getValueAtPath will get the nested value in the object', (t) => { const object = { deeply: { nested: 'value', @@ -457,42 +457,42 @@ test('if getNestedProperty will get the nested value in the object', (t) => { }; const path = 'deeply.nested'; - const result = utils.getNestedProperty(path, object); + const result = utils.getValueAtPath(path, object); t.is(result, object.deeply.nested); }); -test('if getNestedProperty will return the top-level value when the length of the path is 1', (t) => { +test('if getValueAtPath will return the top-level value when the length of the path is 1', (t) => { const path = 'path'; const object = { [path]: 'value', }; - const result = utils.getNestedProperty(path, object); + const result = utils.getValueAtPath(path, object); t.is(result, object[path]); }); -test('if getNestedProperty will return undefined when the object does not exist and the length ofthe path is 1', (t) => { +test('if getValueAtPath will return undefined when the object does not exist and the length ofthe path is 1', (t) => { const path = 'path'; const object = null; - const result = utils.getNestedProperty(path, object); + const result = utils.getValueAtPath(path, object); t.is(result, undefined); }); -test('if getNestedProperty with a fallback will return the fallback when the object does not exist and the length of the path is 1', (t) => { +test('if getValueAtPath with a fallback will return the fallback when the object does not exist and the length of the path is 1', (t) => { const path = 'path'; const object = null; const fallback = 'fallback'; - const result = utils.getNestedProperty(path, object, fallback); + const result = utils.getValueAtPath(path, object, fallback); t.is(result, fallback); }); -test('if getNestedProperty with a fallback will return the fallback when the deeply nested value does not exist', (t) => { +test('if getValueAtPath with a fallback will return the fallback when the deeply nested value does not exist', (t) => { const object = { deeply: { nested: 'value', @@ -501,7 +501,7 @@ test('if getNestedProperty with a fallback will return the fallback when the dee const path = 'deeply.nonexistent'; const fallback = 'fallback'; - const result = utils.getNestedProperty(path, object, fallback); + const result = utils.getValueAtPath(path, object, fallback); t.is(result, fallback); }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..98a125a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "esModuleInterop": true, + "jsx": "react", + "lib": ["dom", "es2015"], + "module": "es2015", + "moduleResolution": "node", + "noImplicitAny": true, + "outDir": "./dist", + "sourceMap": true, + "target": "es5", + "types": ["jest", "node", "react"] + }, + "exclude": ["node_modules"], + "include": ["src/*", "__tests__/*"] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..147b818 --- /dev/null +++ b/tslint.json @@ -0,0 +1,12 @@ +{ + "extends": "tslint-config-airbnb", + "rules": { + "arrow-parens": true, + "function-name": false, + "import-name": false, + "no-increment-decrement": false, + "object-shorthand-properties-first": false, + "prefer-array-literal": false, + "ter-arrow-parens": true + } +} diff --git a/webpack/webpack.config.dev.js b/webpack/webpack.config.dev.js deleted file mode 100644 index a2ab28b..0000000 --- a/webpack/webpack.config.dev.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const path = require('path'); - -const defaultConfig = require('./webpack.config'); - -const ROOT = path.resolve(__dirname, '..'); - -module.exports = Object.assign({}, defaultConfig, { - devServer: { - contentBase: './dist', - inline: true, - port: 3000, - stats: { - assets: false, - chunks: true, - chunkModules: false, - colors: true, - hash: false, - timings: true, - version: false - } - }, - - entry: path.join(ROOT, 'DEV_ONLY/App.js'), - - externals: undefined, - - module: Object.assign({}, defaultConfig.module, { - rules: defaultConfig.module.rules.map((rule) => { - if (rule.loader === 'eslint-loader') { - return Object.assign({}, rule, { - options: Object.assign({}, rule.options, { - emitError: undefined, - failOnWarning: false - }) - }); - } - - return rule; - }) - }), - - node: { - fs: 'empty' - }, - - plugins: [...defaultConfig.plugins, new HtmlWebpackPlugin()] -}); diff --git a/webpack/webpack.config.js b/webpack/webpack.config.js index f5175bb..3243672 100644 --- a/webpack/webpack.config.js +++ b/webpack/webpack.config.js @@ -1,46 +1,67 @@ -'use strict'; +"use strict"; -const path = require('path'); -const webpack = require('webpack'); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const path = require("path"); +const webpack = require("webpack"); -const ROOT = path.resolve(__dirname, '..'); +const ROOT = path.resolve(__dirname, ".."); module.exports = { - devtool: '#source-map', + devServer: { + contentBase: "./dist", + inline: true, + port: 3000, + stats: { + assets: false, + chunks: true, + chunkModules: false, + colors: true, + hash: false, + timings: true, + version: false + } + }, + + devtool: "#source-map", - entry: path.join(ROOT, 'src/index.js'), + entry: path.join(ROOT, "DEV_ONLY", "App.ts"), - mode: 'development', + mode: "development", module: { rules: [ { - enforce: 'pre', - include: [path.resolve(ROOT, 'src')], - options: { - emitError: true, - failOnError: true, - failOnWarning: true, - formatter: require('eslint-friendly-formatter') - }, - loader: 'eslint-loader', - test: /\.js$/ + enforce: "pre", + include: [path.resolve(ROOT, "src")], + loader: "tslint-loader", + test: /\.ts$/ }, { - include: [path.resolve(ROOT, 'src'), /DEV_ONLY/], - loader: 'babel-loader', - test: /\.js$/ + include: [path.resolve(ROOT, "src"), /DEV_ONLY/], + loader: "ts-loader", + test: /\.tsx?$/ } ] }, + node: { + fs: "empty" + }, + output: { - filename: 'unchanged.js', - library: 'unchanged', - libraryTarget: 'umd', - path: path.resolve(ROOT, 'dist'), + filename: "unchanged.js", + library: "unchanged", + libraryTarget: "umd", + path: path.resolve(ROOT, "dist"), umdNamedDefine: true }, - plugins: [new webpack.EnvironmentPlugin(['NODE_ENV'])] + plugins: [ + new webpack.EnvironmentPlugin(["NODE_ENV"]), + new HtmlWebpackPlugin() + ], + + resolve: { + extensions: [".ts", ".js"] + } }; diff --git a/webpack/webpack.config.minified.js b/webpack/webpack.config.minified.js deleted file mode 100644 index c12779b..0000000 --- a/webpack/webpack.config.minified.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -const webpack = require('webpack'); -const OptimizeJsPlugin = require('optimize-js-plugin'); - -const defaultConfig = require('./webpack.config'); - -module.exports = Object.assign({}, defaultConfig, { - devtool: undefined, - - mode: 'production', - - output: Object.assign({}, defaultConfig.output, { - filename: 'unchanged.min.js' - }), - - plugins: defaultConfig.plugins.concat([ - new webpack.LoaderOptionsPlugin({ - debug: false, - minimize: true - }), - new webpack.optimize.OccurrenceOrderPlugin(), - new OptimizeJsPlugin({ - sourceMap: false - }) - ]) -}); diff --git a/yarn.lock b/yarn.lock index 0ac7ad5..d7b2544 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,66 +2,14 @@ # yarn lockfile v1 -"@ava/babel-plugin-throws-helper@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-3.0.0.tgz#2c933ec22da0c4ce1fc5369f2b95452c70420586" - integrity sha512-mN9UolOs4WX09QkheU1ELkVy2WPnwonlO3XMdN8JF8fQqRVgVTR21xDbvEOUsbwz6Zwjq7ji9yzyjuXqDPalxg== - -"@ava/babel-preset-stage-4@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-2.0.0.tgz#2cd072ff818e4432b87fd4c5fd5c5d1a405a4343" - integrity sha512-OWqMYeTSZ16AfLx0Vn0Uj7tcu+uMRlbKmks+DVCFlln7vomVsOtst+Oz+HCussDSFGpE+30VtHAUHLy6pLDpHQ== - dependencies: - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.0.0" - "@babel/plugin-transform-dotall-regex" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - -"@ava/babel-preset-transform-test-files@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-4.0.0.tgz#95d426f5982f934567ae5a21e43eac0a463d6feb" - integrity sha512-V9hYHA/ZLb4I8imrrG8PT0mzgThjWWmahPV+mrQUZobVnsekBUDrf0JsfXVm4guS3binWxWn+MmQt+V81hTizA== - dependencies: - "@ava/babel-plugin-throws-helper" "^3.0.0" - babel-plugin-espower "^3.0.0" - -"@ava/write-file-atomic@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ava/write-file-atomic/-/write-file-atomic-2.2.0.tgz#d625046f3495f1f5e372135f473909684b429247" - integrity sha512-BTNB3nGbEfJT+69wuqXFr/bQH7Vr7ihx2xGOMNqPgDGhwspoZhiWumDDZNjBy7AScmqS5CELIOGtPVXESyrnDA== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -"@babel/cli@^7.0.0": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.2.3.tgz#1b262e42a3e959d28ab3d205ba2718e1923cfee6" - integrity sha512-bfna97nmJV6nDJhXNPeEfxyMjWnt6+IjUAaDPiYRTBlm8L41n8nvw6UAqUCbvpFfU246gHPxW7sfWwqtF4FcYA== - dependencies: - commander "^2.8.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.0.0" - lodash "^4.17.10" - mkdirp "^0.5.1" - output-file-sync "^2.0.0" - slash "^2.0.0" - source-map "^0.5.0" - optionalDependencies: - chokidar "^2.0.3" - -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": 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" -"@babel/core@^7.0.0", "@babel/core@^7.2.2": +"@babel/core@^7.0.0": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== @@ -92,47 +40,6 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-call-delegate@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" - integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== - dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-define-map@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" - integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -149,87 +56,6 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" - integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-transforms@^7.1.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" - integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.2.2" - "@babel/types" "^7.2.2" - lodash "^4.17.10" - -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" - integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== - dependencies: - lodash "^4.17.10" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.1.0": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" - integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.2.3" - "@babel/types" "^7.0.0" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" @@ -237,16 +63,6 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - "@babel/helpers@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" @@ -270,351 +86,6 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== -"@babel/plugin-proposal-async-generator-functions@^7.0.0", "@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" - integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" - integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.2.0" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" - integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" - integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" - -"@babel/plugin-transform-classes@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" - integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" - integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.0.0", "@babel/plugin-transform-dotall-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" - integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" - -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" - integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" - integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" - integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - -"@babel/plugin-transform-modules-systemjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" - integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== - dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-new-target@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" - integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/plugin-transform-parameters@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" - integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== - dependencies: - "@babel/helper-call-delegate" "^7.1.0" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" - integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== - dependencies: - regenerator-transform "^0.13.3" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" - integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" - integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" - -"@babel/preset-env@^7.0.0": - version "7.2.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.3.tgz#948c8df4d4609c99c7e0130169f052ea6a7a8933" - integrity sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.2.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.2.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.2.0" - "@babel/plugin-transform-classes" "^7.2.0" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.2.0" - "@babel/plugin-transform-dotall-regex" "^7.2.0" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.2.0" - "@babel/plugin-transform-function-name" "^7.2.0" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - "@babel/plugin-transform-modules-systemjs" "^7.2.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-new-target" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.2.0" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.2.0" - browserslist "^4.3.4" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.3.0" - -"@babel/register@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" - integrity sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g== - dependencies: - core-js "^2.5.7" - find-cache-dir "^1.0.0" - home-or-tmp "^3.0.0" - lodash "^4.17.10" - mkdirp "^0.5.1" - pirates "^4.0.0" - source-map-support "^0.5.9" - "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -624,7 +95,7 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== @@ -648,51 +119,63 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@concordance/react@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@concordance/react/-/react-2.0.0.tgz#aef913f27474c53731f4fd79cc2f54897de90fde" - integrity sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA== - dependencies: - arrify "^1.0.1" - -"@sinonjs/commons@^1.0.2": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.3.0.tgz#50a2754016b6f30a994ceda6d9a0a8c36adda849" - integrity sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA== - dependencies: - type-detect "4.0.8" +"@comandeer/babel-plugin-banner@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@comandeer/babel-plugin-banner/-/babel-plugin-banner-4.1.0.tgz#5f9f22f3ba5a4e87d0c972c402f039c6eeffc079" + integrity sha512-9hKVIN2+maygxkngnXDsZXRZqCYDY4pxIRljJqqJ5A+eJZzW3k/NZj5lixEmStjWFjlPlOHGYBytBehpf0l+hA== -"@sinonjs/formatio@^3.0.0", "@sinonjs/formatio@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.1.0.tgz#6ac9d1eb1821984d84c4996726e45d1646d8cce5" - integrity sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg== +"@fimbul/bifrost@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.17.0.tgz#f0383ba7e40992e3193dc87e2ddfde2ad62a9cf4" + integrity sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q== dependencies: - "@sinonjs/samsam" "^2 || ^3" + "@fimbul/ymir" "^0.17.0" + get-caller-file "^2.0.0" + tslib "^1.8.1" + tsutils "^3.5.0" -"@sinonjs/samsam@^2 || ^3": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.0.2.tgz#304fb33bd5585a0b2df8a4c801fcb47fa84d8e43" - integrity sha512-m08g4CS3J6lwRQk1pj1EO+KEVWbrbXsmi9Pw0ySmrIbcVxVaedoFgLvFsV8wHLwh01EpROVz3KvVcD1Jmks9FQ== +"@fimbul/ymir@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.17.0.tgz#4f28389b9f804d1cd202e11983af1743488b7815" + integrity sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA== dependencies: - "@sinonjs/commons" "^1.0.2" - array-from "^2.1.1" - lodash.get "^4.4.2" - -"@sinonjs/samsam@^2.1.2": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.3.tgz#62cf2a9b624edc795134135fe37fc2ae8ea36be3" - integrity sha512-8zNeBkSKhU9a5cRNbpCKau2WWPfan+Q2zDlcXvXyhn9EsMqgYs4qzo0XHNVlXC6ABQL8fT6nV+zzo5RTHJzyXw== + inversify "^5.0.0" + reflect-metadata "^0.1.12" + tslib "^1.8.1" "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/node@*": +"@types/jest@^23.3.12": + version "23.3.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.12.tgz#7e0ced251fa94c3bc2d1023d4b84b2992fa06376" + integrity sha512-/kQvbVzdEpOq4tEWT79yAHSM4nH4xMlhJv2GrLVQt4Qmo8yYsPdioBM1QpN/2GX1wkfMnyXvdoftvLUr0LBj7Q== + +"@types/node@*", "@types/node@^10.12.18": version "10.12.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== +"@types/prop-types@*": + version "15.5.8" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.8.tgz#8ae4e0ea205fe95c3901a5a1df7f66495e3a56ce" + integrity sha512-3AQoUxQcQtLHsK25wtTWIoIpgYjH3vSDroZOUr7PpCHw/jLY1RB9z9E8dBT/OSmwStVgkRNvdh+ZHNiomRieaw== + +"@types/ramda@^0.25.45": + version "0.25.46" + resolved "https://registry.yarnpkg.com/@types/ramda/-/ramda-0.25.46.tgz#8399a35eb117f4a821deb9c4cfecc9b276fb7daf" + integrity sha512-UiyHmzWu0KftAWZXfiUvwToVTHGhaG2fnWVckGwaic4By6YyGqtOpq7m8R3HLrpEsYH0AnRQjtXhdL8igmCuDw== + +"@types/react@^16.7.18": + version "16.7.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.7.18.tgz#f4ce0d539a893dd61e36cd11ae3a5e54f5a48337" + integrity sha512-Tx4uu3ppK53/iHk6VpamMP3f3ahfDLEVt3ZQc8TFm30a1H3v9lMsCntBREswZIW/SKrvJjkb3Hq8UwO6GREBng== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -846,6 +329,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -866,25 +354,33 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" +acorn-globals@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-jsx@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -acorn@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= +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@^5.0.0, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" - integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== +acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.4: + version "6.0.5" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" + integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== ajv-errors@^1.0.0: version "1.0.1" @@ -896,7 +392,7 @@ ajv-keywords@^3.1.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= -ajv@^6.1.0, ajv@^6.5.3, ajv@^6.6.1: +ajv@^6.1.0, ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1: version "6.6.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" integrity sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g== @@ -906,19 +402,17 @@ ajv@^6.1.0, ajv@^6.5.3, ajv@^6.6.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -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-colors@^3.0.0: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== -ansi-escapes@^3.0.0, ansi-escapes@^3.1.0: +ansi-escapes@^1.1.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== @@ -943,6 +437,11 @@ ansi-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== +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.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -958,6 +457,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +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" + append-transform@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" @@ -1012,15 +518,10 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-differ@^1.0.0: +array-equal@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= - -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= + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-flatten@1.1.1: version "1.1.1" @@ -1032,19 +533,6 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-from@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - -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" @@ -1057,11 +545,6 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-uniq@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.0.0.tgz#0009e30306e37a6dd2e2e2480db5316fdade1583" - integrity sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg== - array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -1072,7 +555,7 @@ array-unique@^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: +arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= @@ -1086,6 +569,18 @@ asn1.js@^4.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +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" @@ -1108,144 +603,419 @@ async-each@^1.0.0: 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" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + 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.5.0: +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== dependencies: lodash "^4.17.10" +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.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -ava@^1.0.0-beta.8: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ava/-/ava-1.0.1.tgz#04be9a12ba60c55cfc869350ec04520ba3c94698" - integrity sha512-wTb9D14fytTeSOyNu+if6nzSni+MyEn9xgpJki2V5MiTbwMVtt4Svh40gCIos3k5Jqp1wXPCTZLIGKLpI965fQ== +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.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +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: - "@ava/babel-preset-stage-4" "^2.0.0" - "@ava/babel-preset-transform-test-files" "^4.0.0" - "@ava/write-file-atomic" "^2.2.0" - "@babel/core" "^7.2.2" - "@babel/generator" "^7.2.2" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@concordance/react" "^2.0.0" - ansi-escapes "^3.1.0" - ansi-styles "^3.2.1" - arr-flatten "^1.1.0" - array-union "^1.0.1" - array-uniq "^2.0.0" - arrify "^1.0.0" - bluebird "^3.5.3" - chalk "^2.4.1" - chokidar "^2.0.4" - chunkd "^1.0.0" - ci-parallel-vars "^1.0.0" - clean-stack "^2.0.0" - clean-yaml-object "^0.1.0" - cli-cursor "^2.1.0" - cli-truncate "^1.1.0" - code-excerpt "^2.1.1" - common-path-prefix "^1.0.0" - concordance "^4.0.0" - convert-source-map "^1.6.0" - currently-unhandled "^0.4.1" - debug "^4.1.0" - del "^3.0.0" - dot-prop "^4.2.0" - emittery "^0.4.1" - empower-core "^1.2.0" - equal-length "^1.0.0" - escape-string-regexp "^1.0.5" - esm "^3.0.84" - figures "^2.0.0" - find-up "^3.0.0" - get-port "^4.0.0" - globby "^7.1.1" - ignore-by-default "^1.0.0" - import-local "^2.0.0" - indent-string "^3.2.0" - is-ci "^2.0.0" - is-error "^2.2.1" - is-observable "^1.1.0" - is-plain-object "^2.0.4" - is-promise "^2.1.0" - lodash.clone "^4.5.0" - lodash.clonedeep "^4.5.0" - lodash.clonedeepwith "^4.5.0" - lodash.debounce "^4.0.3" - lodash.difference "^4.3.0" - lodash.flatten "^4.2.0" - loud-rejection "^1.2.0" - make-dir "^1.3.0" - matcher "^1.1.1" - md5-hex "^2.0.0" - meow "^5.0.0" - ms "^2.1.1" - multimatch "^2.1.0" - observable-to-promise "^0.5.0" - ora "^3.0.0" - package-hash "^2.0.0" - pkg-conf "^2.1.0" - plur "^3.0.1" - pretty-ms "^4.0.0" - require-precompiled "^0.1.0" - resolve-cwd "^2.0.0" - slash "^2.0.0" - source-map-support "^0.5.9" - stack-utils "^1.0.2" - strip-ansi "^5.0.0" - strip-bom-buf "^1.0.0" - supertap "^1.0.0" - supports-color "^5.5.0" - trim-off-newlines "^1.0.1" + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +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" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +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" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" trim-right "^1.0.1" - unique-temp-dir "^1.0.0" - update-notifier "^2.5.0" -babel-eslint@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" - integrity sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g== +babel-helper-evaluate-path@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz#a62fa9c4e64ff7ea5cea9353174ef023a900a67c" + integrity sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA== + +babel-helper-flip-expressions@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz#3696736a128ac18bc25254b5f40a22ceb3c1d3fd" + integrity sha1-NpZzahKKwYvCUlS19AoizrPB0/0= + +babel-helper-is-nodes-equiv@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + integrity sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ= + +babel-helper-is-void-0@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz#7d9c01b4561e7b95dbda0f6eee48f5b60e67313e" + integrity sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4= + +babel-helper-mark-eval-scopes@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz#d244a3bef9844872603ffb46e22ce8acdf551562" + integrity sha1-0kSjvvmESHJgP/tG4izorN9VFWI= + +babel-helper-remove-or-void@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz#a4f03b40077a0ffe88e45d07010dee241ff5ae60" + integrity sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA= + +babel-helper-to-multiple-sequence-expressions@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz#a3f924e3561882d42fcf48907aa98f7979a4588d" + integrity sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA== + +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/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +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" -babel-loader@^8.0.0: - version "8.0.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.4.tgz#7bbf20cbe4560629e2e41534147692d3fecbdce6" - integrity sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw== +babel-loader@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" + integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw== dependencies: - find-cache-dir "^1.0.0" + find-cache-dir "^2.0.0" loader-utils "^1.0.2" mkdirp "^0.5.1" util.promisify "^1.0.0" -babel-plugin-espower@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-3.0.0.tgz#8dadfa5ec2b9c82e3c4aa0a2d14fbd3ff6d40061" - integrity sha512-f2IUz5kQyrwXnShcv7tvGxf76QkrEl00ENYgd6R0VMrz4xqlwBLZXFs5vse2vehs1Z+T2sXTP3UWX2QxMorzzw== +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/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - call-matcher "^1.0.0" - core-js "^2.0.0" - espower-location-detector "^1.0.0" - espurify "^1.6.0" - estraverse "^4.1.1" + 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" + 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" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + +babel-plugin-jest-hoist@^23.2.0: + version "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-minify-builtins@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz#31eb82ed1a0d0efdc31312f93b6e4741ce82c36b" + integrity sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag== + +babel-plugin-minify-constant-folding@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz#f84bc8dbf6a561e5e350ff95ae216b0ad5515b6e" + integrity sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ== + dependencies: + babel-helper-evaluate-path "^0.5.0" + +babel-plugin-minify-dead-code-elimination@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.0.tgz#d23ef5445238ad06e8addf5c1cf6aec835bcda87" + integrity sha512-XQteBGXlgEoAKc/BhO6oafUdT4LBa7ARi55mxoyhLHNuA+RlzRmeMAfc31pb/UqU01wBzRc36YqHQzopnkd/6Q== + dependencies: + babel-helper-evaluate-path "^0.5.0" + babel-helper-mark-eval-scopes "^0.4.3" + babel-helper-remove-or-void "^0.4.3" + lodash.some "^4.6.0" + +babel-plugin-minify-flip-comparisons@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz#00ca870cb8f13b45c038b3c1ebc0f227293c965a" + integrity sha1-AMqHDLjxO0XAOLPB68DyJyk8llo= + dependencies: + babel-helper-is-void-0 "^0.4.3" + +babel-plugin-minify-guarded-expressions@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.3.tgz#cc709b4453fd21b1f302877444c89f88427ce397" + integrity sha1-zHCbRFP9IbHzAod0RMifiEJ845c= + dependencies: + babel-helper-flip-expressions "^0.4.3" + +babel-plugin-minify-infinity@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz#dfb876a1b08a06576384ef3f92e653ba607b39ca" + integrity sha1-37h2obCKBldjhO8/kuZTumB7Oco= + +babel-plugin-minify-mangle-names@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz#bcddb507c91d2c99e138bd6b17a19c3c271e3fd3" + integrity sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw== + dependencies: + babel-helper-mark-eval-scopes "^0.4.3" + +babel-plugin-minify-numeric-literals@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz#8e4fd561c79f7801286ff60e8c5fd9deee93c0bc" + integrity sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw= + +babel-plugin-minify-replace@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz#d3e2c9946c9096c070efc96761ce288ec5c3f71c" + integrity sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q== + +babel-plugin-minify-simplify@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.0.tgz#1f090018afb90d8b54d3d027fd8a4927f243da6f" + integrity sha512-TM01J/YcKZ8XIQd1Z3nF2AdWHoDsarjtZ5fWPDksYZNsoOjQ2UO2EWm824Ym6sp127m44gPlLFiO5KFxU8pA5Q== + dependencies: + babel-helper-flip-expressions "^0.4.3" + babel-helper-is-nodes-equiv "^0.0.1" + babel-helper-to-multiple-sequence-expressions "^0.5.0" + +babel-plugin-minify-type-constructors@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz#1bc6f15b87f7ab1085d42b330b717657a2156500" + integrity sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA= + dependencies: + babel-helper-is-void-0 "^0.4.3" + +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-transform-inline-consecutive-adds@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz#323d47a3ea63a83a7ac3c811ae8e6941faf2b0d1" + integrity sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE= + +babel-plugin-transform-member-expression-literals@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz#37039c9a0c3313a39495faac2ff3a6b5b9d038bf" + integrity sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8= + +babel-plugin-transform-merge-sibling-variables@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz#85b422fc3377b449c9d1cde44087203532401dae" + integrity sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4= + +babel-plugin-transform-minify-booleans@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198" + integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg= + +babel-plugin-transform-property-literals@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz#98c1d21e255736573f93ece54459f6ce24985d39" + integrity sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk= + dependencies: + esutils "^2.0.2" + +babel-plugin-transform-regexp-constructors@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz#58b7775b63afcf33328fae9a5f88fbd4fb0b4965" + integrity sha1-WLd3W2OvzzMyj66aX4j71PsLSWU= + +babel-plugin-transform-remove-console@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780" + integrity sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A= + +babel-plugin-transform-remove-debugger@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz#42b727631c97978e1eb2d199a7aec84a18339ef2" + integrity sha1-QrcnYxyXl44estGZp67IShgznvI= + +babel-plugin-transform-remove-undefined@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz#80208b31225766c630c97fa2d288952056ea22dd" + integrity sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ== + dependencies: + babel-helper-evaluate-path "^0.5.0" + +babel-plugin-transform-simplify-comparison-operators@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz#f62afe096cab0e1f68a2d753fdf283888471ceb9" + integrity sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk= + +babel-plugin-transform-undefined-to-void@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz#be241ca81404030678b748717322b89d0c8fe280" + integrity sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA= + +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + integrity sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0= + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.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" + integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY= + dependencies: + babel-plugin-jest-hoist "^23.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-preset-minify@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.5.0.tgz#e25bb8d3590087af02b650967159a77c19bfb96b" + integrity sha512-xj1s9Mon+RFubH569vrGCayA9Fm2GMsCgDRm1Jb8SgctOB7KFcrVc2o8K3YHUyMz+SWP8aea75BoS8YfsXXuiA== + dependencies: + babel-plugin-minify-builtins "^0.5.0" + babel-plugin-minify-constant-folding "^0.5.0" + babel-plugin-minify-dead-code-elimination "^0.5.0" + babel-plugin-minify-flip-comparisons "^0.4.3" + babel-plugin-minify-guarded-expressions "^0.4.3" + babel-plugin-minify-infinity "^0.4.3" + babel-plugin-minify-mangle-names "^0.5.0" + babel-plugin-minify-numeric-literals "^0.4.3" + babel-plugin-minify-replace "^0.5.0" + babel-plugin-minify-simplify "^0.5.0" + babel-plugin-minify-type-constructors "^0.4.3" + babel-plugin-transform-inline-consecutive-adds "^0.4.3" + babel-plugin-transform-member-expression-literals "^6.9.4" + babel-plugin-transform-merge-sibling-variables "^6.9.4" + babel-plugin-transform-minify-booleans "^6.9.4" + babel-plugin-transform-property-literals "^6.9.4" + babel-plugin-transform-regexp-constructors "^0.4.3" + babel-plugin-transform-remove-console "^6.9.4" + babel-plugin-transform-remove-debugger "^6.9.4" + babel-plugin-transform-remove-undefined "^0.5.0" + babel-plugin-transform-simplify-comparison-operators "^6.9.4" + babel-plugin-transform-undefined-to-void "^6.9.4" + lodash.isplainobject "^4.0.6" + +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" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +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" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.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" + babel-types "^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: + 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" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +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= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +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@^1.0.0: version "1.0.0" @@ -1275,6 +1045,13 @@ batch@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.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + benchmark@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" @@ -1341,19 +1118,6 @@ boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -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" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.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" @@ -1392,6 +1156,18 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^0.1.2: + 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" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + 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" @@ -1451,16 +1227,21 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.6.tgz#0f9d9081afc66b36f477c6bdf3813f784f42396a" - integrity sha512-kMGKs4BTzRWviZ8yru18xBpx+CyHG9eqgRbj9XbE3IMgtczf4aiA0Y1YCpVdvUieKGZ03kolSPXqTcscBCb9qw== +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" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: - caniuse-lite "^1.0.30000921" - electron-to-chromium "^1.3.92" - node-releases "^1.1.1" + node-int64 "^0.4.0" -buffer-from@^1.0.0: +buffer-from@1.x, buffer-from@^1.0.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== @@ -1484,15 +1265,15 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.0.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-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" - integrity sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg== +builtin-modules@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.0.0.tgz#1e587d44b006620d90286cc7a9238bbc6129cab1" + integrity sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg== builtin-status-codes@^3.0.0: version "3.0.0" @@ -1549,32 +1330,15 @@ caching-transform@^2.0.0: package-hash "^2.0.0" write-file-atomic "^2.0.0" -call-matcher@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.1.0.tgz#23b2c1bc7a8394c8be28609d77ddbd5786680432" - integrity sha512-IoQLeNwwf9KTNbtSA7aEBb1yfDbdnzwjCetjkC8io5oGeOmK2CBNdg0xr+tadRYKO0p7uQyZzvon0kXlZbvGrw== - dependencies: - core-js "^2.0.0" - deep-equal "^1.0.0" - espurify "^1.6.0" - estraverse "^4.0.0" - -call-signature@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" - integrity sha1-qEq8glpV70yysCi9dOIFpluaSZY= - -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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= -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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== camel-case@3.0.x: version "3.0.0" @@ -1584,21 +1348,7 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" -camelcase-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= - dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" - -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: +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= @@ -1608,31 +1358,49 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -caniuse-lite@^1.0.30000921: - version "1.0.30000925" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000925.tgz#f1a3b9aae2a83071b1eccfa39959d72440409b08" - integrity sha512-zcYupoUxtW46rOikuDF7vfL9N1Qe9ZuUBTz3n3q8fFsoJIs/h9UN6Vg/0QpjsmvImXw9mVc3g+ZBfqvUz/iALA== +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= + dependencies: + rsvp "^3.3.3" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -capture-stack-trace@^1.0.0: - 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== +chalk@1.1.3, chalk@^1.0.0, 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" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, 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== +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4: +chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== @@ -1664,26 +1432,11 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -chunkd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chunkd/-/chunkd-1.0.0.tgz#4ead4a3704bcce510c4bb4d4a8be30c557836dd1" - integrity sha512-xx3Pb5VF9QaqCotolyZ1ywFBgyuJmu6+9dLiqBxgelEse9Xsr3yUlpoX3O4Oh11M00GT2kYMsRByTKIMJW2Lkg== - 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== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-parallel-vars@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ci-parallel-vars/-/ci-parallel-vars-1.0.0.tgz#af97729ed1c7381911ca37bcea263d62638701b3" - integrity sha512-u6dx20FBXm+apMi+5x7UVm6EH7BL1gc4XrcnQewjcB7HWRcor/V5qWc3RG2HwpgDJ26gIi2DSEu3B7sXynAw/g== - 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" @@ -1714,21 +1467,6 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.0.0.tgz#301bfa9e8dd2d3d984c0e542f7aa67b996f63e0a" - integrity sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A== - -clean-yaml-object@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" - integrity sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g= - -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" @@ -1736,11 +1474,6 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" - integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== - cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" @@ -1748,28 +1481,11 @@ cli-table@^0.3.1: dependencies: colors "1.0.3" -cli-truncate@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" - integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== - dependencies: - slice-ansi "^1.0.0" - string-width "^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@^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" - wrap-ansi "^2.0.0" - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -1779,22 +1495,10 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -coalescy@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/coalescy/-/coalescy-1.0.0.tgz#4b065846b836361ada6c4b4a4abf4bc1cac31bf1" - integrity sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E= - -code-excerpt@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.1.tgz#5fe3057bfbb71a5f300f659ef2cc0a47651ba77c" - integrity sha512-tJLhH3EpFm/1x7heIW0hemXJTUU5EWl2V0EIX558jp05Mt1U6DVryCgkp3l37cxqs+DNbNgxG43SkwJXpQ14Jw== - dependencies: - convert-to-spaces "^1.0.1" +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= code-point-at@^1.0.0: version "1.1.0" @@ -1826,21 +1530,23 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +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" + commander@2.17.x, 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== -commander@^2.8.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== -common-path-prefix@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" - integrity sha1-zVL28HEuC6q5fW+XModPIvR3UsA= - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1876,7 +1582,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.5.0, concat-stream@^1.5.1: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1886,35 +1592,6 @@ concat-stream@^1.5.0, concat-stream@^1.5.1: readable-stream "^2.2.2" typedarray "^0.0.6" -concordance@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/concordance/-/concordance-4.0.0.tgz#5932fdee397d129bdbc3a1885fbe69839b1b7e15" - integrity sha512-l0RFuB8RLfCS0Pt2Id39/oCPykE01pyxgAFypWTlaGRgvLkZrtczZ8atEHpTeEIW+zYWXTBuA9cCSeEOScxReQ== - dependencies: - date-time "^2.1.0" - esutils "^2.0.2" - fast-diff "^1.1.2" - js-string-escape "^1.0.1" - lodash.clonedeep "^4.5.0" - lodash.flattendeep "^4.4.0" - lodash.islength "^4.0.1" - lodash.merge "^4.6.1" - md5-hex "^2.0.0" - semver "^5.5.1" - well-known-symbols "^2.0.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" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^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" @@ -1937,11 +1614,6 @@ constants-browserify@^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" @@ -1952,18 +1624,13 @@ content-type@~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.1.0, convert-source-map@^1.6.0: +convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.6.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" -convert-to-spaces@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -1991,12 +1658,12 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.0.0, core-js@^2.5.7: +core-js@^2.4.0, core-js@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.1.tgz#87416ae817de957a3f249b3b5ca475d4aaed6042" integrity sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg== -core-util-is@~1.0.0: +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= @@ -2009,13 +1676,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.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" @@ -2084,11 +1744,6 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -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-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -2104,35 +1759,54 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== -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= +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" + integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== + +cssstyle@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" + integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog== dependencies: - array-find-index "^1.0.1" + cssom "0.3.x" -curriable@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/curriable/-/curriable-1.2.2.tgz#07529e2d82c7bdcc16469511a65682b0f02c1158" - integrity sha512-gCvU0Hl8EYScI0mPksUiI+kLEV5M9Cva357EWMQGwXI3vc9mBWv7VnqN90YfMhd8tyDuTxakzuZv7lAdPBozow== +csstype@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.0.tgz#6cf7b2fa7fc32aab3d746802c244d4eda71371a2" + integrity sha512-by8hi8BlLbowQq0qtkx54d9aN73R9oUW20HISpka5kmgsR9F7nnxgfsemuR2sdCKZh+CDNf5egW9UZMm4mgJRg== + +curriable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/curriable/-/curriable-1.2.4.tgz#0bbdd0fea2679f195c8f83a33e1a5904ce2b5978" + integrity sha512-ztdZozdCEpuzsTW0ruWqhO3TEOjsj3KG3wTiotd2joU7+3XJY/1NqrsDJr2gdnLGM8g3ZLIwenG34EWp9Jrt2A== cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +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" + +data-urls@^1.0.0: + 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 "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.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= -date-time@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" - integrity sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g== - dependencies: - time-zone "^1.0.0" - debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" @@ -2166,15 +1840,7 @@ debug@^4.0.1, debug@^4.1.0: 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" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2191,7 +1857,7 @@ decode-uri-component@^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.0, deep-equal@^1.0.1: +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= @@ -2214,6 +1880,13 @@ default-gateway@^2.6.0: execa "^0.10.0" ip-regex "^2.1.0" +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" + 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" @@ -2221,13 +1894,6 @@ default-require-extensions@^2.0.0: dependencies: strip-bom "^3.0.0" -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -2269,6 +1935,11 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +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" @@ -2292,17 +1963,34 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +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-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -diff@^3.5.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== @@ -2316,14 +2004,6 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.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" @@ -2344,13 +2024,13 @@ dns-txt@^2.0.2: 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= +doctrine@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" + integrity sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM= dependencies: - esutils "^2.0.2" - isarray "^1.0.0" + esutils "^1.1.6" + isarray "0.0.1" doctrine@^2.1.0: version "2.1.0" @@ -2389,6 +2069,13 @@ domelementtype@~1.1.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domhandler@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" @@ -2411,18 +2098,6 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.0, dot-prop@^4.2.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" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" @@ -2433,16 +2108,19 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.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.3.92: - version "1.3.96" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.96.tgz#25770ec99b8b07706dedf3a5f43fa50cb54c4f9a" - integrity sha512-ZUXBUyGLeoJxp4Nt6G/GjBRLnyz8IKQGexZ2ndWaoegThgMGFO1tdDYID5gBV32/1S83osjJHyfzvanE/8HY4Q== - elliptic@^6.0.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" @@ -2456,29 +2134,23 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -emittery@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.4.1.tgz#abe9d3297389ba424ac87e53d1c701962ce7433d" - integrity sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ== - 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= -empower-core@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-1.2.0.tgz#ce3fb2484d5187fa29c23fba8344b0b2fdf5601c" - integrity sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ== - dependencies: - call-signature "0.0.2" - core-js "^2.0.0" - 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" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -2486,7 +2158,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.1.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== @@ -2500,11 +2172,6 @@ entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -equal-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" - integrity sha1-IcoRLUirJLTh5//A5TOdMf38J0w= - errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -2519,18 +2186,19 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.11.0, es-abstract@^1.5.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== +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== dependencies: - es-to-primitive "^1.1.1" + es-to-primitive "^1.2.0" function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" + has "^1.0.3" + is-callable "^1.1.4" is-regex "^1.0.4" + object-keys "^1.0.12" -es-to-primitive@^1.1.1: +es-to-primitive@^1.2.0: 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== @@ -2549,102 +2217,22 @@ escape-html@~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.4, 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= -eslint-config-rapid7@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-rapid7/-/eslint-config-rapid7-3.1.0.tgz#98252e557bbe96746fd81485771d5c191d8243db" - integrity sha512-Y3a7NYrJ1qhy8UXrbPzKjqj+VBt4bi8Q7bQ6DKUIJW68dtGpPHBqm/BLCCoWEZUT2SRuvyHa3lwaCN+nGv9OeA== - dependencies: - eslint-plugin-import "^2.13.0" - eslint-plugin-rapid7 "^7.3.4" - eslint-plugin-react "^7.10.0" - -eslint-friendly-formatter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz#27d504dc837f7caddbf201b2e84a4ee730ba3efa" - integrity sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo= - dependencies: - chalk "^2.0.1" - coalescy "1.0.0" - extend "^3.0.0" - minimist "^1.2.0" - strip-ansi "^4.0.0" - text-table "^0.2.0" - -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-loader@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.1.tgz#2a9251523652430bfdd643efdb0afc1a2a89546a" - integrity sha512-1GrJFfSevQdYpoDzx8mEE2TDWsb/zmFuY09l6hURg1AeFIKQOvZ+vH0UPjzmd1CZIbfTV5HUkMeBmFiDBkgIsQ== - dependencies: - loader-fs-cache "^1.0.0" - loader-utils "^1.0.2" - object-assign "^4.0.1" - object-hash "^1.1.4" - rimraf "^2.6.1" - -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.13.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-rapid7@^7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-rapid7/-/eslint-plugin-rapid7-7.3.4.tgz#0cfda989706d07846e976f33696edcdceffb0b12" - integrity sha512-KDXil/N1X2D1JELbjnXlKwWidDkO3J9cPNXq0J3B4ZCqdrEbrN4yyS8VzTtURzbzD4bQ6Q0Eg34dQXYp2+ltuA== - dependencies: - natural-compare "^1.4.0" - -eslint-plugin-react@^7.10.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.0.tgz#fa6701063f2172c3e1db3a22d3db6d8bdc0179af" - integrity sha512-OrmXBWGrZ8gvYWO0W4oiLtASxFWVfe2blgy5pvB57YRwylhghUQL5y5w70fysP/CRTt/XJ+FLv/KXhZxbsQwiw== - dependencies: - array-includes "^3.0.3" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.0.1" - object.fromentries "^2.0.0" - prop-types "^15.6.2" - resolve "^1.9.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= +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: - esrecurse "^4.1.0" - estraverse "^4.1.1" + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" eslint-scope@^4.0.0: version "4.0.0" @@ -2664,10 +2252,10 @@ eslint-visitor-keys@^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@^5.4.0: - version "5.11.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.11.1.tgz#8deda83db9f354bf9d3f53f9677af7e0e13eadda" - integrity sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg== +eslint@^5.12.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.12.0.tgz#fab3b908f60c52671fb14e996a450b96c743c859" + integrity sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.5.3" @@ -2686,6 +2274,7 @@ eslint@^5.4.0: glob "^7.1.2" globals "^11.7.0" ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" inquirer "^6.1.0" js-yaml "^3.12.0" @@ -2700,28 +2289,12 @@ eslint@^5.4.0: pluralize "^7.0.0" progress "^2.0.0" regexpp "^2.0.1" - require-uncached "^1.0.3" semver "^5.5.1" strip-ansi "^4.0.0" strip-json-comments "^2.0.1" table "^5.0.2" text-table "^0.2.0" -esm@^3.0.84: - version "3.0.84" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.0.84.tgz#bb108989f4673b32d4f62406869c28eed3815a63" - integrity sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw== - -espower-location-detector@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" - integrity sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU= - dependencies: - is-url "^1.2.1" - path-is-absolute "^1.0.0" - source-map "^0.5.0" - xtend "^4.0.0" - espree@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c" @@ -2731,18 +2304,16 @@ espree@^5.0.0: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" +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.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -espurify@^1.6.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.8.1.tgz#5746c6c1ab42d302de10bd1d5bf7f0e8c0515056" - integrity sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg== - dependencies: - core-js "^2.0.0" - esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -2757,21 +2328,21 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +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= -estree-walker@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" - integrity sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao= - estree-walker@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== +esutils@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" + integrity sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U= + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2807,6 +2378,13 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== + dependencies: + merge "^1.2.0" + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -2846,6 +2424,11 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -2873,6 +2456,25 @@ expand-range@^1.8.1: 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" + +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.6.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + express@^4.16.2: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" @@ -2924,11 +2526,20 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0: +extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^2.0.1: + 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" + tmp "^0.0.33" + external-editor@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" @@ -2959,17 +2570,22 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +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@^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-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-json-stable-stringify@^2.0.0: +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= @@ -2993,6 +2609,13 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" +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" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3018,6 +2641,14 @@ filename-regex@^2.0.0: 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" + fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" @@ -3052,24 +2683,6 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" -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" - pkg-dir "^1.0.0" - -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" - pkg-dir "^2.0.0" - find-cache-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" @@ -3087,7 +2700,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.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= @@ -3101,6 +2714,16 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + flat-cache@^1.2.1: version "1.3.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" @@ -3120,9 +2743,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.0.4" follow-redirects@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.0.tgz#d12452c031e8c67eb6637d861bfc7a8090167933" - integrity sha512-4Oh4eI3S9OueVV41AgJ1oLjpaJUhbJ7JDGOMhe0AFqoSejl5Q2nn3eGglAzRUKVKZE8jG5MNn66TjCJMAnpsWA== + version "1.6.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.1.tgz#514973c44b5757368bad8bddfe52f81f015c94cb" + integrity sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ== dependencies: debug "=3.1.0" @@ -3146,6 +2769,20 @@ foreground-child@^1.5.6: cross-spawn "^4" signal-exit "^3.0.0" +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.2: + 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" + mime-types "^2.1.12" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -3171,6 +2808,15 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.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== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3178,11 +2824,6 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.1.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-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -3198,7 +2839,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2: +fsevents@^1.2.2, 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== @@ -3235,10 +2876,10 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-port@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.1.0.tgz#93eb3d5552c197497d76e9c389a6ac9920e20192" - integrity sha512-4/fqAYrzrzOiqDrdeZRKXGdTGgbkfTEumGlNQPeP6Jy8w0PzN9mzeNQ3XgHaTNie8pQ3hOUkrwlZt2Fzk5H9mA== +get-caller-file@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.1.tgz#25835260d3a2b9665fcdbb08cb039a7bbf7011c0" + integrity sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg== get-stream@^3.0.0: version "3.0.0" @@ -3257,6 +2898,13 @@ get-value@^2.0.3, get-value@^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" @@ -3280,7 +2928,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: +glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -3292,23 +2940,41 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -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-path@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931" integrity sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg== +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" + resolve-dir "^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" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + globals@^11.1.0, globals@^11.7.0: 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" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -3320,46 +2986,22 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globby@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.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" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 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== +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= + handle-thing@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@^4.0.11: +handlebars@^4.0.11, handlebars@^4.0.3: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== @@ -3370,6 +3012,31 @@ handlebars@^4.0.11: optionalDependencies: uglify-js "^3.1.4" +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.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +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@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3453,10 +3120,20 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-or-tmp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" - integrity sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs= +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" + +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.7.1" @@ -3473,6 +3150,13 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" +html-encoding-sniffer@^1.0.2: + 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" @@ -3553,6 +3237,15 @@ http-proxy@^1.16.2: follow-redirects "^1.0.0" requires-port "^1.0.0" +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" + sshpk "^1.7.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -3565,7 +3258,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, 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== @@ -3582,11 +3275,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-by-default@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= - ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" @@ -3594,20 +3282,26 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -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-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" import-local@^2.0.0: version "2.0.0" @@ -3627,11 +3321,6 @@ in-publish@^2.0.0: resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= -indent-string@^3.0.0, indent-string@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -3660,6 +3349,25 @@ ini@^1.3.4, 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: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + integrity sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c= + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + inquirer@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" @@ -3692,13 +3400,18 @@ interpret@^1.1.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -invariant@^2.2.2: +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" +inversify@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e" + integrity sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ== + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -3729,11 +3442,6 @@ ipaddr.js@^1.5.2: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" integrity sha1-+kt5+kf9Pe9eOxWYJRYcClGclCc= -irregular-plurals@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872" - integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw== - 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" @@ -3772,7 +3480,7 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.3, is-callable@^1.1.4: +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== @@ -3784,13 +3492,6 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.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" @@ -3840,11 +3541,6 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-error@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" - integrity sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw= - 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" @@ -3867,6 +3563,13 @@ is-extglob@^2.1.0, is-extglob@^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" @@ -3879,6 +3582,11 @@ is-fullwidth-code-point@^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-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= + 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" @@ -3900,24 +3608,11 @@ is-glob@^4.0.0: 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" - is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= -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" @@ -3937,25 +3632,6 @@ is-number@^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-observable@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" - integrity sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI= - dependencies: - symbol-observable "^0.2.2" - -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.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" @@ -3975,11 +3651,6 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-obj@^1.1.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" @@ -4002,11 +3673,6 @@ is-promise@^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" @@ -4014,12 +3680,7 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -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-stream@^1.0.0, is-stream@^1.1.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= @@ -4031,17 +3692,17 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-url@^1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +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, is-utf8@^0.2.1: +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.2: +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== @@ -4078,11 +3739,45 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +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.3.1: + 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" + fileset "^2.0.2" + 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, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + istanbul-lib-coverage@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA== +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 "^0.4.0" + istanbul-lib-hook@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" @@ -4090,45 +3785,388 @@ istanbul-lib-hook@^2.0.1: dependencies: append-transform "^1.0.0" +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.1" + semver "^5.3.0" + istanbul-lib-instrument@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" integrity sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ== dependencies: - "@babel/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.1" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.1" + semver "^5.5.0" + +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.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-report@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" + integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q== + dependencies: + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + supports-color "^5.4.0" + +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.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-lib-source-maps@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" + integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A== + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + rimraf "^2.6.2" + source-map "^0.6.1" + +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" + +istanbul-reports@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" + integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw== + dependencies: + handlebars "^4.0.11" + +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" + integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA== + dependencies: + throat "^4.0.0" + +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" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.3.1" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-source-maps "^1.2.4" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" + jest-get-type "^22.1.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.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.6.0" + jest-watcher "^23.4.0" + jest-worker "^23.2.0" + micromatch "^2.3.11" + node-notifier "^5.2.1" + prompts "^0.1.9" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^11.0.0" + +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.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.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" + +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.6.0" + +jest-docblock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" + integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c= + dependencies: + detect-newline "^2.1.0" + +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.6.0" + +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" + +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + +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.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" + invariant "^2.2.4" + jest-docblock "^23.2.0" + jest-serializer "^23.0.1" + jest-worker "^23.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + +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.6.0" + is-generator-fn "^1.0.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.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +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.6.0" + +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.6.0" + +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= + +jest-regex-util@^23.3.0: + version "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.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.6.0" + +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.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.6.0" + jest-docblock "^23.2.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.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.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" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.11" + 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.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^11.0.0" + +jest-serializer@^23.0.1: + version "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.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.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^23.6.0" semver "^5.5.0" -istanbul-lib-report@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" - integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q== +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= dependencies: - istanbul-lib-coverage "^2.0.1" - make-dir "^1.3.0" - supports-color "^5.4.0" + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" -istanbul-lib-source-maps@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" - integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A== +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: - debug "^3.1.0" - istanbul-lib-coverage "^2.0.1" - make-dir "^1.3.0" - rimraf "^2.6.2" - source-map "^0.6.1" + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.6.0" -istanbul-reports@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" - integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw== +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw= dependencies: - handlebars "^4.0.11" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + string-length "^2.0.0" jest-worker@^23.2.0: version "23.2.0" @@ -4137,39 +4175,79 @@ jest-worker@^23.2.0: dependencies: merge-stream "^1.0.1" -js-levenshtein@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" - integrity sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow== - -js-string-escape@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= +jest@^23.6.0: + 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.6.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-yaml@^3.10.0, js-yaml@^3.12.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== +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.12.0, js-yaml@^3.7.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== dependencies: argparse "^1.0.7" esprima "^4.0.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@^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== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.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@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -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, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -4180,17 +4258,34 @@ json-schema-traverse@^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" + 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: + 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@2.x, json5@^2.1.0: + 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.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= @@ -4202,24 +4297,22 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.0: - 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" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" -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= +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: - array-includes "^3.0.3" - -just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" - integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" killable@^1.0.0: version "1.0.1" @@ -4250,12 +4343,10 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -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" +kleur@^2.0.1: + 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" @@ -4271,6 +4362,16 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +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" @@ -4290,16 +4391,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.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" - pify "^2.0.0" - strip-bom "^3.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4310,14 +4401,6 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.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" - loader-runner@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" @@ -4358,83 +4441,41 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - -lodash.clone@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.clonedeepwith@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4" - integrity sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ= - -lodash.debounce@^4.0.3, lodash.debounce@^4.0.8: +lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.difference@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= -lodash.islength@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.islength/-/lodash.islength-4.0.1.tgz#4e9868d452575d750affd358c979543dc20ed577" - integrity sha1-Tpho1FJXXXUK/9NYyXlUPcIO1Xc= +lodash.some@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.merge@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= -lolex@^2.3.2, lolex@^2.7.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" - integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== - 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" @@ -4442,24 +4483,11 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0, loud-rejection@^1.2.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" - 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.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -4475,13 +4503,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -magic-string@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" - integrity sha1-lw67DacZMwEoX7GqZQ85vdgetFo= - dependencies: - vlq "^0.2.1" - make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -4489,6 +4510,18 @@ make-dir@^1.0.0, make-dir@^1.3.0: dependencies: pify "^3.0.0" +make-error@1.x: + 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" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -4501,16 +4534,6 @@ map-cache@^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: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -4518,13 +4541,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -matcher@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" - integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== - dependencies: - escape-string-regexp "^1.0.4" - math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" @@ -4580,21 +4596,6 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -4614,6 +4615,11 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4638,7 +4644,7 @@ 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.9: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -4670,7 +4676,7 @@ miller-rabin@^4.0.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.17, mime-types@~2.1.18: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: 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== @@ -4702,27 +4708,19 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^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.0, minimatch@^3.0.3, minimatch@^3.0.4: +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-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - 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.2.0: +minimist@1.2.0, minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -4771,7 +4769,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.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= @@ -4813,16 +4811,6 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -multimatch@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis= - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -4879,17 +4867,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.4.5: - version "1.4.8" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.8.tgz#ce91c31e86cf9b2c4cac49d7fcd7f56779bfd6b0" - integrity sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw== - dependencies: - "@sinonjs/formatio" "^3.1.0" - just-extend "^4.0.2" - lolex "^2.3.2" - path-to-regexp "^1.7.0" - text-encoding "^0.6.4" - no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" @@ -4897,11 +4874,24 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + integrity sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ= + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +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" @@ -4931,10 +4921,15 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= +node-notifier@^5.2.1: + 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.5.0" + shellwords "^0.1.1" + which "^1.3.0" node-pre-gyp@^0.10.0: version "0.10.3" @@ -4952,13 +4947,6 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.2.tgz#93c17fba5eec8650ad908de5433fa8763baebe4d" - integrity sha512-j1gEV/zX821yxdWp/1vBMN0pSUjuH9oGUdLCb4PfUko6ZW7KdRs3Z+QGGwDUhYtSpQvdVVyLd2V0YvLsmdg5jQ== - dependencies: - semver "^5.3.0" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -4967,7 +4955,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: 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== @@ -4990,9 +4978,9 @@ npm-bundled@^1.0.1: integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + version "1.2.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.2.0.tgz#55a60e793e272f00862c7089274439a4cc31fc7f" + integrity sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5026,6 +5014,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.0.9" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" + integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== + nyc@^13.0.1: version "13.1.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-13.1.0.tgz#463665c7ff6b5798e322624a5eb449a678db90e3" @@ -5057,6 +5050,11 @@ nyc@^13.0.1: yargs "11.1.0" yargs-parser "^9.0.2" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + 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" @@ -5071,11 +5069,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^1.1.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" - integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== - object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -5088,16 +5081,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.fromentries@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" - integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== - dependencies: - define-properties "^1.1.2" - es-abstract "^1.11.0" - function-bind "^1.1.1" - has "^1.0.1" - object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -5121,14 +5104,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -observable-to-promise@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.5.0.tgz#c828f0f0dc47e9f86af8a4977c5d55076ce7a91f" - integrity sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8= - dependencies: - is-observable "^0.2.0" - symbol-observable "^1.0.4" - obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -5160,6 +5135,26 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opencollective@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + integrity sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE= + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + integrity sha1-erwi5kTf9jsKltWrfyeQwPAavJU= + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + opn@^5.1.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" @@ -5175,26 +5170,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optimize-js-plugin@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/optimize-js-plugin/-/optimize-js-plugin-0.0.4.tgz#69e7a67e0f66c69f7fc0c7b25c5d33b2db6c2817" - integrity sha1-aeemfg9mxp9/wMeyXF0zsttsKBc= - dependencies: - optimize-js "^1.0.0" - webpack-sources "^0.1.2" - -optimize-js@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/optimize-js/-/optimize-js-1.0.3.tgz#4326af8657c4a5ff32daf726631754f72ab7fdbc" - integrity sha1-QyavhlfEpf8y2vcmYxdU9yq3/bw= - dependencies: - acorn "^3.3.0" - concat-stream "^1.5.1" - estree-walker "^0.3.0" - magic-string "^0.16.0" - yargs "^4.8.1" - -optionator@^0.8.2: +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= @@ -5206,18 +5182,6 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" - integrity sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg== - dependencies: - chalk "^2.3.1" - cli-cursor "^2.1.0" - cli-spinners "^1.1.0" - log-symbols "^2.2.0" - strip-ansi "^4.0.0" - wcwidth "^1.0.1" - original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -5235,13 +5199,6 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: 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" @@ -5273,15 +5230,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" - integrity sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ== - dependencies: - graceful-fs "^4.1.11" - is-plain-obj "^1.1.0" - mkdirp "^0.5.1" - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -5350,16 +5298,6 @@ package-hash@^2.0.0: md5-hex "^2.0.0" release-zalgo "^1.0.0" -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" - registry-url "^3.0.3" - semver "^5.1.0" - pako@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" @@ -5381,6 +5319,13 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +parent-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" + integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" @@ -5417,10 +5362,15 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-ms@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.0.0.tgz#7b3640295100caf3fa0100ccceb56635b62f9d62" - integrity sha512-AddiXFSLLCqj+tCRJ9MrUtHZB4DWojO3tk0NVZ+g5MaMQHF2+p2ktqxuoXyPFLljz/aUK0Nfhd/uGWnhXVXEyA== +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@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parseurl@~1.3.2: version "1.3.2" @@ -5454,7 +5404,7 @@ path-exists@^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.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= @@ -5469,7 +5419,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.6: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -5479,13 +5429,6 @@ path-to-regexp@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.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" @@ -5495,13 +5438,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.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" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -5510,9 +5446,9 @@ path-type@^3.0.0: pify "^3.0.0" pathington@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/pathington/-/pathington-1.1.5.tgz#9c0110287e769d1ee26f6758c7339d920a6cf5c7" - integrity sha512-lDBQm2mJjMgL+tL/y2xpa/2fm1PVA6jtzGGZcTVXWQt0X3UwJbyoalQsl+PoNpdduuGiAp7zmVNuRaoYyhAYew== + version "1.1.6" + resolved "https://registry.yarnpkg.com/pathington/-/pathington-1.1.6.tgz#50a67698cd9e7413a1ec338a854b120a49a7a6ef" + integrity sha512-ckHVyoWKT9WZ1hrpQu+H4T/9xj8CkoUjo3W+kUP7TkZ1D2/SPW+35hZQPhuXOBkYVMHXsbOgEqHlBj6rd5fuWQ== pbkdf2@^3.0.3: version "3.0.17" @@ -5552,28 +5488,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" - integrity sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-conf@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.1.0.tgz#2126514ca6f2abfebd168596df18ba57867f0058" - integrity sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg= - dependencies: - find-up "^2.0.0" - load-json-file "^4.0.0" - -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" @@ -5593,18 +5507,16 @@ platform@^1.3.3: resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" integrity sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q== -plur@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/plur/-/plur-3.0.1.tgz#268652d605f816699b42b86248de73c9acd06a7c" - integrity sha512-lJl0ojUynAM1BZn58Pas2WT/TXeC1+bS+UqShl0x9+49AtOn7DixRXVzaC8qrDOIxNDmepKnLuMTH7NQmkX0PA== - dependencies: - irregular-plurals "^2.0.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" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + portfinder@^1.0.9: version "1.0.20" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" @@ -5624,11 +5536,6 @@ prelude-ls@~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.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" @@ -5642,14 +5549,15 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-ms@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-4.0.0.tgz#31baf41b94fd02227098aaa03bd62608eb0d6e92" - integrity sha512-qG66ahoLCwpLXD09ZPHSCbUWYTqdosB7SMP4OffgTgL2PBKXMuUsrk5Bwg8q4qPkjTXsKBMr+YK3Ltd/6F9s/Q== +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: - parse-ms "^2.0.0" + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" -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== @@ -5674,6 +5582,14 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +prompts@^0.1.9: + version "0.1.14" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" + integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w== + dependencies: + kleur "^2.0.1" + sisteransi "^0.1.1" + prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" @@ -5700,6 +5616,11 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +psl@^1.1.24, psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -5742,17 +5663,17 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4: +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: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.5.2: +qs@6.5.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== @@ -5772,15 +5693,10 @@ querystringify@^2.0.0: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= - -ramda@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" - integrity sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== +ramda@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" + integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== randomatic@^3.0.0: version "3.1.1" @@ -5821,7 +5737,7 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -5841,7 +5757,7 @@ react-dom@^16.4.2: prop-types "^15.6.2" scheduler "^0.12.0" -react@^16.4.1: +react@^16.7.0: version "16.7.0" resolved "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381" integrity sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A== @@ -5859,22 +5775,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -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" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -5892,15 +5792,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^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" - path-type "^2.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -5951,32 +5842,27 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= - dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" - -regenerate-unicode-properties@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" - integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== +realpath-native@^1.0.0: + 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: - regenerate "^1.4.0" + util.promisify "^1.0.0" -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== +reflect-metadata@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" + integrity sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A== -regenerator-transform@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" - integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== - dependencies: - private "^0.1.6" +regenerator-runtime@^0.10.0: + 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" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regex-cache@^0.4.2: version "0.4.4" @@ -5998,45 +5884,6 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^4.1.3, regexpu-core@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" - integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^7.0.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.0.2" - -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" - -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.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - 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" @@ -6075,6 +5922,55 @@ repeat-string@^1.5.2, repeat-string@^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-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +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== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -6085,19 +5981,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-precompiled@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" - integrity sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo= - -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" - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -6110,10 +5993,13 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" -resolve-from@^1.0.0: +resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + 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" resolve-from@^3.0.0: version "3.0.0" @@ -6130,7 +6016,19 @@ 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.6, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.9.0: +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.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== + dependencies: + path-parse "^1.0.5" + +resolve@1.x, resolve@^1.3.2, resolve@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== @@ -6150,12 +6048,12 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -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== +rimraf@^2.2.8, rimraf@^2.4.4, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: - glob "^7.0.5" + glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -6165,34 +6063,36 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-babel@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.1.0.tgz#c97f50c82aa8e89ddaa116cdc5c832b8ba74db17" - integrity sha512-4IYv/yTNyH4P/Cma1mWdqy42gc051i1mTe/6oe8F055WzJGSb2qs1mSDwZTo93wA6kMBgHBIR/OcBk7JMnL59Q== +rollup-plugin-babel-minify@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-babel-minify/-/rollup-plugin-babel-minify-6.2.0.tgz#d101fa6c1ff79c67b2af91632a87284bf1bd7f8b" + integrity sha512-Ahil4nyB97OSoMTqm8qDyuL8e3NU1juDDdTC3Tuy00DvCLJmuX7OVrfEhGVJtguh/D1aO2t/2pe59/dzT/k4mw== dependencies: - "@babel/helper-module-imports" "^7.0.0" - rollup-pluginutils "^2.3.0" + "@babel/core" "^7.0.0" + "@comandeer/babel-plugin-banner" "^4.0.0" + babel-preset-minify "^0.5.0" + sourcemap-codec "^1.4.3" -rollup-plugin-node-resolve@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz#908585eda12e393caac7498715a01e08606abc89" - integrity sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg== +rollup-plugin-node-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.0.0.tgz#9bc6b8205e9936cc0e26bba2415f1ecf1e64d9b2" + integrity sha512-7Ni+/M5RPSUBfUaP9alwYQiIKnKeXCOHiqBpKUl9kwp3jX5ZJtgXAait1cne6pGEVUUztPD6skIKH9Kq9sNtfw== dependencies: - builtin-modules "^2.0.0" + builtin-modules "^3.0.0" is-module "^1.0.0" - resolve "^1.1.6" + resolve "^1.8.1" -rollup-plugin-uglify@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.0.tgz#15aa8919e5cdc63b7cfc9319c781788b40084ce4" - integrity sha512-XtzZd159QuOaXNvcxyBcbUCSoBsv5YYWK+7ZwUyujSmISst8avRfjWlp7cGu8T2O52OJnpEBvl+D4WLV1k1iQQ== +rollup-plugin-typescript2@^0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.18.1.tgz#921865828080a254c088c6bc181ca654e5ef73c6" + integrity sha512-aR2m5NCCAUV/KpcKgCWX6Giy8rTko9z92b5t0NX9eZyjOftCvcdDFa1C9Ze/9yp590hnRymr5hG0O9SAXi1oUg== dependencies: - "@babel/code-frame" "^7.0.0" - jest-worker "^23.2.0" - serialize-javascript "^1.5.0" - uglify-js "^3.4.9" + fs-extra "7.0.0" + resolve "1.8.1" + rollup-pluginutils "2.3.3" + tslib "1.9.3" -rollup-pluginutils@^2.3.0: +rollup-pluginutils@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.3.tgz#3aad9b1eb3e7fe8262820818840bf091e5ae6794" integrity sha512-2XZwja7b6P5q4RZ5FhyX1+f46xi1Z3qBKigLRZ6VTZjwbN0K1IFGMlwm06Uu0Emcre2Z63l77nq/pzn+KxIEoA== @@ -6200,13 +6100,19 @@ rollup-pluginutils@^2.3.0: estree-walker "^0.5.2" micromatch "^2.3.11" -rollup@^0.66.1: - version "0.66.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.66.6.tgz#ce7d6185beb7acea644ce220c25e71ae03275482" - integrity sha512-J7/SWanrcb83vfIHqa8+aVVGzy457GcjA6GVZEnD0x2u4OnOd0Q1pCrEoNe8yLwM6z6LZP02zBT2uW0yh5TqOw== +rollup@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.0.2.tgz#df88abda5cfe96afaa07dbd540510f87e60d1baf" + integrity sha512-FkkSrWUVo1WliS+/GIgEmKQPILubgVdBRTWampfdhkasxx7sM2nfwSfKiX3paIBVnN0HG3DvkTy13RfjkyBX9w== dependencies: "@types/estree" "0.0.39" "@types/node" "*" + acorn "^6.0.4" + +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== run-async@^2.2.0: version "2.3.0" @@ -6222,6 +6128,11 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + rxjs@^6.1.0: version "6.3.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" @@ -6241,11 +6152,27 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, 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@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -6288,14 +6215,7 @@ selfsigned@^1.9.1: dependencies: node-forge "0.7.5" -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, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, 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== @@ -6319,12 +6239,7 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" -serialize-error@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" - integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= - -serialize-javascript@^1.4.0, serialize-javascript@^1.5.0: +serialize-javascript@^1.4.0: version "1.6.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== @@ -6407,36 +6322,26 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +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= -sinon@^6.1.5: - version "6.3.5" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-6.3.5.tgz#0f6d6a5b4ebaad1f6e8e019395542d1d02c144a0" - integrity sha512-xgoZ2gKjyVRcF08RrIQc+srnSyY1JDJtxu3Nsz07j1ffjgXoY6uPLf/qja6nDBZgzYYEovVkFryw2+KiZz11xQ== - dependencies: - "@sinonjs/commons" "^1.0.2" - "@sinonjs/formatio" "^3.0.0" - "@sinonjs/samsam" "^2.1.2" - diff "^3.5.0" - lodash.get "^4.4.2" - lolex "^2.7.5" - nise "^1.4.5" - supports-color "^5.5.0" - type-detect "^4.0.8" +sisteransi@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" + integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slice-ansi@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.0.0.tgz#5373bdb8559b45676e8541c66916cdd6251612e7" @@ -6446,18 +6351,6 @@ slice-ansi@2.0.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -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" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6513,11 +6406,6 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-list-map@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" - integrity sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY= - source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" @@ -6529,7 +6417,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.9, source-map-support@~0.5.6: +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-support@^0.5.6, source-map-support@~0.5.6: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== @@ -6542,7 +6437,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.5.0, source-map@^0.5.6, source-map@~0.5.3: +source-map@^0.5.0, 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= @@ -6552,6 +6447,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sourcemap-codec@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + spawn-wrap@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" @@ -6625,6 +6525,21 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sshpk@^1.7.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de" + integrity sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -6632,7 +6547,7 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -stack-utils@^1.0.2: +stack-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== @@ -6655,6 +6570,11 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -6687,6 +6607,14 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -6744,12 +6672,10 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" -strip-bom-buf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" - integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= - dependencies: - is-utf8 "^0.2.1" +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" @@ -6758,36 +6684,27 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.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-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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - strip-json-comments@^2.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= -supertap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supertap/-/supertap-1.0.0.tgz#bd9751c7fafd68c68cf8222a29892206a119fa9e" - integrity sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA== +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: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: - arrify "^1.0.1" - indent-string "^3.2.0" - js-yaml "^3.10.0" - serialize-error "^2.1.0" - strip-ansi "^4.0.0" + has-flag "^1.0.0" supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" @@ -6796,15 +6713,10 @@ supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-co dependencies: has-flag "^3.0.0" -symbol-observable@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" - integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= - -symbol-observable@^1.0.4, symbol-observable@^1.1.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.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= table@^5.0.2: version "5.1.1" @@ -6834,13 +6746,6 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -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" - terser-webpack-plugin@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" @@ -6856,14 +6761,25 @@ terser-webpack-plugin@^1.1.0: worker-farm "^1.5.2" terser@^3.8.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.13.1.tgz#a02e8827fb9705fe7b609c31093d010b28cea8eb" - integrity sha512-ogyZye4DFqOtMzT92Y3Nxxw8OvXmL39HOALro4fc+EUYFFF9G/kk0znkvwMz6PPYgBtdKAodh3FPR70eugdaQA== + version "3.14.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32" + integrity sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw== dependencies: commander "~2.17.1" source-map "~0.6.1" source-map-support "~0.5.6" +test-exclude@^4.2.1: + 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 "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + test-exclude@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.0.0.tgz#cdce7cece785e0e829cd5c2b27baf18bc583cfb7" @@ -6874,16 +6790,16 @@ test-exclude@^5.0.0: read-pkg-up "^4.0.0" require-main-filename "^1.0.1" -text-encoding@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" - integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= - 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" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -6902,16 +6818,6 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== -time-zone@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" - integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= - -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" @@ -6926,11 +6832,21 @@ tmp@^0.0.33: 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-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -6966,31 +6882,171 @@ toposort@^1.0.0: resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +tough-cookie@>=2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" -trim-off-newlines@^1.0.1: +tr46@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" - integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" 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: +ts-jest@^23.10.4: + 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-loader@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-5.3.3.tgz#8b4af042e773132d86b3c99ef0acf3b4d325f473" + integrity sha512-KwF1SplmOJepnoZ4eRIloH/zXL195F51skt7reEsS6jvDqzgc/YSbz9b8E07GxIUwLXdcD4ssrJu6v8CwaTafA== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + +tslib@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== + +tslib@1.9.3, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, 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== +tslint-config-airbnb@^5.11.0: + version "5.11.1" + resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz#51a27fbb8bf24c144d064a274a71da47e7ece617" + integrity sha512-hkaittm2607vVMe8eotANGN1CimD5tor7uoY3ypg2VTtEcDB/KGWYbJOz58t8LI4cWSyWtgqYQ5F0HwKxxhlkQ== + dependencies: + tslint-consistent-codestyle "^1.14.1" + tslint-eslint-rules "^5.4.0" + tslint-microsoft-contrib "~5.2.1" + +tslint-consistent-codestyle@^1.14.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.0.tgz#a3acf8d0a3ca0dc7d1285705102ba1fe4a17c4cb" + integrity sha512-6BNDBbZh2K0ibRXe70Mkl9gfVttxQ3t3hqV1BRDfpIcjrUoOgD946iH4SrXp+IggDgeMs3dJORjD5tqL5j4jXg== + dependencies: + "@fimbul/bifrost" "^0.17.0" + tslib "^1.7.1" + tsutils "^2.29.0" + +tslint-eslint-rules@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" + integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w== + dependencies: + doctrine "0.7.2" + tslib "1.9.0" + tsutils "^3.0.0" + +tslint-loader@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/tslint-loader/-/tslint-loader-3.5.4.tgz#052af7f0772434451ea1b247bb55407f878a4c40" + integrity sha512-jBHNNppXut6SgZ7CsTBh+6oMwVum9n8azbmcYSeMlsABhWWoHwjq631vIFXef3VSd75cCdX3rc6kstsB7rSVVw== + dependencies: + loader-utils "^1.0.2" + mkdirp "^0.5.1" + object-assign "^4.1.1" + rimraf "^2.4.4" + semver "^5.3.0" + +tslint-microsoft-contrib@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81" + integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA== + dependencies: + tsutils "^2.27.2 <2.29.0" + +tslint@^5.11.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.0.tgz#47f2dba291ed3d580752d109866fb640768fca36" + integrity sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ== + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.27.2" + +tsutils@^2.27.2, tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +"tsutils@^2.27.2 <2.29.0": + version "2.28.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1" + integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA== + dependencies: + tslib "^1.8.1" + +tsutils@^3.0.0, tsutils@^3.5.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.7.0.tgz#f97bdd2f109070bd1865467183e015b25734b477" + integrity sha512-n+e+3q7Jx2kfZw7tjfI9axEIWBY0sFMOlC+1K70X0SeXpO/UYSB+PN+E9tIJNqViB7oiXQdqD7dNchnvoneZew== + dependencies: + tslib "^1.8.1" + 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" @@ -6998,11 +7054,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -7016,7 +7067,12 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -uglify-js@3.4.x, uglify-js@^3.1.4, uglify-js@^3.4.9: +typescript@^3.1.3: + version "3.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5" + integrity sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg== + +uglify-js@3.4.x, 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== @@ -7024,34 +7080,6 @@ uglify-js@3.4.x, uglify-js@^3.1.4, uglify-js@^3.4.9: commander "~2.17.1" source-map "~0.6.1" -uid2@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" - integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I= - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" - integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" - integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== - union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -7076,21 +7104,10 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -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" - -unique-temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" - integrity sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U= - dependencies: - mkdirp "^0.5.1" - os-tmpdir "^1.0.1" - uid2 "0.0.3" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -7105,32 +7122,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.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.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== -update-notifier@^2.5.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" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" @@ -7148,13 +7144,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -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.4.3: version "1.4.4" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" @@ -7236,10 +7225,14 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vlq@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== +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" + extsprintf "^1.2.0" vm-browserify@0.0.4: version "0.0.4" @@ -7248,6 +7241,28 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +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" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -7264,28 +7279,29 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" +webidl-conversions@^4.0.2: + 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-cli@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" - integrity sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ== +webpack-cli@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.0.tgz#9648cb6d65060f916e63c3d3b55387fb94c019fd" + integrity sha512-wxnUqH0P5ErcwGIKMZbUqix2FjuUmhpS2N9ukZAuGmk9+3vOt7VY2ZM/90W9UZetf6lOJuBNcsbeGU7uCTLdSA== dependencies: chalk "^2.4.1" cross-spawn "^6.0.5" enhanced-resolve "^4.1.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" global-modules-path "^2.3.0" import-local "^2.0.0" interpret "^1.1.0" loader-utils "^1.1.0" + opencollective "^1.0.3" supports-color "^5.5.0" v8-compile-cache "^2.0.2" - yargs "^12.0.2" + yargs "^12.0.4" webpack-dev-middleware@3.4.0: version "3.4.0" @@ -7341,14 +7357,6 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-sources@^0.1.2: - version "0.1.5" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750" - integrity sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A= - dependencies: - source-list-map "~0.1.7" - source-map "~0.5.3" - webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" @@ -7358,9 +7366,9 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-map "~0.6.1" webpack@^4.16.5: - version "4.28.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.2.tgz#6b534a8bc91a45787ed631dc2e87aec94e9e4db7" - integrity sha512-PK3uVg3/NuNVOjPfYleFI6JF7khO7c2kIlksH7mivQm+QDcwiqV1x6+q89dDeOioh5FNxJHr3LKbDu3oSAhl9g== + version "4.28.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.3.tgz#8acef6e77fad8a01bfd0c2b25aa3636d46511874" + integrity sha512-vLZN9k5I7Nr/XB1IDG9GbZB4yQd1sPuvufMFgJkx0b31fi2LD97KQIjwjxE7xytdruAYfu5S0FLBLjdxmwGJCg== dependencies: "@webassemblyjs/ast" "1.7.11" "@webassemblyjs/helper-module-context" "1.7.11" @@ -7400,22 +7408,42 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -well-known-symbols@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" - integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + 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.24" -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= +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.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + 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" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: +which@^1.2.12, which@^1.2.14, 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== @@ -7429,18 +7457,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -7471,7 +7487,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.0.0: +write-file-atomic@^2.0.0, write-file-atomic@^2.1.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== @@ -7487,10 +7503,17 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -xdg-basedir@^3.0.0: +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^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= + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xregexp@4.0.0: version "4.0.0" @@ -7522,7 +7545,7 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@^10.0.0, yargs-parser@^10.1.0: +yargs-parser@10.x, yargs-parser@^10.1.0: 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== @@ -7537,14 +7560,6 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -7552,7 +7567,7 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs@11.1.0: +yargs@11.1.0, yargs@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== @@ -7588,7 +7603,7 @@ yargs@12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@^12.0.2: +yargs@^12.0.4: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== @@ -7605,23 +7620,3 @@ yargs@^12.0.2: which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" - -yargs@^4.8.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1"