From 8b90871fafbca2198738cfab2b0c46a02686c1ec Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Sat, 4 Nov 2017 22:54:27 +1300 Subject: [PATCH 01/13] refactor(query): re-write the query engine WORK IN PROGRESS --- README.md | 39 ++++-- index.js | 309 +++++++++++++++++++++++++++++++--------------- package-lock.json | 26 ++-- package.json | 4 +- 4 files changed, 264 insertions(+), 114 deletions(-) diff --git a/README.md b/README.md index e8c0257..345ae4d 100644 --- a/README.md +++ b/README.md @@ -17,15 +17,40 @@ import Dogs from '../components/dogs' import { actions as dogActions } from '../' -import { getIndexProps } from '../getters' +import { getDogs, getCollars } from '../getters' export default connect({ - selector: getIndexProps, - actions: { dogs: dogActions }, - query: { - service: 'dogs', - params: {} - } + selector: createStructuredSelector({ + dogs: getDogs, + collars: getCollars + }), + actions: { + dogs: dogActions + }, + query: [ + { + name: 'findAllDogs', + service: 'dogs', + params: {} + }, + { + name: 'findCollarsForEachDog', + service: 'collars', + dependencies: [ + 'findAllDogs' + ], + params: (state, props) => { + const dogs = getDogs(state, props) + return { + params: { + dogId: { + $in: dogs.map(dog => dog.id) + } + } + } + } + } + ] })(Dogs) ``` diff --git a/index.js b/index.js index fa4133a..f8e83fb 100644 --- a/index.js +++ b/index.js @@ -1,69 +1,113 @@ const { createElement } = require('react') const compose = require('recompose/compose').default -const withState = require('recompose/withState').default +const withStateHandlers = require('recompose/withStateHandlers').default const lifecycle = require('recompose/lifecycle').default const { connect: connectRedux } = require('react-redux') const { bindActionCreators: bindDispatchActionCreators } = require('redux') const createCid = require('incremental-id') const assert = require('assert') const is = require('ramda/src/is') +const isNil = require('ramda/src/isNil') +const isEmpty = require('ramda/src/isEmpty') const pipe = require('ramda/src/pipe') const mergeAll = require('ramda/src/mergeAll') const map = require('ramda/src/map') const mapObjIndexed = require('ramda/src/mapObjIndexed') const partialRight = require('ramda/src/partialRight') -const filter = require('ramda/src/filter') const either = require('ramda/src/either') -const has = require('ramda/src/has') -const length = require('ramda/src/length') -const equals = require('ramda/src/equals') const not = require('ramda/src/not') -const keys = require('ramda/src/keys') const prop = require('ramda/src/prop') -const pick = require('ramda/src/pick') -const complement = require('ramda/src/complement') +const path = require('ramda/src/path') +const forEach = require('ramda/src/forEach') +const values = require('ramda/src/values') +const indexBy = require('ramda/src/indexBy') +const nthArg = require('ramda/src/nthArg') +const assoc = require('ramda/src/assoc') +const omit = require('ramda/src/omit') +const all = require('ramda/src/all') +const __ = require('ramda/src/__') +const merge = require('ramda/src/merge') +const ifElse = require('ramda/src/ifElse') +const { createSelector, createStructuredSelector } = require('reselect') +const deepEqual = require('fast-deep-equal') module.exports = { connect } +const indexByName = indexBy(prop('name')) + const isFunction = is(Function) const isArray = is(Array) const isObject = is(Object) -const isReady = prop('isReady') -const isPending = complement(isReady) -const pickPending = filter(isPending) -const hasKeys = pipe(keys, length, equals(0), not) +//const shouldBindCid = prop('shouldBindCid') +const shouldBindCid = () => true const isSelector = isFunction const isActions = isObject -const isQuery = either(either(isFunction, isArray), isObject) -const isShouldQueryAgain = isFunction +const isQuery = either(isArray, isObject) + +const getFeathersRequests = prop('feathers') +const getStateAndProps = (state, props) => [state, props] // feathers-action-react function connect (options) { const { - selector = (state) => state, + selector = (state, props) => {}, actions = {}, - query = [], - shouldQueryAgain = alwaysFalse + query: ogQuery = [] } = options assert(isSelector(selector), 'options.selector is not a selector, expected function') assert(isActions(actions), 'options.actions is not actions, expected object') - assert(isQuery(query), 'options.query is not a query, expected function, array or object') - assert(isShouldQueryAgain(shouldQueryAgain), 'options.shouldQueryAgain is not shouldQueryAgain, expected function') + assert(isQuery(ogQuery), 'options.query is not a query, expected array or object') + + // TODO assert(hasAllActions) + // if (!props.actions[service]) { + // throw new Error(`feathers-action-react/index: Expected to be provided respective actions for service ${service} in the actions object`) + // } + // TODO assert(allQuerysHaveNames) + const query = nameQuery(ogQuery) + + const stateConnector = withStateHandlers( + { + query, + cidByQuery: {}, + ownProps: (props) => props + }, + { + setCidByQuery: ({ cidByQuery }) => (queryName, cid) => ({ + cidByQuery: merge({ + [queryName]: cid + }, cidByQuery) + }) + } + ) const reduxConnector = createReduxConnector({ selector, actions }) - const feathersConnector = createFeathersConnector({ query, shouldQueryAgain }) + const feathersConnector = createFeathersConnector({ query }) + + return compose( + stateConnector, + reduxConnector, + feathersConnector + ) +} - return compose(reduxConnector, feathersConnector) +function nameQuery (query) { + if (isArray(query)) { + return query.map(nameQuery) + } + return merge(query, { + name: createCid() + }) } const bindCidToActionCreators = mapObjIndexed((action, name) => { // don't bind cid to complete action if (name === 'complete') return action + if (not(shouldBindCid(action))) return action return (...args) => { const cid = createCid() @@ -72,16 +116,110 @@ const bindCidToActionCreators = mapObjIndexed((action, name) => { } }) +const resolveQueryArg = (argName) => (query) => (state, props) => { + const arg = query[argName] + return ( + isNil(arg) + ? null + : isFunction(arg) + ? arg(state, props) + : arg + ) +} + +const getRawQuerys = (state, props) => { + const { query } = props + return isArray(query) ? query : [query] +} +const getCidByQuery = (state, props) => { + return props.cidByQuery +} +const getQueryByName = createSelector( + getRawQuerys, + indexByName +) +const isReady = path(['request', 'isReady']) +const getHasReadyDependenciesByQuery = createSelector( + getQueryByName, + (queryByName) => map(pipe( + prop('dependencies'), + ifElse( + either(isNil, isEmpty), + () => true, + all(pipe( + prop(__, queryByName), + isReady + )) + ) + ))(queryByName) +) +const getQuerys = createSelector( + getQueryByName, + getCidByQuery, + getHasReadyDependenciesByQuery, + getFeathersRequests, + getStateAndProps, + (queryByName, cidByQuery, hasReadyDependenciesByQuery, requests, stateAndProps) => { + const enhanceQuerys = map(query => { + const cid = cidByQuery[query.name] + const isStarted = not(isNil(cid)) + const hasReadyDependencies = hasReadyDependenciesByQuery[query.name] + // TODO clean up + const id = resolveQueryArg('id')(query)(...stateAndProps) + const params = resolveQueryArg('params')(query)(...stateAndProps) + var request, isReady, prevArgs + if (isStarted) { + request = requests[cid] + isReady = request.isReady + prevArgs = { + // TODO clean up + id: isNil(request.args.id) ? null: request.args.id, + params: isNil(request.args.params) ? null: request.args.params + } + } else { + isReady = false + prevArgs = null + } + const nextArgs = { id, params } + /* + const shouldRequest = hasReadyDependencies && ( + not(isStarted) || not(deepEqual(prevArgs, nextArgs)) + ) + */ + const shouldRequest = isNil(request) + const isSameArgs = deepEqual(prevArgs, nextArgs) + debugger + return merge(query, { + cid, + request, + id, + params, + isStarted, + hasReadyDependencies, + shouldRequest + }) + }) + return enhanceQuerys(queryByName) + } +) + +/* +const getOwnProps = pipe( + nthArg(1), + omit(['query', 'cidByQuery', 'setCidByQuery']) +) +*/ + function createReduxConnector (options) { - const { selector, actions } = options + const { selector, actions, query } = options const reduxConnector = connectRedux( - function mapStateToProps (state, ownProps) { - return { - ownProps, - requests: state.feathers, - selected: selector(state, ownProps) - } + function mapStateToProps (state, props) { + // use the original props passed into the top-level + const selected = selector(state, props.ownProps) + // use react state handlers + const querys = getQuerys(state, props) + return { selected, querys } }, function mapDispatchToProps (dispatch) { const bindActionCreators = map(pipe( @@ -97,41 +235,23 @@ function createReduxConnector (options) { return reduxConnector } -function createFeathersConnector (options) { - const { query, shouldQueryAgain } = options + +function createFeathersConnector (options) { const feathersConnector = (component) => { - return compose( - withState('cids', 'setCids', []), - withState('cancels', 'setCancels', []), - lifecycle({ - componentDidMount () { - fetch(this.props) - }, - - componentWillReceiveProps (nextProps) { - // reset state if component should re-fetch - const { cids, requests: allRequests } = nextProps - const pickCids = pick(cids) - const requests = pickCids(allRequests) - const pending = pickPending(requests) - const isPending = hasKeys(pending) - const status = { - cids, - requests, - pending, - isPending - } - const queryAgain = shouldQueryAgain(nextProps, status) - // perform re-fetch - if (queryAgain) fetch(nextProps) - }, + return lifecycle({ + componentDidMount () { + handleQuerys(this.props) + }, - componentWillUnmount () { - cancel(this.props) - } - }) - )(props => { + componentWillReceiveProps (nextProps) { + handleQuerys(nextProps) + }, + + componentWillUnmount () { + cancelQuerys(this.props) + } + })(function ConnectedFeathers (props) { const { selected, ownProps, actions } = props const componentProps = mergeAll([ selected, @@ -141,51 +261,44 @@ function createFeathersConnector (options) { return createElement(component, componentProps) }) - function fetch (props) { - cancel(props) - - var queryDescriptors = query - if (isFunction(queryDescriptors)) { - queryDescriptors = query(props) - } - if (!isArray(queryDescriptors)) { - queryDescriptors = [queryDescriptors] - } - - var cancels = [] - var cids = [] + function handleQuerys (props) { + const handleEachQuery = pipe( + values, + forEach(query => { + if (query.shouldRequest) { + if (query.cid) { + cancelQuery(query, props) + } + requestQuery(query, props) + } + }) + ) + handleEachQuery(props.querys) + } - queryDescriptors.forEach(descriptor => { - const { service, id, params } = descriptor + function requestQuery (query, { actions, setCidByQuery } ) { + const { name, service, id, params } = query + const method = id ? 'get' : 'find' + const action = actions[service][method] + const cid = id ? action(id, params) : action(params) + setCidByQuery(name, cid) + } - if (!props.actions[service]) { - throw new Error(`feathers-action-react/index: Expected to be provided respective actions for service ${service} in the actions object`) - } - - const method = id ? 'get' : 'find' - const action = props.actions[service][method] - const cid = id ? action(id, params) : action(params) - cids.push(cid) - const cancelAction = props.actions[service].complete - const cancel = () => cancelAction(cid) - cancels.push(cancel) + function cancelQuerys (props) { + const cancelEachQuery = forEach(query => { + cancelQuery(query, props) }) - - const { setCancels, setCids } = props - - setCancels(cancels) - setCids(cids) + return cancelEachQuery(props.querys) } - function cancel (props) { - const { cancels, setCancels, setCids } = props - setCancels([]) - setCids([]) - cancels.forEach(cancel => cancel()) + function cancelQuery (query, { actions, setCidByQuery }) { + const { name, service, cid } = query + const serviceActions = actions[service] + const cancelAction = serviceActions.complete + cancelAction(cid) + setCidByQuery(name, null) } } return feathersConnector } - -function alwaysFalse () { return false } diff --git a/package-lock.json b/package-lock.json index 7461846..a9d0b8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1956,6 +1956,11 @@ "is-extglob": "1.0.0" } }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -5798,6 +5803,11 @@ } } }, + "reselect": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", + "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=" + }, "resolve": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", @@ -6087,14 +6097,6 @@ "duplexer": "0.1.1" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -6133,6 +6135,14 @@ "function-bind": "1.1.0" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", diff --git a/package.json b/package.json index df0aa8f..ebd3c32 100644 --- a/package.json +++ b/package.json @@ -39,11 +39,13 @@ }, "dependencies": { "es2040": "^1.2.6", + "fast-deep-equal": "^1.0.0", "incremental-id": "^1.0.0", "ramda": "^0.23.0", "react": "^15.5.4", "react-redux": "^5.0.4", "recompose": "^0.24.0", - "redux": "^3.6.0" + "redux": "^3.6.0", + "reselect": "^3.0.1" } } From d4fea3900d828dee3b8eda104296c78f27123a88 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Tue, 7 Nov 2017 13:19:13 +1300 Subject: [PATCH 02/13] keep trying --- index.js | 115 +++--- package-lock.json | 961 ++++++++++++++++++++++++++-------------------- 2 files changed, 598 insertions(+), 478 deletions(-) diff --git a/index.js b/index.js index f8e83fb..621be39 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ const { createElement } = require('react') const compose = require('recompose/compose').default const withStateHandlers = require('recompose/withStateHandlers').default +const withProps = require('recompose/withProps').default const lifecycle = require('recompose/lifecycle').default const { connect: connectRedux } = require('react-redux') const { bindActionCreators: bindDispatchActionCreators } = require('redux') @@ -49,7 +50,7 @@ const isActions = isObject const isQuery = either(isArray, isObject) const getFeathersRequests = prop('feathers') -const getStateAndProps = (state, props) => [state, props] +const getStateAndOwnProps = (state, props) => [state, props.ownProps] // feathers-action-react function connect (options) { @@ -71,24 +72,25 @@ function connect (options) { // TODO assert(allQuerysHaveNames) const query = nameQuery(ogQuery) + const propsConnector = withProps( + (ownProps) => ({ ownProps }) + ) const stateConnector = withStateHandlers( { query, - cidByQuery: {}, - ownProps: (props) => props + cidByQuery: {} }, { setCidByQuery: ({ cidByQuery }) => (queryName, cid) => ({ - cidByQuery: merge({ - [queryName]: cid - }, cidByQuery) + cidByQuery: assoc(queryName, cid, cidByQuery) }) } ) const reduxConnector = createReduxConnector({ selector, actions }) - const feathersConnector = createFeathersConnector({ query }) + const feathersConnector = createFeathersConnector() return compose( + propsConnector, stateConnector, reduxConnector, feathersConnector @@ -158,15 +160,15 @@ const getQuerys = createSelector( getCidByQuery, getHasReadyDependenciesByQuery, getFeathersRequests, - getStateAndProps, - (queryByName, cidByQuery, hasReadyDependenciesByQuery, requests, stateAndProps) => { + getStateAndOwnProps, + (queryByName, cidByQuery, hasReadyDependenciesByQuery, requests, [state, ownProps]) => { const enhanceQuerys = map(query => { const cid = cidByQuery[query.name] const isStarted = not(isNil(cid)) const hasReadyDependencies = hasReadyDependenciesByQuery[query.name] // TODO clean up - const id = resolveQueryArg('id')(query)(...stateAndProps) - const params = resolveQueryArg('params')(query)(...stateAndProps) + const id = resolveQueryArg('id')(query)(state, ownProps) + const params = resolveQueryArg('params')(query)(state, ownProps) var request, isReady, prevArgs if (isStarted) { request = requests[cid] @@ -181,14 +183,10 @@ const getQuerys = createSelector( prevArgs = null } const nextArgs = { id, params } - /* + const isSameArgs = deepEqual(prevArgs, nextArgs) const shouldRequest = hasReadyDependencies && ( - not(isStarted) || not(deepEqual(prevArgs, nextArgs)) + not(isStarted) || not(isSameArgs) ) - */ - const shouldRequest = isNil(request) - const isSameArgs = deepEqual(prevArgs, nextArgs) - debugger return merge(query, { cid, request, @@ -203,15 +201,8 @@ const getQuerys = createSelector( } ) -/* -const getOwnProps = pipe( - nthArg(1), - omit(['query', 'cidByQuery', 'setCidByQuery']) -) -*/ - function createReduxConnector (options) { - const { selector, actions, query } = options + const { selector, actions } = options const reduxConnector = connectRedux( function mapStateToProps (state, props) { @@ -219,6 +210,7 @@ function createReduxConnector (options) { const selected = selector(state, props.ownProps) // use react state handlers const querys = getQuerys(state, props) + console.log('mapStateToProps', selected, querys) return { selected, querys } }, function mapDispatchToProps (dispatch) { @@ -241,14 +233,17 @@ function createFeathersConnector (options) { const feathersConnector = (component) => { return lifecycle({ componentDidMount () { + console.log('mountProps', this.props) handleQuerys(this.props) }, - componentWillReceiveProps (nextProps) { + componentDidUpdate (nextProps) { + console.log('componentDidUpdate', nextProps) handleQuerys(nextProps) }, componentWillUnmount () { + console.log('unmountProps', this.props) cancelQuerys(this.props) } })(function ConnectedFeathers (props) { @@ -258,46 +253,48 @@ function createFeathersConnector (options) { ownProps, { actions } ]) + console.log('render', componentProps) + return null return createElement(component, componentProps) }) + } - function handleQuerys (props) { - const handleEachQuery = pipe( - values, - forEach(query => { - if (query.shouldRequest) { - if (query.cid) { - cancelQuery(query, props) - } - requestQuery(query, props) + function handleQuerys (props) { + const handleEachQuery = pipe( + values, + forEach(query => { + if (query.shouldRequest) { + if (query.cid) { + cancelQuery(query, props) } - }) - ) - handleEachQuery(props.querys) - } + requestQuery(query, props) + } + }) + ) + handleEachQuery(props.querys) + } - function requestQuery (query, { actions, setCidByQuery } ) { - const { name, service, id, params } = query - const method = id ? 'get' : 'find' - const action = actions[service][method] - const cid = id ? action(id, params) : action(params) - setCidByQuery(name, cid) - } + function requestQuery (query, { actions, setCidByQuery } ) { + const { name, service, id, params } = query + const method = id ? 'get' : 'find' + const action = actions[service][method] + const cid = id ? action(id, params) : action(params) + setCidByQuery(name, cid) + } - function cancelQuerys (props) { - const cancelEachQuery = forEach(query => { - cancelQuery(query, props) - }) - return cancelEachQuery(props.querys) - } + function cancelQuerys (props) { + const cancelEachQuery = forEach(query => { + cancelQuery(query, props) + }) + return cancelEachQuery(props.querys) + } - function cancelQuery (query, { actions, setCidByQuery }) { - const { name, service, cid } = query - const serviceActions = actions[service] - const cancelAction = serviceActions.complete - cancelAction(cid) - setCidByQuery(name, null) - } + function cancelQuery (query, { actions, setCidByQuery }) { + const { name, service, cid } = query + const serviceActions = actions[service] + const cancelAction = serviceActions.complete + cancelAction(cid) + setCidByQuery(name, null) } return feathersConnector diff --git a/package-lock.json b/package-lock.json index a9d0b8b..07731a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "babel-plugin-transform-async-to-generator": "6.24.1", "babel-plugin-transform-es2015-destructuring": "6.23.0", "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", "babel-plugin-transform-es2015-parameters": "6.24.1", "babel-plugin-transform-es2015-spread": "6.22.0", "babel-plugin-transform-es2015-sticky-regex": "6.24.1", @@ -141,13 +141,13 @@ "dev": true }, "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" } }, "argparse": { @@ -278,16 +278,16 @@ "arrify": "1.0.1", "auto-bind": "1.1.0", "ava-init": "0.2.1", - "babel-code-frame": "6.22.0", - "babel-core": "6.25.0", - "bluebird": "3.5.0", + "babel-code-frame": "6.26.0", + "babel-core": "6.26.0", + "bluebird": "3.5.1", "caching-transform": "1.0.1", "chalk": "1.1.3", "chokidar": "1.7.0", "clean-stack": "1.3.0", "clean-yaml-object": "0.1.0", "cli-cursor": "2.1.0", - "cli-spinners": "1.0.0", + "cli-spinners": "1.1.0", "cli-truncate": "1.1.0", "co-with-promise": "4.6.0", "code-excerpt": "2.1.0", @@ -295,8 +295,8 @@ "convert-source-map": "1.5.0", "core-assert": "0.2.1", "currently-unhandled": "0.4.1", - "debug": "2.6.8", - "diff": "3.3.0", + "debug": "2.6.9", + "diff": "3.4.0", "diff-match-patch": "1.0.0", "dot-prop": "4.2.0", "empower-core": "0.6.2", @@ -304,7 +304,7 @@ "figures": "2.0.0", "find-cache-dir": "0.1.1", "fn-name": "2.0.1", - "get-port": "3.1.0", + "get-port": "3.2.0", "globby": "6.1.0", "has-flag": "2.0.0", "hullabaloo-config-manager": "1.1.1", @@ -317,7 +317,7 @@ "is-promise": "2.1.0", "jest-diff": "19.0.0", "jest-snapshot": "19.0.2", - "js-yaml": "3.9.0", + "js-yaml": "3.10.0", "last-line-stream": "1.0.0", "lodash.debounce": "4.0.8", "lodash.difference": "4.5.0", @@ -339,14 +339,14 @@ "require-precompiled": "0.1.0", "resolve-cwd": "1.0.0", "slash": "1.0.0", - "source-map-support": "0.4.15", + "source-map-support": "0.4.18", "stack-utils": "1.0.1", "strip-ansi": "3.0.1", "strip-bom-buf": "1.0.0", "supports-color": "3.2.3", "time-require": "0.1.2", "unique-temp-dir": "1.0.0", - "update-notifier": "2.2.0" + "update-notifier": "2.3.0" }, "dependencies": { "ms": { @@ -388,9 +388,9 @@ } }, "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { "chalk": "1.1.3", "esutils": "2.0.2", @@ -398,43 +398,43 @@ } }, "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", + "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.0", - "debug": "2.6.8", + "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.7", + "private": "0.1.8", "slash": "1.0.0", - "source-map": "0.5.6" + "source-map": "0.5.7" } }, "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "requires": { "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.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.6", + "source-map": "0.5.7", "trim-right": "1.0.1" } }, @@ -445,8 +445,8 @@ "dev": true, "requires": { "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-call-delegate": { @@ -455,9 +455,9 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-explode-assignable-expression": { @@ -466,9 +466,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -478,10 +478,10 @@ "dev": true, "requires": { "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -489,8 +489,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -498,18 +498,18 @@ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.4" } }, @@ -520,10 +520,10 @@ "dev": true, "requires": { "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -531,8 +531,8 @@ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-messages": { @@ -540,7 +540,7 @@ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-check-es2015-constants": { @@ -548,7 +548,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-espower": { @@ -557,10 +557,10 @@ "integrity": "sha1-VRa4/NsmyfDh2BYHSfbkxl5xJx4=", "dev": true, "requires": { - "babel-generator": "6.25.0", - "babylon": "6.17.4", + "babel-generator": "6.26.0", + "babylon": "6.18.0", "call-matcher": "1.0.1", - "core-js": "2.4.1", + "core-js": "2.5.1", "espower-location-detector": "1.0.0", "espurify": "1.7.0", "estraverse": "4.2.0" @@ -592,7 +592,7 @@ "requires": { "babel-helper-remap-async-to-generator": "6.24.1", "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -600,18 +600,18 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", "lodash": "4.17.4" } }, @@ -620,8 +620,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -629,7 +629,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -639,20 +639,20 @@ "dev": true, "requires": { "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -662,10 +662,10 @@ "requires": { "babel-helper-call-delegate": "6.24.1", "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -673,8 +673,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -682,7 +682,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -691,9 +691,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -701,7 +701,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -710,8 +710,8 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", "regexpu-core": "2.0.0" } }, @@ -723,7 +723,7 @@ "requires": { "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.25.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-strict-mode": { @@ -732,8 +732,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-preset-es2040": { @@ -743,7 +743,7 @@ "requires": { "babel-plugin-check-es2015-constants": "6.22.0", "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", "babel-plugin-transform-es2015-computed-properties": "6.24.1", "babel-plugin-transform-es2015-destructuring": "6.23.0", "babel-plugin-transform-es2015-parameters": "6.24.1", @@ -753,71 +753,71 @@ } }, "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.25.0", - "core-js": "2.4.1", + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", "home-or-tmp": "2.0.0", "lodash": "4.17.4", "mkdirp": "0.5.1", - "source-map-support": "0.4.15" + "source-map-support": "0.4.18" } }, "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" } }, "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "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": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "6.22.0", + "babel-code-frame": "6.26.0", "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.2", "lodash": "4.17.4" } }, "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "6.25.0", + "babel-runtime": "6.26.0", "esutils": "2.0.2", "lodash": "4.17.4", "to-fast-properties": "1.0.3" } }, "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==" + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "balanced-match": { "version": "1.0.0", @@ -825,26 +825,26 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "binary-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz", - "integrity": "sha1-ZlBsFs5vTWkopbPNajPKQelB43s=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", "dev": true }, "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", "dev": true }, "boxen": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.1.tgz", - "integrity": "sha1-DxHn/jRO25OXl3/BPt5/ZNlWSB0=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", + "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", "dev": true, "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", - "chalk": "2.0.1", + "chalk": "2.3.0", "cli-boxes": "1.0.0", "string-width": "2.1.1", "term-size": "1.2.0", @@ -867,20 +867,20 @@ "dev": true }, "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.2.1" + "supports-color": "4.5.0" } }, "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -965,7 +965,7 @@ "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", "dev": true, "requires": { - "core-js": "2.4.1", + "core-js": "2.5.1", "deep-equal": "1.0.1", "espurify": "1.7.0", "estraverse": "4.2.0" @@ -1047,7 +1047,7 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.0", + "anymatch": "1.3.2", "async-each": "1.0.1", "glob-parent": "2.0.0", "inherits": "2.0.3", @@ -1058,9 +1058,9 @@ } }, "ci-info": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", - "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.1.tgz", + "integrity": "sha512-vHDDF/bP9RYpTWtUhpJRhCFdvvp3iDWvEbuDbWgvjUrNGV1MXJrE0MPcwGtEled04m61iwdBLUIHZtDgzWS4ZQ==", "dev": true }, "circular-json": { @@ -1097,9 +1097,9 @@ } }, "cli-spinners": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", - "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", + "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=", "dev": true }, "cli-table": { @@ -1132,9 +1132,9 @@ } }, "cli-width": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "co": { @@ -1224,9 +1224,9 @@ "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", - "make-dir": "1.0.0", + "make-dir": "1.1.0", "unique-string": "1.0.0", - "write-file-atomic": "2.1.0", + "write-file-atomic": "2.3.0", "xdg-basedir": "3.0.0" } }, @@ -1252,9 +1252,9 @@ } }, "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" }, "core-util-is": { "version": "1.0.2", @@ -1271,11 +1271,11 @@ } }, "create-react-class": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", - "integrity": "sha1-q0SEl8JlZuHilBPogyB9V8/nvtQ=", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", + "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", "requires": { - "fbjs": "0.8.14", + "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1" } @@ -1288,7 +1288,7 @@ "requires": { "lru-cache": "4.1.1", "shebang-command": "1.2.0", - "which": "1.2.14" + "which": "1.3.0" } }, "crypto-random-string": { @@ -1312,7 +1312,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.24" + "es5-ext": "0.10.35" } }, "date-time": { @@ -1332,15 +1332,15 @@ } }, "debounce": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.0.2.tgz", - "integrity": "sha1-UDzGdNjX9zcJlmT7dd29NrlibcY=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.1.0.tgz", + "integrity": "sha512-ZQVKfRVlwRfD150ndzEK8M90ABT+Y/JQKs4Y7U4MXdpuoUkkrr4DwKbVux3YjylA5bUMUj0Nc3pMxPJX6N2QQQ==", "dev": true }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -1407,7 +1407,7 @@ "requires": { "find-root": "1.1.0", "glob": "7.1.2", - "ignore": "3.3.3", + "ignore": "3.3.7", "pkg-config": "1.1.1", "run-parallel": "1.1.6", "uniq": "1.0.1" @@ -1425,7 +1425,7 @@ "object-assign": "4.1.1", "pify": "2.3.0", "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" + "rimraf": "2.6.2" }, "dependencies": { "globby": { @@ -1467,12 +1467,12 @@ "requires": { "async": "2.5.0", "builtins": "1.0.3", - "debug": "2.6.8", + "debug": "2.6.9", "detective": "4.5.0", "is-relative": "0.2.1", "minimist": "1.2.0", - "read-package-json": "2.0.10", - "resolve": "1.4.0" + "read-package-json": "2.0.12", + "resolve": "1.5.0" }, "dependencies": { "minimist": { @@ -1502,18 +1502,18 @@ } }, "detective-es6": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-1.1.6.tgz", - "integrity": "sha1-XZFAVm7v8SxU/mqzk2ZQ1DvOsKY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-1.2.0.tgz", + "integrity": "sha1-a5s71Uf9jyH4lQL2JuRe0qMnb9w=", "dev": true, "requires": { - "node-source-walk": "3.2.1" + "node-source-walk": "3.3.0" } }, "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", "dev": true }, "diff-match-patch": { @@ -1581,7 +1581,7 @@ "dev": true, "requires": { "call-signature": "0.0.2", - "core-js": "2.4.1" + "core-js": "2.5.1" } }, "encoding": { @@ -1589,7 +1589,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.18" + "iconv-lite": "0.4.19" } }, "equal-length": { @@ -1608,13 +1608,14 @@ } }, "es-abstract": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", - "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, "requires": { "es-to-primitive": "1.1.1", - "function-bind": "1.1.0", + "function-bind": "1.1.1", + "has": "1.0.1", "is-callable": "1.1.3", "is-regex": "1.0.4" } @@ -1635,18 +1636,18 @@ "resolved": "https://registry.npmjs.org/es2040/-/es2040-1.2.6.tgz", "integrity": "sha512-+sAm7CSGH2+0NMZqm63huevZVoyk8OwF8lVIdwPcNtvZxX3YIITGiui8bfLYS8oNcgCgHNYO+QsgMafwo1OWwg==", "requires": { - "babel-core": "6.25.0", + "babel-core": "6.26.0", "babel-preset-es2040": "1.1.1", "through2": "2.0.3" } }, "es5-ext": { - "version": "0.10.24", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, "requires": { - "es6-iterator": "2.0.1", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } }, @@ -1657,13 +1658,13 @@ "dev": true }, "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.24", + "es5-ext": "0.10.35", "es6-symbol": "3.1.1" } }, @@ -1674,8 +1675,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -1688,8 +1689,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" } @@ -1701,7 +1702,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.24" + "es5-ext": "0.10.35" } }, "es6-weak-map": { @@ -1711,8 +1712,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } }, @@ -1739,24 +1740,24 @@ "integrity": "sha1-yaEOi/bp1lZRIEd4xQM0Hx6sPOc=", "dev": true, "requires": { - "babel-code-frame": "6.22.0", + "babel-code-frame": "6.26.0", "chalk": "1.1.3", "concat-stream": "1.6.0", - "debug": "2.6.8", + "debug": "2.6.9", "doctrine": "1.5.0", "escope": "3.6.0", - "espree": "3.4.3", + "espree": "3.5.1", "estraverse": "4.2.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", "glob": "7.1.2", "globals": "9.18.0", - "ignore": "3.3.3", + "ignore": "3.3.7", "imurmurhash": "0.1.4", "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", + "is-my-json-valid": "2.16.1", "is-resolvable": "1.0.0", - "js-yaml": "3.9.0", + "js-yaml": "3.10.0", "json-stable-stringify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.4", @@ -1825,24 +1826,24 @@ "requires": { "is-url": "1.2.2", "path-is-absolute": "1.0.1", - "source-map": "0.5.6", + "source-map": "0.5.7", "xtend": "4.0.1" } }, "espree": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", - "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", "dev": true, "requires": { - "acorn": "5.1.1", + "acorn": "5.2.1", "acorn-jsx": "3.0.1" }, "dependencies": { "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", "dev": true } } @@ -1859,7 +1860,7 @@ "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", "dev": true, "requires": { - "core-js": "2.4.1" + "core-js": "2.5.1" } }, "esrecurse": { @@ -1890,7 +1891,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.24" + "es5-ext": "0.10.35" } }, "event-stream": { @@ -1968,9 +1969,9 @@ "dev": true }, "fbjs": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.14.tgz", - "integrity": "sha1-0dviviVMNakeCfMfnNUKQLKg7Rw=", + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { "core-js": "1.2.7", "isomorphic-fetch": "2.2.1", @@ -1978,7 +1979,7 @@ "object-assign": "4.1.1", "promise": "7.3.1", "setimmediate": "1.0.5", - "ua-parser-js": "0.7.14" + "ua-parser-js": "0.7.17" }, "dependencies": { "core-js": { @@ -2003,7 +2004,7 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.2.2", + "flat-cache": "1.3.0", "object-assign": "4.1.1" } }, @@ -2019,7 +2020,7 @@ "integrity": "sha1-9KGVc1Xdr0Q8zXiolfPVXiPIoDQ=", "dev": true, "requires": { - "debounce": "1.0.2" + "debounce": "1.1.0" } }, "fill-range": { @@ -2062,9 +2063,9 @@ } }, "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { "circular-json": "0.3.3", @@ -2113,9 +2114,9 @@ "dev": true }, "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "generate-function": { @@ -2134,9 +2135,9 @@ } }, "get-port": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.1.0.tgz", - "integrity": "sha1-7wGxioTKZIaXD/meVERhQac//T4=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", "dev": true }, "get-stdin": { @@ -2184,6 +2185,15 @@ "is-glob": "2.0.1" } }, + "global-dirs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", + "integrity": "sha1-ENNAOeDfBCcuJizyQiT3IJQ0308=", + "dev": true, + "requires": { + "ini": "1.3.4" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -2256,7 +2266,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.0" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -2286,9 +2296,9 @@ "dev": true }, "hoist-non-react-statics": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", - "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz", + "integrity": "sha1-ND24TGAYxlB3iJgkATWhQg7iLOA=" }, "home-or-tmp": { "version": "2.0.0", @@ -2339,14 +2349,14 @@ } }, "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "ignore": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", - "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, "ignore-by-default": { @@ -2415,7 +2425,7 @@ "ansi-regex": "2.1.1", "chalk": "1.1.3", "cli-cursor": "1.0.2", - "cli-width": "2.1.0", + "cli-width": "2.2.0", "figures": "1.7.0", "lodash": "4.17.4", "readline2": "1.0.1", @@ -2484,9 +2494,9 @@ } }, "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", "dev": true }, "invariant": { @@ -2498,9 +2508,9 @@ } }, "irregular-plurals": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz", - "integrity": "sha512-njf5A+Mxb3kojuHd1DzISjjIl+XhyzovXEOyPPSzdQozq/Lf2tN27mOrAAsxEPZxpn6I4MGzs1oo9TxXxPFpaA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", "dev": true }, "is": { @@ -2521,13 +2531,13 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.9.0" + "binary-extensions": "1.10.0" } }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -2551,7 +2561,7 @@ "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", "dev": true, "requires": { - "ci-info": "1.0.0" + "ci-info": "1.1.1" } }, "is-date-object": { @@ -2622,10 +2632,20 @@ "is-extglob": "1.0.0" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + } + }, "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", "dev": true, "requires": { "generate-function": "2.0.0", @@ -2828,7 +2848,7 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "1.7.1", + "node-fetch": "1.7.3", "whatwg-fetch": "2.0.3" } }, @@ -2839,7 +2859,7 @@ "dev": true, "requires": { "chalk": "1.1.3", - "diff": "3.3.0", + "diff": "3.4.0", "jest-matcher-utils": "19.0.0", "pretty-format": "19.0.0" } @@ -2919,21 +2939,15 @@ "pretty-format": "19.0.0" } }, - "jju": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", - "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz", - "integrity": "sha512-0LoUNELX4S+iofCT8f4uEHIiRBR+c2AINyC8qRWfC6QNruLtxVZRJaPcu/xwMgFIgDxF25tGHaDjvxzJCNE9yw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { "argparse": "1.0.9", @@ -2945,14 +2959,11 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" }, - "json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", - "dev": true, - "requires": { - "jju": "1.3.0" - } + "json-parse-better-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", @@ -2992,7 +3003,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } }, "last-line-stream": { @@ -3239,12 +3250,20 @@ } }, "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "map-obj": { @@ -3302,6 +3321,41 @@ "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", "dev": true }, + "memory-streams": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.2.tgz", + "integrity": "sha1-Jz/3d6tg/sWZsRY1UlUoLMosUMI=", + "dev": true, + "requires": { + "readable-stream": "1.0.34" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -3434,7 +3488,7 @@ "normalize-path": "2.1.1", "object.omit": "2.0.1", "parse-glob": "3.0.4", - "regex-cache": "0.4.3" + "regex-cache": "0.4.4" } }, "mimic-fn": { @@ -3504,7 +3558,7 @@ "filewatcher": "3.0.1", "minimist": "1.2.0", "node-notifier": "4.6.1", - "resolve": "1.4.0" + "resolve": "1.5.0" }, "dependencies": { "minimist": { @@ -3525,9 +3579,9 @@ } }, "node-fetch": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { "encoding": "0.1.12", "is-stream": "1.1.0" @@ -3544,8 +3598,8 @@ "lodash.clonedeep": "3.0.2", "minimist": "1.2.0", "semver": "5.4.1", - "shellwords": "0.1.0", - "which": "1.2.14" + "shellwords": "0.1.1", + "which": "1.3.0" }, "dependencies": { "lodash.clonedeep": { @@ -3567,12 +3621,12 @@ } }, "node-source-walk": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-3.2.1.tgz", - "integrity": "sha1-Ersbmj+xhz94XEp1R7YDT5U/Zp8=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-3.3.0.tgz", + "integrity": "sha1-rRjjW/2z0Lb34OSv8eePhGo7iHM=", "dev": true, "requires": { - "babylon": "6.17.4" + "babylon": "6.18.0" } }, "normalize-package-data": { @@ -3593,22 +3647,55 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.0.2" + "remove-trailing-separator": "1.1.0" } }, "npm-run-all": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.0.2.tgz", - "integrity": "sha1-qEZpNI5ttsy+BSIAtM22v+A0pP4=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.1.tgz", + "integrity": "sha512-qrmqqaJa+REbzUTIL/mHfTdgwz+gL1xUezY/ueyLa7GISZ4T3h0CH8D2r6AaZdCYN2unu7PzspP0ofpXla1ftg==", "dev": true, "requires": { - "chalk": "1.1.3", + "ansi-styles": "3.2.0", + "chalk": "2.3.0", "cross-spawn": "5.1.0", + "memory-streams": "0.1.2", "minimatch": "3.0.4", "ps-tree": "1.1.0", "read-pkg": "2.0.0", "shell-quote": "1.6.1", "string.prototype.padend": "3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } } }, "npm-run-path": { @@ -5314,7 +5401,7 @@ "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", "dev": true, "requires": { - "irregular-plurals": "1.3.0" + "irregular-plurals": "1.4.0" } }, "pluralize": { @@ -5381,9 +5468,9 @@ } }, "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process-nextick-args": { "version": "1.0.7", @@ -5405,12 +5492,13 @@ } }, "prop-types": { - "version": "15.5.10", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.10.tgz", - "integrity": "sha1-J5ffwxJhguOpXj37suiT3ddFYVQ=", + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "requires": { - "fbjs": "0.8.14", - "loose-envify": "1.3.1" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "ps-tree": { @@ -5458,7 +5546,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } @@ -5469,15 +5557,15 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "1.1.6" } } } }, "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", "dev": true, "requires": { "deep-extend": "0.4.2", @@ -5495,41 +5583,41 @@ } }, "react": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", - "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=", + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", + "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", "requires": { - "create-react-class": "15.6.0", - "fbjs": "0.8.14", + "create-react-class": "15.6.2", + "fbjs": "0.8.16", "loose-envify": "1.3.1", "object-assign": "4.1.1", - "prop-types": "15.5.10" + "prop-types": "15.6.0" } }, "react-redux": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.5.tgz", - "integrity": "sha1-+OjHsjlCJXblLWt9sGQ5RpvphGo=", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.6.tgz", + "integrity": "sha512-8taaaGu+J7PMJQDJrk/xiWEYQmdo3mkXw6wPr3K3LxvXis3Fymiq7c13S+Tpls/AyNUAsoONkU81AP0RA6y6Vw==", "requires": { - "create-react-class": "15.6.0", - "hoist-non-react-statics": "1.2.0", + "hoist-non-react-statics": "2.3.1", "invariant": "2.2.2", "lodash": "4.17.4", "lodash-es": "4.17.4", "loose-envify": "1.3.1", - "prop-types": "15.5.10" + "prop-types": "15.6.0" } }, "read-package-json": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.10.tgz", - "integrity": "sha512-iNWaEs9hW9nviu5rHADmkm/Ob5dvah5zajtTS1XbyERSzkWgSwWZ6Z12bION7bEAzVc2YRFWnAz8k/tAr+5/eg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.12.tgz", + "integrity": "sha512-m7/I0+tP6D34EVvSlzCtuVA4D/dHL6OpLcn2e4XVP5X57pCKGUy1JjRSBVKHWpB+vUU91sL85h84qX0MdXzBSw==", "dev": true, "requires": { "glob": "7.1.2", "graceful-fs": "4.1.11", - "json-parse-helpfulerror": "1.0.3", - "normalize-package-data": "2.4.0" + "json-parse-better-errors": "1.0.1", + "normalize-package-data": "2.4.0", + "slash": "1.0.0" } }, "read-pkg": { @@ -5607,7 +5695,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.4.0" + "resolve": "1.5.0" } }, "recompose": { @@ -5616,9 +5704,16 @@ "integrity": "sha512-7+UVym5Mfks/ukIDfcAiasrY61YGki8uIs4CmLTGU7UV2lm2ObbhOl913WrlsZKu8x8uA/sLJUOI5hxVga0dIA==", "requires": { "change-emitter": "0.1.6", - "fbjs": "0.8.14", + "fbjs": "0.8.16", "hoist-non-react-statics": "1.2.0", "symbol-observable": "1.0.4" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", + "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" + } } }, "redent": { @@ -5671,24 +5766,23 @@ } }, "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", "dev": true }, "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" }, "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" + "is-equal-shallow": "0.1.3" } }, "regexpu-core": { @@ -5697,7 +5791,7 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.2", + "regenerate": "1.3.3", "regjsgen": "0.2.0", "regjsparser": "0.1.5" } @@ -5708,7 +5802,7 @@ "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", "dev": true, "requires": { - "rc": "1.2.1", + "rc": "1.2.2", "safe-buffer": "5.1.1" } }, @@ -5718,7 +5812,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.1" + "rc": "1.2.2" } }, "regjsgen": { @@ -5754,9 +5848,9 @@ } }, "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "repeat-element": { @@ -5809,9 +5903,9 @@ "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=" }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" @@ -5851,9 +5945,9 @@ } }, "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "7.1.2" @@ -5945,14 +6039,14 @@ "dev": true, "requires": { "glob": "7.1.2", - "interpret": "1.0.3", + "interpret": "1.0.4", "rechoir": "0.6.2" } }, "shellwords": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", - "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, "signal-exit": { @@ -5991,16 +6085,16 @@ } }, "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "0.5.6" + "source-map": "0.5.7" } }, "spdx-correct": { @@ -6131,8 +6225,8 @@ "dev": true, "requires": { "define-properties": "1.1.2", - "es-abstract": "1.7.0", - "function-bind": "1.1.0" + "es-abstract": "1.9.0", + "function-bind": "1.1.1" } }, "string_decoder": { @@ -6345,9 +6439,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.14", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz", - "integrity": "sha1-EQ1T+kw/MmwSEpK76skE0uAzh8o=" + "version": "0.7.17", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" }, "uid2": { "version": "0.0.3", @@ -6394,19 +6488,51 @@ "dev": true }, "update-notifier": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", - "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", "dev": true, "requires": { - "boxen": "1.2.1", - "chalk": "1.1.3", + "boxen": "1.2.2", + "chalk": "2.3.0", "configstore": "3.1.1", "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", "is-npm": "1.0.0", "latest-version": "3.1.0", "semver-diff": "2.1.0", "xdg-basedir": "3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } } }, "url-parse-lax": { @@ -6448,9 +6574,9 @@ "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" }, "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { "isexe": "2.0.0" @@ -6509,28 +6635,28 @@ } }, "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", - "slide": "1.1.6" + "signal-exit": "3.0.2" } }, "write-json-file": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.2.0.tgz", - "integrity": "sha1-UYYlBruzthnu+reFnx/WxtBTCHY=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", "dev": true, "requires": { "detect-indent": "5.0.0", "graceful-fs": "4.1.11", - "make-dir": "1.0.0", - "pify": "2.3.0", - "sort-keys": "1.1.2", - "write-file-atomic": "2.1.0" + "make-dir": "1.1.0", + "pify": "3.0.0", + "sort-keys": "2.0.0", + "write-file-atomic": "2.3.0" }, "dependencies": { "detect-indent": { @@ -6539,14 +6665,11 @@ "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", "dev": true }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, @@ -6557,7 +6680,7 @@ "dev": true, "requires": { "sort-keys": "2.0.0", - "write-json-file": "2.2.0" + "write-json-file": "2.3.0" } }, "xdg-basedir": { From 598ea19f9226ffcddea9b2136cb6edaf2183e64d Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 8 Feb 2018 17:25:49 +1300 Subject: [PATCH 03/13] default arg resolution --- index.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 621be39..44938ec 100644 --- a/index.js +++ b/index.js @@ -118,15 +118,12 @@ const bindCidToActionCreators = mapObjIndexed((action, name) => { } }) -const resolveQueryArg = (argName) => (query) => (state, props) => { +const resolveQueryArg = (argName) => (dft) => (query) => (state, props) => { const arg = query[argName] - return ( - isNil(arg) - ? null - : isFunction(arg) - ? arg(state, props) - : arg - ) + if (isNil(arg)) return dft + if (!isFunction(arg)) return arg + const result = arg(state, props) + return isNil(result) ? dft : result } const getRawQuerys = (state, props) => { @@ -167,8 +164,8 @@ const getQuerys = createSelector( const isStarted = not(isNil(cid)) const hasReadyDependencies = hasReadyDependenciesByQuery[query.name] // TODO clean up - const id = resolveQueryArg('id')(query)(state, ownProps) - const params = resolveQueryArg('params')(query)(state, ownProps) + const id = resolveQueryArg('id')(null)(query)(state, ownProps) + const params = resolveQueryArg('params')({})(query)(state, ownProps) var request, isReady, prevArgs if (isStarted) { request = requests[cid] @@ -254,7 +251,6 @@ function createFeathersConnector (options) { { actions } ]) console.log('render', componentProps) - return null return createElement(component, componentProps) }) } From 5105152f4469dbf9a512ebece0db8efd725c666c Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 8 Feb 2018 17:27:48 +1300 Subject: [PATCH 04/13] 3.0.0-pre.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ebd3c32..8a28ed1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "feathers-action-react", - "version": "2.2.1", + "version": "3.0.0-pre.0", "description": "connect feathers-action to react data containers", "main": "index.js", "scripts": { From d1ea1037eb62abfb65aeb0a4c1252eeb51fa71b9 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Mon, 12 Feb 2018 18:15:09 +1300 Subject: [PATCH 05/13] 3.0.0-pre.0 --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 07731a3..5b34f93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "feathers-action-react", - "version": "2.2.1", + "version": "3.0.0-pre.0", "lockfileVersion": 1, "requires": true, "dependencies": { From 966bcee89a86694d79238a21377068895ee98037 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Mon, 12 Feb 2018 18:15:20 +1300 Subject: [PATCH 06/13] dependent queries work? --- index.js | 83 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/index.js b/index.js index 44938ec..296e30b 100644 --- a/index.js +++ b/index.js @@ -1,4 +1,5 @@ const { createElement } = require('react') +const tap = require('ramda/src/tap') const compose = require('recompose/compose').default const withStateHandlers = require('recompose/withStateHandlers').default const withProps = require('recompose/withProps').default @@ -18,6 +19,7 @@ const partialRight = require('ramda/src/partialRight') const either = require('ramda/src/either') const not = require('ramda/src/not') const prop = require('ramda/src/prop') +const defaultTo = require('ramda/src/defaultTo') const path = require('ramda/src/path') const forEach = require('ramda/src/forEach') const values = require('ramda/src/values') @@ -28,6 +30,7 @@ const omit = require('ramda/src/omit') const all = require('ramda/src/all') const __ = require('ramda/src/__') const merge = require('ramda/src/merge') +const clone = require('ramda/src/clone') const ifElse = require('ramda/src/ifElse') const { createSelector, createStructuredSelector } = require('reselect') const deepEqual = require('fast-deep-equal') @@ -78,11 +81,15 @@ function connect (options) { const stateConnector = withStateHandlers( { query, - cidByQuery: {} + cidByQuery: {}, + argsByQuery: {} }, { setCidByQuery: ({ cidByQuery }) => (queryName, cid) => ({ cidByQuery: assoc(queryName, cid, cidByQuery) + }), + setArgsByQuery: ({ argsByQuery }) => (queryName, args) => ({ + argsByQuery: assoc(queryName, args, argsByQuery) }) } ) @@ -101,9 +108,8 @@ function nameQuery (query) { if (isArray(query)) { return query.map(nameQuery) } - return merge(query, { - name: createCid() - }) + if (!isNil(query.name)) return query + return merge(query, { name: createCid() }) } const bindCidToActionCreators = mapObjIndexed((action, name) => { @@ -133,50 +139,81 @@ const getRawQuerys = (state, props) => { const getCidByQuery = (state, props) => { return props.cidByQuery } +const getArgsByQuery = (state, props) => { + return props.argsByQuery +} +const getRequestByQuery = createSelector( + getCidByQuery, + getFeathersRequests, + (cidByQuery, requests) => { + const mapRequests = map(pipe( + cid => { + return requests[cid] + }, + defaultTo(null) + )) + return mapRequests(cidByQuery) + } +) +const getIsReadyByQuery = createSelector( + getRequestByQuery, + ifElse( + isNil, + () => ({}), + map( + ifElse( + isNil, + () => false, + prop('isReady') + ) + ) + ) +) const getQueryByName = createSelector( getRawQuerys, indexByName ) -const isReady = path(['request', 'isReady']) const getHasReadyDependenciesByQuery = createSelector( getQueryByName, - (queryByName) => map(pipe( + getIsReadyByQuery, + (queryByName, isReadyByQuery) => map(pipe( prop('dependencies'), ifElse( either(isNil, isEmpty), () => true, - all(pipe( - prop(__, queryByName), - isReady - )) + all(prop(__, isReadyByQuery)) ) ))(queryByName) ) const getQuerys = createSelector( getQueryByName, getCidByQuery, + getArgsByQuery, + getRequestByQuery, + getIsReadyByQuery, getHasReadyDependenciesByQuery, - getFeathersRequests, getStateAndOwnProps, - (queryByName, cidByQuery, hasReadyDependenciesByQuery, requests, [state, ownProps]) => { + (queryByName, cidByQuery, argsByQuery, requestByQuery, isReadyByQuery, hasReadyDependenciesByQuery, [state, ownProps]) => { const enhanceQuerys = map(query => { const cid = cidByQuery[query.name] - const isStarted = not(isNil(cid)) + const args = argsByQuery[query.name] + const request = requestByQuery[query.name] + const isReady = isReadyByQuery[query.name] const hasReadyDependencies = hasReadyDependenciesByQuery[query.name] + + const isStarted = not(isNil(cid)) // TODO clean up const id = resolveQueryArg('id')(null)(query)(state, ownProps) - const params = resolveQueryArg('params')({})(query)(state, ownProps) - var request, isReady, prevArgs + // need to clone params because feathers mutates the params during a request. + const params = clone(resolveQueryArg('params')({})(query)(state, ownProps)) + var prevArgs if (isStarted) { - request = requests[cid] - isReady = request.isReady prevArgs = { // TODO clean up - id: isNil(request.args.id) ? null: request.args.id, - params: isNil(request.args.params) ? null: request.args.params + id: isNil(args.id) ? null: args.id, + params: isNil(args.params) ? {}: args.params } } else { - isReady = false prevArgs = null } const nextArgs = { id, params } @@ -184,6 +221,7 @@ const getQuerys = createSelector( const shouldRequest = hasReadyDependencies && ( not(isStarted) || not(isSameArgs) ) + return merge(query, { cid, request, @@ -270,8 +308,11 @@ function createFeathersConnector (options) { handleEachQuery(props.querys) } - function requestQuery (query, { actions, setCidByQuery } ) { + function requestQuery (query, { actions, setCidByQuery, setArgsByQuery } ) { const { name, service, id, params } = query + // need to clone args to check prevArgs == nextArgs, + // because feathers mutates the arguments during a request. + setArgsByQuery(name, clone({ id, params })) const method = id ? 'get' : 'find' const action = actions[service][method] const cid = id ? action(id, params) : action(params) From 2078e1f62c0bf3e059371e53120e73342b36487c Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Mon, 12 Feb 2018 18:15:40 +1300 Subject: [PATCH 07/13] 3.0.0-pre.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8a28ed1..093a354 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "feathers-action-react", - "version": "3.0.0-pre.0", + "version": "3.0.0-pre.1", "description": "connect feathers-action to react data containers", "main": "index.js", "scripts": { From ca09278106c6067c7d2f61a0c521babfed82c1bf Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 15 Feb 2018 15:08:15 +1300 Subject: [PATCH 08/13] fix race condition i *think* there was a bug where the two states were not being set at the same time, which led to a situation where the args had changed but the cid was not yet set, causing an infinite loop. --- index.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 296e30b..309507d 100644 --- a/index.js +++ b/index.js @@ -310,12 +310,13 @@ function createFeathersConnector (options) { function requestQuery (query, { actions, setCidByQuery, setArgsByQuery } ) { const { name, service, id, params } = query - // need to clone args to check prevArgs == nextArgs, - // because feathers mutates the arguments during a request. - setArgsByQuery(name, clone({ id, params })) + const args = clone({ id, params }) const method = id ? 'get' : 'find' const action = actions[service][method] const cid = id ? action(id, params) : action(params) + // need to clone args to check prevArgs == nextArgs, + // because feathers mutates the arguments during a request. + setArgsByQuery(name, args) setCidByQuery(name, cid) } From 1982180c34dede99ca2aee7602649e718d1c1c0a Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 15 Feb 2018 15:09:40 +1300 Subject: [PATCH 09/13] comment out logs --- index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 309507d..3330e38 100644 --- a/index.js +++ b/index.js @@ -245,7 +245,7 @@ function createReduxConnector (options) { const selected = selector(state, props.ownProps) // use react state handlers const querys = getQuerys(state, props) - console.log('mapStateToProps', selected, querys) + // console.log('mapStateToProps', selected, querys) return { selected, querys } }, function mapDispatchToProps (dispatch) { @@ -268,17 +268,17 @@ function createFeathersConnector (options) { const feathersConnector = (component) => { return lifecycle({ componentDidMount () { - console.log('mountProps', this.props) + // console.log('mountProps', this.props) handleQuerys(this.props) }, componentDidUpdate (nextProps) { - console.log('componentDidUpdate', nextProps) + // console.log('componentDidUpdate', nextProps) handleQuerys(nextProps) }, componentWillUnmount () { - console.log('unmountProps', this.props) + // console.log('unmountProps', this.props) cancelQuerys(this.props) } })(function ConnectedFeathers (props) { @@ -288,7 +288,7 @@ function createFeathersConnector (options) { ownProps, { actions } ]) - console.log('render', componentProps) + // console.log('render', componentProps) return createElement(component, componentProps) }) } From cba899830220778f6c40de260c9b7fcc33075a2d Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 15 Feb 2018 15:10:14 +1300 Subject: [PATCH 10/13] 3.0.0-pre.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 093a354..78f64bd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "feathers-action-react", - "version": "3.0.0-pre.1", + "version": "3.0.0-pre.2", "description": "connect feathers-action to react data containers", "main": "index.js", "scripts": { From ff7fa8b7c7e0f79936d7fcedfc7209673a841d06 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 15 Feb 2018 16:51:27 +1300 Subject: [PATCH 11/13] friendly! --- README.md | 24 +++++---- index.js | 145 ++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 122 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 345ae4d..2c914e5 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ npm install --save feathers-action-react ```js import { connect } from 'feathers-action-react' +import { + createSelector, + createStructuredSelector +} from 'reselect' import Dogs from '../components/dogs' @@ -39,15 +43,15 @@ export default connect({ dependencies: [ 'findAllDogs' ], - params: (state, props) => { - const dogs = getDogs(state, props) - return { + params: createSelector( + getDogs, + (dogs) => ({ params: { dogId: { $in: dogs.map(dog => dog.id) } } - } + }) } } ] @@ -62,12 +66,14 @@ export default connect({ `options`: -- `selector`: a function of shape `(state) => props` +- `selector`: a function of shape `(state, props) => selected` - `actions`: an object where keys are feathers service names and values are objects of action creators -- `query`: an object to describe a feathers `find` or `get` service method call, or an array of these, or a function of shape `(props) => query`. - - for find: `{ service, params }` - - for get: `{ service, id, params }` -- `shouldQueryAgain`: a function of shape `(props, status) => Boolean` for whether we should re-fetch on updated props +- `query`: an object or array of objects to describe feathers `find` or `get` service method calls + - `name`: (optional) name of query + - `service`: (required) name of feathers service to call + - `dependencies`: (optional) array of query names that this query depends on being run before is ready + - `params`: (optional) object or selector for object to use as `params` argument in feathers call + - `id`: (required if `get` call) value or selector for value to use as `id` argument in feathers call `hoc` is a "higher-order component": a function of shape `(component) => nextComponent` diff --git a/index.js b/index.js index 3330e38..2349cf9 100644 --- a/index.js +++ b/index.js @@ -1,39 +1,43 @@ -const { createElement } = require('react') -const tap = require('ramda/src/tap') -const compose = require('recompose/compose').default -const withStateHandlers = require('recompose/withStateHandlers').default -const withProps = require('recompose/withProps').default -const lifecycle = require('recompose/lifecycle').default -const { connect: connectRedux } = require('react-redux') -const { bindActionCreators: bindDispatchActionCreators } = require('redux') -const createCid = require('incremental-id') const assert = require('assert') +const __ = require('ramda/src/__') +const all = require('ramda/src/all') +const assoc = require('ramda/src/assoc') +const both = require('ramda/src/both') +const clone = require('ramda/src/clone') +const createCid = require('incremental-id') +const curry = require('ramda/src/curry') +const defaultTo = require('ramda/src/defaultTo') +const either = require('ramda/src/either') +const forEach = require('ramda/src/forEach') +const has = require('ramda/src/has') +const ifElse = require('ramda/src/ifElse') +const indexBy = require('ramda/src/indexBy') const is = require('ramda/src/is') const isNil = require('ramda/src/isNil') const isEmpty = require('ramda/src/isEmpty') -const pipe = require('ramda/src/pipe') -const mergeAll = require('ramda/src/mergeAll') +const keys = require('ramda/src/keys') const map = require('ramda/src/map') const mapObjIndexed = require('ramda/src/mapObjIndexed') -const partialRight = require('ramda/src/partialRight') -const either = require('ramda/src/either') +const merge = require('ramda/src/merge') +const mergeAll = require('ramda/src/mergeAll') const not = require('ramda/src/not') -const prop = require('ramda/src/prop') -const defaultTo = require('ramda/src/defaultTo') -const path = require('ramda/src/path') -const forEach = require('ramda/src/forEach') -const values = require('ramda/src/values') -const indexBy = require('ramda/src/indexBy') const nthArg = require('ramda/src/nthArg') -const assoc = require('ramda/src/assoc') const omit = require('ramda/src/omit') -const all = require('ramda/src/all') -const __ = require('ramda/src/__') -const merge = require('ramda/src/merge') -const clone = require('ramda/src/clone') -const ifElse = require('ramda/src/ifElse') -const { createSelector, createStructuredSelector } = require('reselect') +const partialRight = require('ramda/src/partialRight') +const path = require('ramda/src/path') +const pipe = require('ramda/src/pipe') +const prop = require('ramda/src/prop') +const reduce = require('ramda/src/reduce') +const values = require('ramda/src/values') const deepEqual = require('fast-deep-equal') +const { createElement } = require('react') +const compose = require('recompose/compose').default +const lifecycle = require('recompose/lifecycle').default +const withProps = require('recompose/withProps').default +const withStateHandlers = require('recompose/withStateHandlers').default +const { bindActionCreators: bindDispatchActionCreators } = require('redux') +const { connect: connectRedux } = require('react-redux') +const { createSelector, createStructuredSelector } = require('reselect') module.exports = { connect @@ -41,16 +45,84 @@ module.exports = { const indexByName = indexBy(prop('name')) -const isFunction = is(Function) +const isAny = () => true const isArray = is(Array) +const isFunction = is(Function) const isObject = is(Object) +const isString = is(String) + +const hasProperties = curry((propertyTypes, object) => { + return all( + (propertyName) => { + const propertyType = propertyTypes[propertyName] + const { + type, + required = false + } = propertyType + const objectValue = object[propertyName] + const isType = type(objectValue) + return isType + }, + keys(propertyTypes) + ) +}) -//const shouldBindCid = prop('shouldBindCid') +const hasValues = curry((type, object) => { + return pipe( + values, + all(type) + ) +}) + +// TODO make configurable somehow (either in connect options or attached to action creator?) const shouldBindCid = () => true const isSelector = isFunction -const isActions = isObject -const isQuery = either(isArray, isObject) +const assertSelector = (selector) => { + assert(isSelector(selector), 'feathers-action-react: options.selector is not a selector, expected function') +} + +const isActions = both(isObject, hasValues(both(isObject, hasValues(isFunction)))) +const assertActions = (actions) => { + assert(isActions(actions), 'feathers-action-react: options.actions is not actions, expected object of objects of functions') +} + +const isQueryItem = both( + isObject, + hasProperties({ + name: { + type: isString + }, + service: { + type: isString, + required: true + }, + params: { + type: either(isObject, isFunction) + }, + id: { + type: either(isAny, isFunction) + }, + dependencies: { + type: both(isArray, hasValues(isString)) + } + }) +) +const isQuery = either(isQueryItem, both(isArray, hasValues(isQueryItem))) +const assertQuery = (query) => { + assert(isQuery(query), 'feathers-action-react: options.query is not a query, expected object or array of objects with properties: optional `name` string, required `service` string, optional `params` object or function, optional `id` any or function, optional `dependencies` array of strings.') +} + +const assertQueryActions = curry((actions, query) => { + return forEach( + nextQuery => { + const { service } = nextQuery + assert(!isNil(actions[service]), `feathers-action-react: options.actions is missing actions for service ${service}`) + return nextQuery + }, + query + ) +}) const getFeathersRequests = prop('feathers') const getStateAndOwnProps = (state, props) => [state, props.ownProps] @@ -63,16 +135,12 @@ function connect (options) { query: ogQuery = [] } = options - assert(isSelector(selector), 'options.selector is not a selector, expected function') - assert(isActions(actions), 'options.actions is not actions, expected object') - assert(isQuery(ogQuery), 'options.query is not a query, expected array or object') + assertSelector(selector) + assertActions(actions) - // TODO assert(hasAllActions) - // if (!props.actions[service]) { - // throw new Error(`feathers-action-react/index: Expected to be provided respective actions for service ${service} in the actions object`) - // } + assertQuery(ogQuery) + assertQueryActions(actions, ogQuery) - // TODO assert(allQuerysHaveNames) const query = nameQuery(ogQuery) const propsConnector = withProps( @@ -337,3 +405,4 @@ function createFeathersConnector (options) { return feathersConnector } + From ca8ee37173dbe75a63c864f39e8c3f8e14a0dd07 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 15 Feb 2018 16:51:53 +1300 Subject: [PATCH 12/13] 3.0.0-pre.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 78f64bd..0f9a61e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "feathers-action-react", - "version": "3.0.0-pre.2", + "version": "3.0.0-pre.3", "description": "connect feathers-action to react data containers", "main": "index.js", "scripts": { From 2f332c72a5dfba3c4398ed78063ea02b6696cfd2 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 15 Feb 2018 17:09:26 +1300 Subject: [PATCH 13/13] 3.0.0-pre.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b63af04..5e5e753 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "feathers-action-react", - "version": "3.0.0-pre.3", + "version": "3.0.0-pre.4", "description": "connect feathers-action to react data containers", "main": "index.js", "scripts": {