Further initial dev

This commit is contained in:
Kai Moseley 2016-11-23 16:20:09 +00:00
parent 0f03205a70
commit 59b75a3ea3
6 changed files with 214 additions and 127 deletions

View File

@ -31,6 +31,7 @@
"dependencies": {
"global": "^4.3.1",
"lodash": "^4.17.2",
"ramda": "^0.22.1",
"redux": "^3.6.0",
"webpack": "^1.13.3",
"webpack-dev-server": "^1.16.2"

View File

@ -1,30 +1,34 @@
import { buildReducers, Types } from './redux-arg/generateReducer';
import { buildReducers } from './redux-arg/generateReducer';
import { createStore, compose } from 'redux';
import { Types } from './redux-arg/constants';
const example = {
form2: Types.reducer({
form2: Types.reducer(Types.shape({
lowerLevel: Types.number,
lowerLevel2: Types.string,
}),
})),
form3: Types.reducer({
example2: Types.reducer({
example2: Types.reducer(Types.shape({
lowerLevel3: Types.string,
}),
})),
example3: Types.reducer({
example4: Types.reducer({
example4: Types.reducer(Types.shape({
test: Types.string,
}),
})),
example5: Types.reducer({
test: Types.reducer({
test: Types.reducer(Types.shape({
blarg: Types.number,
})
}))
})
})
})
}),
test1: Types.reducer(Types.string),
test2: Types.reducer(Types.arrayOf({
foo5: Types.number,
})),
};
const test = buildReducers(example);
console.log(333, test);
createStore(
test,

View File

@ -0,0 +1,20 @@
export const PROP_TYPES = {
_string: '_string',
_number: '_number',
_reducer: '_reducer',
_shape: '_shape',
_array: '_array',
};
export const TYPE_DEFAULTS = new Map([
[PROP_TYPES._string, ''],
[PROP_TYPES._number, 0],
]);
export const Types = {
string: () => ({ type: PROP_TYPES._string, structure: PROP_TYPES._string }),
number: () => ({ type: PROP_TYPES._number, structure: PROP_TYPES._number }),
arrayOf: structure => () => ({ type: PROP_TYPES._array, structure }),
reducer: structure => () => ({ type: PROP_TYPES._reducer, structure }),
shape: structure => () => ({ type: PROP_TYPES._shape, structure}),
};

View File

@ -1,58 +1,21 @@
//@flow
import { combineReducers } from 'redux';
import { reduce, find } from 'lodash';
export function generateReducer(reducerMap: Object): (Object) => Object {
return combineReducers(reduce(reducerMap, (memo, propValue, propName) => ({
...memo,
[propName]: objectReducer(propValue),
}), reducerMap));
}
function objectReducer(initialState: Object): (Object) => (Object, Object) => Object {
return (state = initialState, { type } = {} ) => {
switch(type) {
case 'BLARG!':
return state;
default:
return state;
}
}
}
const PROP_TYPES = new Map([
['_string', Symbol()],
['_number', Symbol()],
['_reducer', Symbol()],
['_shape', Symbol()],
['_array', Symbol()],
]);
const TYPE_DEFAULTS = new Map([
[PROP_TYPES._string, ''],
[PROP_TYPES._number, 0],
]);
export const Types = {
string: () => ({ type: PROP_TYPES.get('_string') }),
number: () => ({ type: PROP_TYPES.get('_number') }),
reducer: structure => () => ({ type: PROP_TYPES.get('_reducer'), structure }),
};
import { createReducer } from './reducers';
import { PROP_TYPES } from './constants';
export function buildReducers(structure) {
//TODO - allow for building single primitive reducers
const tmp = combineReducers(reduce(structure, (memo, propValue, propName) => {
const { structure } = propValue();
const containsReducers = !!find(structure, v => v().type === PROP_TYPES.get('_reducer'));
console.log(111, propValue(), propName, containsReducers, structure);
const containsReducers = !!find(structure, v => v().type === PROP_TYPES._reducer);
const partial = {
...memo,
[propName]: containsReducers ? buildReducers(structure) : objectReducer(assignDefaults(structure)),
[propName]: containsReducers ? buildReducers(structure) : createReducer(propValue),
};
return partial;
@ -61,21 +24,6 @@ export function buildReducers(structure) {
return tmp;
}
function assignDefaults(structure) {
console.log(222, structure);
const tmp2 = reduce(structure, (memo, propValue, propName) => ({
...memo,
[propName]: TYPE_DEFAULTS.get(propValue().type)
}), {});
console.log(333, tmp2);
return tmp2;
}

113
src/redux-arg/reducers.js Normal file
View File

@ -0,0 +1,113 @@
//@flow
import {
PROP_TYPES,
TYPE_DEFAULTS,
} from './constants';
import {
reduce
} from 'lodash';
import {
compose
} from 'ramda';
type ObjectReducerAction = {
type: string,
payload?: Object,
};
type ObjectReducer = (Object) => (Object, ObjectReducerAction) => Object;
type Primitive = string | number;
type PrimitiveReducerAction = {
type: string,
payload?: string | number,
};
type PrimitiveReducer = (Primitive) => (Primitive, PrimitiveReducerAction) => Primitive;
type ArrayReducerAction = {
type: string,
payload?: Array,
index?: number,
};
type ArrayReducer = (Array) => (Array, ArrayReducerAction) => Array;
const REDUCER_FUNCTIONS = {
objectReducer(reducerStructureDescriptor): ObjectReducer {
const { structure } = reducerStructureDescriptor();
return (state = determineDefaults(reducerStructureDescriptor)(structure), { type, payload } = {}) => {
switch (type) {
case 'BLARG!':
return { state, ...reducerStructureDescriptor, ...payload };
default:
return state;
}
}
},
primitiveReducer(reducerStructureDescriptor): PrimitiveReducer {
const { structure } = reducerStructureDescriptor();
return (state = determineDefaults(reducerStructureDescriptor)(structure), { type, payload } = {}) => {
switch(type) {
case 'BLARG2':
return { state, ...structure, ...payload };
default:
return state;
}
}
},
arrayReducer(reducerStructureDescriptor): ArrayReducer {
return (state = [], { type, payload } = {}) => {
switch(type) {
case 'BLARG3':
return { state, ...reducerStructureDescriptor, ...payload };
default:
return state;
}
}
}
};
const DEFAULTS_FUNCTIONS = new Map([
[PROP_TYPES._shape, objectDefaults],
[PROP_TYPES._array, arrayDefaults],
[PROP_TYPES._string, primitiveDefaults],
[PROP_TYPES._number, primitiveDefaults],
]);
function objectDefaults(structure) {
return reduce(structure, (memo, propValue, propName) => console.log(333, { propName, propValue: propValue() }) || ({
...memo,
[propName]: TYPE_DEFAULTS.get(propValue().type)
}), {});
}
function arrayDefaults() {
return [];
}
function primitiveDefaults(structure) {
return TYPE_DEFAULTS.get(structure);
}
function determineReducerType(reducerDescriptor) {
const { structure } = reducerDescriptor();
const { type } = structure();
let reducerFn = REDUCER_FUNCTIONS.primitiveReducer;
if (type === PROP_TYPES._shape) reducerFn = REDUCER_FUNCTIONS.objectReducer;
if (type === PROP_TYPES._array) reducerFn = REDUCER_FUNCTIONS.arrayReducer;
return {
reducerFn,
reducerStructureDescriptor: structure,
};
}
function callReducer({ reducerFn, reducerStructureDescriptor } = {}) {
return reducerFn(reducerStructureDescriptor);
}
function determineDefaults(reducerStructureDescriptor) {
const { type } = reducerStructureDescriptor();
console.log(111, { type, fn: DEFAULTS_FUNCTIONS.get(type), DEFAULTS_FUNCTIONS });
return DEFAULTS_FUNCTIONS.get(type);
}
export const createReducer = compose(callReducer, determineReducerType);

117
yarn.lock
View File

@ -1,5 +1,11 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
Base64@~0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz#ba3a4230708e186705065e66babdd4c35cf60028"
abbrev@1:
version "1.0.9"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
@ -427,10 +433,6 @@ base64-js@^1.0.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
Base64@~0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz#ba3a4230708e186705065e66babdd4c35cf60028"
batch@0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464"
@ -1029,7 +1031,7 @@ es6-set@~0.1.3:
es6-symbol "3"
event-emitter "~0.3.4"
es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3:
es6-symbol@3, es6-symbol@^3.0.2, es6-symbol@~3.1, es6-symbol@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa"
dependencies:
@ -1642,7 +1644,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2:
inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
@ -1835,14 +1837,14 @@ is-utf8@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
isexe@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0"
@ -2149,7 +2151,7 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.7:
dependencies:
mime-db "~1.24.0"
mime@^1.3.4, mime@1.3.4:
mime@1.3.4, mime@^1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
@ -2165,19 +2167,15 @@ minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.2:
dependencies:
brace-expansion "^1.0.0"
minimist@0.0.8, minimist@~0.0.1:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
minimist@^1.1.3, minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
minimist@~0.0.1:
version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@~0.5.1:
"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies:
@ -2293,7 +2291,7 @@ node-uuid@~1.4.7:
version "1.4.7"
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f"
nopt@~3.0.6, "nopt@2 || 3":
"nopt@2 || 3", nopt@~3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
dependencies:
@ -2325,18 +2323,18 @@ normalize-url@^1.4.0:
query-string "^4.1.0"
sort-keys "^1.0.0"
npmlog@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f"
"npmlog@0 || 1 || 2 || 3":
version "3.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873"
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.6.0"
set-blocking "~2.0.0"
"npmlog@0 || 1 || 2 || 3":
version "3.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873"
npmlog@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f"
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
@ -2817,26 +2815,26 @@ pseudomap@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
punycode@^1.2.4, punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
punycode@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
punycode@^1.2.4, punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
q@^1.1.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
qs@~6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442"
qs@6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b"
qs@~6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442"
query-string@^4.1.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.2.3.tgz#9f27273d207a25a8ee4c7b8c74dcd45d556db822"
@ -2856,6 +2854,10 @@ querystringify@0.0.x:
version "0.0.4"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
ramda@^0.22.1:
version "0.22.1"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.22.1.tgz#031da0c3df417c5b33c96234757eb37033f36a0e"
randomatic@^1.1.3:
version "1.1.5"
resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b"
@ -3035,7 +3037,7 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
request@^2.61.0, request@^2.75.0, request@2:
request@2, request@^2.61.0, request@^2.75.0:
version "2.78.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc"
dependencies:
@ -3100,7 +3102,7 @@ right-align@^0.1.1:
dependencies:
align-text "^0.1.1"
rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2:
rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4:
version "2.5.4"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
dependencies:
@ -3132,7 +3134,7 @@ sax@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
semver@~5.3.0, "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5":
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@ -3313,10 +3315,6 @@ strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
string_decoder@~0.10.25, string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@ -3332,6 +3330,10 @@ string-width@^2.0.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^3.0.0"
string_decoder@~0.10.25, string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
stringstream@~0.0.4:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@ -3520,16 +3522,16 @@ unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
url-parse@^1.1.1:
version "1.1.7"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a"
url-parse@1.0.x:
version "1.0.5"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
dependencies:
querystringify "0.0.x"
requires-port "1.0.x"
url-parse@1.0.x:
version "1.0.5"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
url-parse@^1.1.1:
version "1.1.7"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a"
dependencies:
querystringify "0.0.x"
requires-port "1.0.x"
@ -3551,7 +3553,7 @@ util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
util@~0.10.3, util@0.10.3:
util@0.10.3, util@~0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
dependencies:
@ -3672,7 +3674,7 @@ which-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
which@^1.2.9, which@1:
which@1, which@^1.2.9:
version "1.2.12"
resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192"
dependencies:
@ -3684,13 +3686,17 @@ wide-align@^1.1.0:
dependencies:
string-width "^1.0.1"
window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
window-size@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
wordwrap@~0.0.2:
version "0.0.3"
@ -3700,10 +3706,6 @@ wordwrap@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
wrap-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f"
@ -3766,4 +3768,3 @@ yargs@~3.10.0:
cliui "^2.1.0"
decamelize "^1.0.0"
window-size "0.1.0"