From aaa0470ea43578c2eda0e26f68fb6e35ab75e08d Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sat, 14 Jul 2018 16:47:53 -0400 Subject: [PATCH 01/14] fix connected props derived props generation This commit fixes https://github.com/reduxjs/react-redux/issues/965 The essence of the problem is that getDerivedStateFromProps is called when the incoming props OR incoming local state changes. So we cannot store anything in state that is needed in shouldComponentUpdate. This commit splits up the tracking of incoming props, incoming store state changes, and removes getDerivedStateFromProps and the usage of local state to store any information. Instead, local state is used as a flag solely to track whether the incoming store state has changed. Since derived props are needed in shouldComponentUpdate, it is generated there and then compared to the previous version of derived props. If forceUpdate() is called, this bypasses sCU, and so a check in render() compares the props that should have been passed to sCU to those passed to render(). If they are different, it generates them just-in-time. To summarize: 1) shouldComponentUpdate is ONLY used to process changes to incoming props 2) runUpdater (renamed to triggerUpdateOnStoreStateChange) checks to see if the store state has changed, and stores the state, then updates the counter in local state in order to trigger a new sCU call to re-generate derived state. Because of these changes, getDerivedStateFromProps and the polyfill are both removed. All tests pass on my machine, but there is at least 1 side effects to the new design: - Many of the tests pass state unchanged to props, and pass this to child components. With these changes, the two updates are processed separately. Props changes are processed first, and then state changes are processed. I updated the affected tests to show that there are "in-between" states where the state and props are inconsistent and mapStateToProps is called with these changes. If the old behavior is desired, that would require another redesign, I suspect. --- package-lock.json | 5 -- package.json | 3 +- src/components/connectAdvanced.js | 113 +++++++++++++++++------------- test/components/Provider.spec.js | 31 ++++++-- test/components/connect.spec.js | 49 +++++++++++-- 5 files changed, 135 insertions(+), 66 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0cb5531f9..e91114a90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6669,11 +6669,6 @@ "prop-types": "^15.6.0" } }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, "react-test-renderer": { "version": "16.3.2", "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.3.2.tgz", diff --git a/package.json b/package.json index 0a95d86b6..8f1b37571 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,7 @@ "hoist-non-react-statics": "^2.5.5", "invariant": "^2.2.4", "loose-envify": "^1.1.0", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.0" + "prop-types": "^15.6.1" }, "devDependencies": { "babel-cli": "^6.26.0", diff --git a/src/components/connectAdvanced.js b/src/components/connectAdvanced.js index 1a5faa625..c4495b86a 100644 --- a/src/components/connectAdvanced.js +++ b/src/components/connectAdvanced.js @@ -1,35 +1,12 @@ import hoistStatics from 'hoist-non-react-statics' import invariant from 'invariant' import { Component, createElement } from 'react' -import { polyfill } from 'react-lifecycles-compat' import Subscription from '../utils/Subscription' import { storeShape, subscriptionShape } from '../utils/PropTypes' let hotReloadingVersion = 0 function noop() {} -function makeUpdater(sourceSelector, store) { - return function updater(props, prevState) { - try { - const nextProps = sourceSelector(store.getState(), props) - if (nextProps !== prevState.props || prevState.error) { - return { - shouldComponentUpdate: true, - props: nextProps, - error: null, - } - } - return { - shouldComponentUpdate: false, - } - } catch (error) { - return { - shouldComponentUpdate: true, - error, - } - } - } -} export default function connectAdvanced( /* @@ -88,10 +65,6 @@ export default function connectAdvanced( [subscriptionKey]: subscriptionShape, } - function getDerivedStateFromProps(nextProps, prevState) { - return prevState.updater(nextProps, prevState) - } - return function wrapWithConnect(WrappedComponent) { invariant( typeof WrappedComponent == 'function', @@ -134,10 +107,14 @@ export default function connectAdvanced( `or explicitly pass "${storeKey}" as a prop to "${displayName}".` ) + this.createSelector() this.state = { - updater: this.createUpdater() + updateCount: 0 } + this.storeState = this.store.getState() this.initSubscription() + this.derivedProps = this.derivedPropsUpdater() + this.received = this.props } getChildContext() { @@ -159,11 +136,17 @@ export default function connectAdvanced( // dispatching an action in its componentWillMount, we have to re-run the select and maybe // re-render. this.subscription.trySubscribe() - this.runUpdater() + this.triggerUpdateOnStoreStateChange() } - shouldComponentUpdate(_, nextState) { - return nextState.shouldComponentUpdate + shouldComponentUpdate(nextProps) { + this.received = nextProps + // received a prop update, store state updates are handled in onStateChange + const oldProps = this.derivedProps + const newProps = this.updateDerivedProps(nextProps) + if (this.error) return true + const sCU = newProps !== oldProps + return sCU } componentWillUnmount() { @@ -174,6 +157,31 @@ export default function connectAdvanced( this.isUnmounted = true } + updateDerivedProps(nextProps) { + this.derivedProps = this.derivedPropsUpdater(nextProps) + return this.derivedProps + } + + derivedPropsUpdater(props = this.props) { + // runs when props change, or the store state changes + // and generates the derived props for connected components + try { + const nextProps = this.sourceSelector(this.storeState, props) + if (nextProps !== this.derivedProps || this.error) { + this.error = null + return nextProps + } + return this.derivedProps + } catch (error) { + this.error = error + return this.derivedProps + } + } + + createSelector() { + this.sourceSelector = selectorFactory(this.store.dispatch, selectorFactoryOptions) + } + getWrappedInstance() { invariant(withRef, `To access the wrapped instance, you need to specify ` + @@ -186,17 +194,24 @@ export default function connectAdvanced( this.wrappedInstance = ref } - createUpdater() { - const sourceSelector = selectorFactory(this.store.dispatch, selectorFactoryOptions) - return makeUpdater(sourceSelector, this.store) - } - - runUpdater(callback = noop) { + triggerUpdateOnStoreStateChange(callback = noop) { + // runs when an action is dispatched by the store we are listening to + // if the store state has changed, we save that and update the component state + // to force a re-generation of derived props if (this.isUnmounted) { return } - this.setState(prevState => prevState.updater(this.props, prevState), callback) + this.setState(prevState => { + const newState = this.store.getState() + if (this.storeState === newState) { + return prevState + } + this.storeState = newState + return { + updateCount: prevState.updateCount++ + } + }, callback) } initSubscription() { @@ -217,7 +232,7 @@ export default function connectAdvanced( } onStateChange() { - this.runUpdater(this.notifyNestedSubs) + this.triggerUpdateOnStoreStateChange(this.notifyNestedSubs) } isSubscribed() { @@ -238,10 +253,16 @@ export default function connectAdvanced( } render() { - if (this.state.error) { - throw this.state.error + if (this.received !== this.props) { + // forceUpdate() was called on this component, which skips sCU + // so manually update derived props + this.received = this.props + this.updateDerivedProps(this.props) + } + if (this.error) { + throw this.error } else { - return createElement(WrappedComponent, this.addExtraProps(this.state.props)) + return createElement(WrappedComponent, this.addExtraProps(this.derivedProps)) } } } @@ -251,7 +272,6 @@ export default function connectAdvanced( Connect.childContextTypes = childContextTypes Connect.contextTypes = contextTypes Connect.propTypes = contextTypes - Connect.getDerivedStateFromProps = getDerivedStateFromProps if (process.env.NODE_ENV !== 'production') { Connect.prototype.componentDidUpdate = function componentDidUpdate() { @@ -276,15 +296,12 @@ export default function connectAdvanced( oldListeners.forEach(listener => this.subscription.listeners.subscribe(listener)) } - const updater = this.createUpdater() - this.setState({updater}) - this.runUpdater() + this.createSelector() + this.triggerUpdateOnStoreStateChange() } } } - polyfill(Connect) - return hoistStatics(Connect, WrappedComponent) } } diff --git a/test/components/Provider.spec.js b/test/components/Provider.spec.js index 2d96b6c85..078abb462 100644 --- a/test/components/Provider.spec.js +++ b/test/components/Provider.spec.js @@ -187,10 +187,12 @@ describe('React', () => { } } + const childCalls = [] @connect((state, parentProps) => { childMapStateInvokes++ + childCalls.push([state, parentProps.parentState]) // The state from parent props should always be consistent with the current state - expect(state).toEqual(parentProps.parentState) + //expect(state).toEqual(parentProps.parentState) return {} }) class ChildContainer extends Component { @@ -209,16 +211,37 @@ describe('React', () => { // The store state stays consistent when setState calls are batched store.dispatch({ type: 'APPEND', body: 'c' }) - expect(childMapStateInvokes).toBe(2) + expect(childMapStateInvokes).toBe(3) + expect(childCalls).toEqual([ + ['a', 'a'], + ['a', 'ac'], // parent updates first, passes props + ['ac', 'ac'] // then store update is processed + ]) // setState calls DOM handlers are batched const button = testRenderer.root.findByType('button') button.props.onClick() - expect(childMapStateInvokes).toBe(3) + expect(childCalls).toEqual([ + ['a', 'a'], + ['a', 'ac'], // parent updates first, passes props + ['ac', 'ac'], // then store update is processed + ['ac', 'acb'], // parent updates first, passes props + ['acb', 'acb'], // then store update is processed + ]) + expect(childMapStateInvokes).toBe(5) // Provider uses unstable_batchedUpdates() under the hood store.dispatch({ type: 'APPEND', body: 'd' }) - expect(childMapStateInvokes).toBe(4) + expect(childCalls).toEqual([ + ['a', 'a'], + ['a', 'ac'], // parent updates first, passes props + ['ac', 'ac'], // then store update is processed + ['ac', 'acb'], // parent updates first, passes props + ['acb', 'acb'], // then store update is processed + ['acb', 'acbd'], // parent updates first, passes props + ['acbd', 'acbd'], // then store update is processed + ]) + expect(childMapStateInvokes).toBe(7) }) it('works in without warnings', () => { diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index 3fcf44bc4..d32231db5 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -1758,10 +1758,12 @@ describe('React', () => { } } + const childCalls = [] @connect((state, parentProps) => { childMapStateInvokes++ + childCalls.push([state, parentProps.parentState]) // The state from parent props should always be consistent with the current state - expect(state).toEqual(parentProps.parentState) + //expect(state).toEqual(parentProps.parentState) return {} }) class ChildContainer extends Component { @@ -1777,20 +1779,44 @@ describe('React', () => { ) expect(childMapStateInvokes).toBe(1) + expect(childCalls).toEqual([ + ['a', 'a'] + ]) // The store state stays consistent when setState calls are batched ReactDOM.unstable_batchedUpdates(() => { store.dispatch({ type: 'APPEND', body: 'c' }) }) - expect(childMapStateInvokes).toBe(2) + expect(childMapStateInvokes).toBe(3) + expect(childCalls).toEqual([ + ['a', 'a'], + ['a', 'ac'], + ['ac', 'ac'], + ]) // setState calls DOM handlers are batched const button = testRenderer.root.findByType('button') button.props.onClick() - expect(childMapStateInvokes).toBe(3) + expect(childMapStateInvokes).toBe(5) + expect(childCalls).toEqual([ + ['a', 'a'], + ['a', 'ac'], + ['ac', 'ac'], + ['ac', 'acb'], + ['acb', 'acb'], + ]) store.dispatch({ type: 'APPEND', body: 'd' }) - expect(childMapStateInvokes).toBe(4) + expect(childMapStateInvokes).toBe(7) + expect(childCalls).toEqual([ + ['a', 'a'], + ['a', 'ac'], + ['ac', 'ac'], + ['ac', 'acb'], + ['acb', 'acb'], + ['acb', 'acbd'], + ['acbd', 'acbd'], + ]) }) it('should not render the wrapped component when mapState does not produce change', () => { @@ -2006,7 +2032,7 @@ describe('React', () => { return { ...stateProps, ...dispatchProps, name: parentProps.name } } - @connect(null, mapDispatchFactory, mergeParentDispatch) + @connect(() => ({}), mapDispatchFactory, mergeParentDispatch) class Passthrough extends Component { componentDidUpdate() { updatedCount++ @@ -2251,9 +2277,11 @@ describe('React', () => { } const store = createStore((state = 0, action) => (action.type === 'INC' ? state + 1 : state)) - TestRenderer.create() + const a = TestRenderer.create() expect(mapStateToProps).toHaveBeenCalledTimes(1) + console.log('dispatch') + console.log(a.getInstance().props.children) store.dispatch({ type: 'INC' }) expect(mapStateToProps).toHaveBeenCalledTimes(2) }) @@ -2266,8 +2294,9 @@ describe('React', () => { @connect() // no mapStateToProps. therefore it should be transparent for subscriptions class B extends React.Component { render() { return }} + let calls = [] @connect((state, props) => { - expect(props.count).toBe(state) + calls.push([state, props.count]) return { count: state * 10 + props.count } }) class C extends React.Component { render() { return
{this.props.count}
}} @@ -2276,6 +2305,12 @@ describe('React', () => { TestRenderer.create() store.dispatch({ type: 'INC' }) + + expect(calls).toEqual([ + [0, 0], + [0, 1], // props updates first + [1, 1], // then state + ]) }) it('should subscribe properly when a new store is provided via props', () => { From 41ff984c04a15f1b79d8cf0389d862a4de12aac9 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sat, 14 Jul 2018 16:52:48 -0400 Subject: [PATCH 02/14] fix linting errors --- test/components/connect.spec.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index d32231db5..8721313b1 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -2277,11 +2277,9 @@ describe('React', () => { } const store = createStore((state = 0, action) => (action.type === 'INC' ? state + 1 : state)) - const a = TestRenderer.create() + TestRenderer.create() expect(mapStateToProps).toHaveBeenCalledTimes(1) - console.log('dispatch') - console.log(a.getInstance().props.children) store.dispatch({ type: 'INC' }) expect(mapStateToProps).toHaveBeenCalledTimes(2) }) From 9f44bed4e80fb7b9e8585dc86987e897a417051c Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Mon, 16 Jul 2018 15:37:55 -0400 Subject: [PATCH 03/14] update dev dependency to React 16.4 --- package-lock.json | 34 ++++++++++++++++------------------ package.json | 6 +++--- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index e91114a90..7d92b3966 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6646,9 +6646,9 @@ } }, "react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.3.2.tgz", - "integrity": "sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.4.1.tgz", + "integrity": "sha512-3GEs0giKp6E0Oh/Y9ZC60CmYgUPnp7voH9fbjWsvXtYFb4EWtgQub0ADSq0sJR0BbHc4FThLLtzlcFaFXIorwg==", "dev": true, "requires": { "fbjs": "^0.8.16", @@ -6658,9 +6658,9 @@ } }, "react-dom": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", - "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.1.tgz", + "integrity": "sha512-1Gin+wghF/7gl4Cqcvr1DxFX2Osz7ugxSwl6gBqCMpdrxHjIFUS7GYxrFftZ9Ln44FHw0JxCFD9YtZsrbR5/4A==", "dev": true, "requires": { "fbjs": "^0.8.16", @@ -6669,24 +6669,22 @@ "prop-types": "^15.6.0" } }, + "react-is": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", + "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", + "dev": true + }, "react-test-renderer": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.3.2.tgz", - "integrity": "sha512-lL8WHIpCTMdSe+CRkt0rfMxBkJFyhVrpdQ54BaJRIrXf9aVmbeHbRA8GFRpTvohPN5tPzMabmrzW2PUfWCfWwQ==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.4.1.tgz", + "integrity": "sha512-wyyiPxRZOTpKnNIgUBOB6xPLTpIzwcQMIURhZvzUqZzezvHjaGNsDPBhMac5fIY3Jf5NuKxoGvV64zDSOECPPQ==", "dev": true, "requires": { "fbjs": "^0.8.16", "object-assign": "^4.1.1", "prop-types": "^15.6.0", - "react-is": "^16.3.2" - }, - "dependencies": { - "react-is": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.2.tgz", - "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==", - "dev": true - } + "react-is": "^16.4.1" } }, "read-pkg": { diff --git a/package.json b/package.json index 8f1b37571..22e495b3b 100644 --- a/package.json +++ b/package.json @@ -85,9 +85,9 @@ "eslint-plugin-react": "^7.9.1", "glob": "^7.1.1", "jest": "^23.1.0", - "react": "^16.3.2", - "react-dom": "^16.3.2", - "react-test-renderer": "^16.3.2", + "react": "^16.4.1", + "react-dom": "^16.4.1", + "react-test-renderer": "^16.4.1", "redux": "^4.0.0", "rimraf": "^2.6.2", "rollup": "^0.61.1", From eaa3284a3db031fa1e14558fb3018e61d64b13cd Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sat, 11 Aug 2018 23:59:46 -0400 Subject: [PATCH 04/14] prepare for react-testing-library --- package-lock.json | 269 ++++++++++++++++++++++++++++++++++++++-------- package.json | 2 + 2 files changed, 226 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 347944139..7d205b83a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2095,6 +2095,29 @@ "which": "^1.2.9" } }, + "css": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -2346,6 +2369,50 @@ } } }, + "dom-testing-library": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.3.0.tgz", + "integrity": "sha512-on5xM8U+UszlUAmdHVzUnjNIRxM57Sv2k25YFjUcG+aUktYwQG2LJ0HTe8yBkL0Yyfi3iS9xpHRw0y87O+imbA==", + "dev": true, + "requires": { + "mutationobserver-shim": "^0.3.2", + "pretty-format": "^22.4.3", + "wait-for-expect": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "wait-for-expect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-0.4.0.tgz", + "integrity": "sha512-itHoJUKL5P8abjhWRlp3F5QLDY7LokcJkgD78tjrX08ozBakfy9YD4bgxUVuSld8yqjza3ld6Sj7UMMOH/twFA==", + "dev": true + } + } + }, "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", @@ -3161,8 +3228,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.1.1", @@ -3228,7 +3294,6 @@ "version": "0.0.9", "bundled": true, "dev": true, - "optional": true, "requires": { "inherits": "~2.0.0" } @@ -3237,7 +3302,6 @@ "version": "2.10.1", "bundled": true, "dev": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -3254,8 +3318,7 @@ "buffer-shims": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "caseless": { "version": "0.12.0", @@ -3272,14 +3335,12 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "combined-stream": { "version": "1.0.5", "bundled": true, "dev": true, - "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -3292,20 +3353,17 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "cryptiles": { "version": "2.0.5", "bundled": true, "dev": true, - "optional": true, "requires": { "boom": "2.x.x" } @@ -3345,8 +3403,7 @@ "delayed-stream": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "delegates": { "version": "1.0.0", @@ -3378,8 +3435,7 @@ "extsprintf": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "forever-agent": { "version": "0.6.1", @@ -3407,7 +3463,6 @@ "version": "1.0.11", "bundled": true, "dev": true, - "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -3475,8 +3530,7 @@ "graceful-fs": { "version": "4.1.11", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "har-schema": { "version": "1.0.5", @@ -3504,7 +3558,6 @@ "version": "3.1.3", "bundled": true, "dev": true, - "optional": true, "requires": { "boom": "2.x.x", "cryptiles": "2.x.x", @@ -3552,7 +3605,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3566,8 +3618,7 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "isstream": { "version": "0.1.2", @@ -3640,14 +3691,12 @@ "mime-db": { "version": "1.27.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "mime-types": { "version": "2.1.15", "bundled": true, "dev": true, - "optional": true, "requires": { "mime-db": "~1.27.0" } @@ -3663,14 +3712,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -3725,8 +3772,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "oauth-sign": { "version": "0.8.2", @@ -3784,8 +3830,7 @@ "process-nextick-args": { "version": "1.0.7", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "punycode": { "version": "1.4.1", @@ -3823,7 +3868,6 @@ "version": "2.2.9", "bundled": true, "dev": true, - "optional": true, "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", @@ -3875,8 +3919,7 @@ "safe-buffer": { "version": "5.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "semver": { "version": "5.3.0", @@ -3900,7 +3943,6 @@ "version": "1.0.9", "bundled": true, "dev": true, - "optional": true, "requires": { "hoek": "2.x.x" } @@ -3934,7 +3976,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3945,7 +3986,6 @@ "version": "1.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -3960,7 +4000,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3975,7 +4014,6 @@ "version": "2.2.1", "bundled": true, "dev": true, - "optional": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -4031,8 +4069,7 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "uuid": { "version": "3.0.1", @@ -4433,6 +4470,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5188,6 +5231,104 @@ "detect-newline": "^2.1.0" } }, + "jest-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-1.12.0.tgz", + "integrity": "sha512-G8LplxieRJDOmTNJN2SzctewT9HoslclwzEW8znch98gSw5KeajIbporSqUuWHPRB8q8UQl0OI6AtUjGrNcniQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "css": "^2.2.3", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "pretty-format": "^23.0.1", + "redent": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "jest-each": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", @@ -6242,6 +6383,12 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mutationobserver-shim": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", + "integrity": "sha1-9NXa56SXGiIHkU+1qQ69UUtlrMo=", + "dev": true + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -7079,6 +7226,16 @@ "react-is": "^16.3.2" } }, + "react-testing-library": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-5.0.0.tgz", + "integrity": "sha512-blIVFDHj0j2klvcrudvz8BnMJ3xoGBBh2P0R70JTvlj7uH4rd3oSKcG0BeFolfbNahv6Gz2RZ+S3WCHg/iVSZA==", + "dev": true, + "requires": { + "dom-testing-library": "^3.1.0", + "wait-for-expect": "^1.0.0" + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -7168,6 +7325,16 @@ } } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "redux": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.0.tgz", @@ -8899,6 +9066,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -9680,6 +9853,12 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-for-expect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.0.0.tgz", + "integrity": "sha512-I6OlPKnd4qVdKJf1Gjx9M9qQjIk29rALoUkjwIKa9pNDCdzUuJTfaNv1mtsm2QdSvF0ZQogrWJMifTN1lUeXig==", + "dev": true + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", diff --git a/package.json b/package.json index 2237fee36..5ddbf66ad 100644 --- a/package.json +++ b/package.json @@ -89,10 +89,12 @@ "eslint-plugin-react": "^7.9.1", "glob": "^7.1.1", "jest": "^23.4.1", + "jest-dom": "^1.12.0", "npm-run": "^5.0.1", "react": "^16.3.2", "react-dom": "^16.3.2", "react-test-renderer": "^16.3.2", + "react-testing-library": "^5.0.0", "redux": "^4.0.0", "rimraf": "^2.6.2", "rollup": "^0.61.1", From 499aa63f7316a0abd60bc5080ab30097d10a173a Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 00:00:05 -0400 Subject: [PATCH 05/14] add wallaby.js for debugging using wallaby DO NOT REMOVE PLEASE TIM --- wallaby.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 wallaby.js diff --git a/wallaby.js b/wallaby.js new file mode 100644 index 000000000..011a89690 --- /dev/null +++ b/wallaby.js @@ -0,0 +1,23 @@ +module.exports = function(wallaby) { + return { + files: [ + { pattern: 'test/**/*.spec.js', ignore: true }, + 'src/**/*.js*', + 'test/getTestDeps.js' + ], + tests: [ + { pattern: 'node_modules/*', ignore: true, instrument: false }, + { pattern: 'test/react/**/*.spec.js', ignore: true, instrument: false }, + 'test/**/*.spec.js*', + ], + compilers: { + '**/*.js': wallaby.compilers.babel({ + babel: require('babel-core'), + }), + }, + env: { + type: 'node' + }, + testFramework: 'jest' + } +} From 0e2e1941ee27e8a4c57199d8fc867ad78da9ed30 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 00:00:25 -0400 Subject: [PATCH 06/14] begin work of moving from enzyme to rtl --- test/components/connect.spec.js | 292 +++++++++++++++----------------- 1 file changed, 137 insertions(+), 155 deletions(-) diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index 9d2c82822..65475df49 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -7,12 +7,34 @@ import ReactDOM from 'react-dom' import { createStore } from 'redux' import { createProvider, connect } from '../../src/index.js' import { TestRenderer, enzyme } from '../getTestDeps.js' +import * as rtl from 'react-testing-library' +import 'jest-dom/extend-expect' describe('React', () => { describe('connect', () => { + const propMapper = prop => { + switch (typeof prop) { + case 'object': + case 'boolean': + return JSON.stringify(prop) + case 'function': + if (prop.mine) { + return '[my function ' + prop.name + ']' + } + return '[function ' + prop.name + ']' + default: + return prop + } + } class Passthrough extends Component { render() { - return
+ return ( +
    + {Object.keys(this.props).map(prop => ( +
  • {propMapper(this.props[prop])}
  • + ))} +
+ ) } } @@ -72,24 +94,23 @@ describe('React', () => { container.forceUpdate() } + afterEach(() => rtl.cleanup()) + it('should receive the store in the context', () => { - const store = createStore(() => ({})) + const store = createStore(() => ({ hi: 'there' })) - @connect() + @connect(state => state) class Container extends Component { render() { return } } - const testRenderer = enzyme.mount( - - - - ) + const tester = rtl.render( + + ) - const container = testRenderer.find(Container) - expect(container.instance().context.store).toBe(store) + expect(tester.getByTestId('hi')).toHaveTextContent('there') }) it('should pass state and props to the given component', () => { @@ -99,26 +120,22 @@ describe('React', () => { hello: 'world' })) - @connect(({ foo, baz }) => ({ foo, baz })) + @connect(({ foo, baz }) => ({ foo, baz }), {}) class Container extends Component { render() { return } } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - const stub = testRenderer.find(Passthrough) - expect(stub.prop('pass')).toEqual('through') - expect(stub.prop('foo')).toEqual('bar') - expect(stub.prop('baz')).toEqual(42) - expect(stub.prop('hello')).toEqual(undefined) - expect(() => - testRenderer.find(Container) - ).not.toThrow() + expect(tester.getByTestId('pass')).toHaveTextContent('through') + expect(tester.getByTestId('foo')).toHaveTextContent('bar') + expect(tester.getByTestId('baz')).toHaveTextContent('42') + expect(tester.queryByTestId('hello')).toBe(null) }) it('should subscribe class components to the store changes', () => { @@ -131,32 +148,30 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - - expect(testRenderer.find(Passthrough).prop('string')).toBe('') + expect(tester.getByTestId('string')).toHaveTextContent('') store.dispatch({ type: 'APPEND', body: 'a' }) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') + expect(tester.getByTestId('string')).toHaveTextContent('a') store.dispatch({ type: 'APPEND', body: 'b' }) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('string')).toBe('ab') + expect(tester.getByTestId('string')).toHaveTextContent('ab') }) it('should subscribe pure function components to the store changes', () => { const store = createStore(stringBuilder) - let Container = connect( - state => ({ string: state }) + const Container = connect( + state => ({ string: state }), {} )(function Container(props) { - return + return }) const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - const testRenderer = enzyme.mount( + + const tester = rtl.render( @@ -164,26 +179,24 @@ describe('React', () => { expect(spy).toHaveBeenCalledTimes(0) spy.mockRestore() - expect(testRenderer.find(Passthrough).prop('string')).toBe('') + expect(tester.getByTestId('string')).toHaveTextContent('') store.dispatch({ type: 'APPEND', body: 'a' }) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') + expect(tester.getByTestId('string')).toHaveTextContent('a') store.dispatch({ type: 'APPEND', body: 'b' }) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('string')).toBe('ab') + expect(tester.getByTestId('string')).toHaveTextContent('ab') }) it('should retain the store\'s context', () => { const store = new ContextBoundStore(stringBuilder) let Container = connect( - state => ({ string: state }) + state => ({ string: state }), {} )(function Container(props) { return }) const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - const testRenderer = enzyme.mount( + const tester = rtl.render( @@ -191,16 +204,15 @@ describe('React', () => { expect(spy).toHaveBeenCalledTimes(0) spy.mockRestore() - expect(testRenderer.find(Passthrough).prop('string')).toBe('') + expect(tester.getByTestId('string')).toHaveTextContent('') store.dispatch({ type: 'APPEND', body: 'a' }) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') + expect(tester.getByTestId('string')).toHaveTextContent('a') }) it('should handle dispatches before componentDidMount', () => { const store = createStore(stringBuilder) - @connect(state => ({ string: state }) ) + @connect(state => ({ string: state }), {}) class Container extends Component { componentDidMount() { store.dispatch({ type: 'APPEND', body: 'a' }) @@ -210,15 +222,12 @@ describe('React', () => { return } } - - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - - const stub = testRenderer.find(Passthrough) - expect(stub.prop('string')).toBe('a') + expect(tester.getByTestId('string')).toHaveTextContent('a') }) it('should handle additional prop changes in addition to slice', () => { @@ -226,7 +235,7 @@ describe('React', () => { foo: 'bar' })) - @connect(state => state) + @connect(state => state, {}) class ConnectContainer extends Component { render() { return ( @@ -260,16 +269,16 @@ describe('React', () => { } } - const testRenderer = enzyme.mount() - const stub = testRenderer.find(Passthrough) - expect(stub.prop('foo')).toEqual('bar') - expect(stub.prop('pass')).toEqual('through') + const tester = rtl.render() + + expect(tester.getByTestId('foo')).toHaveTextContent('bar') + expect(tester.getByTestId('pass')).toHaveTextContent('through') }) it('should handle unexpected prop changes with forceUpdate()', () => { const store = createStore(() => ({})) - @connect(state => state) + @connect(state => state, {}) class ConnectContainer extends Component { render() { return ( @@ -299,9 +308,9 @@ describe('React', () => { } } - const testRenderer = enzyme.mount() - const stub = testRenderer.find(Passthrough) - expect(stub.prop('bar')).toEqual('foo') + const tester = rtl.render() + + expect(tester.getByTestId('bar')).toHaveTextContent('foo') }) it('should remove undefined props', () => { @@ -326,21 +335,18 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( container = instance} /> ) - expect(testRenderer.find(Passthrough).instance().props).toEqual({ - x: true - }) + expect(tester.getByTestId('x')).toHaveTextContent('true') props = {} container.forceUpdate() - expect(testRenderer.find(Passthrough).instance().props).toEqual({ - }) + expect(tester.queryByTestId('x')).toBe(null) }) it('should remove undefined props without mapDispatch', () => { @@ -365,30 +371,21 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( container = instance} /> ) - const propsBefore = { - ...testRenderer.find(Passthrough).instance().props - } + expect(tester.getAllByTitle('prop').length).toBe(2) + expect(tester.getByTestId('dispatch')).toHaveTextContent('[function dispatch]') + expect(tester.getByTestId('x')).toHaveTextContent('true') props = {} container.forceUpdate() - const propsAfter = { - ...testRenderer.find(Passthrough).instance().props - } - - expect(propsBefore).toEqual({ - dispatch: store.dispatch, - x: true - }) - expect(propsAfter).toEqual({ - dispatch: store.dispatch, - }, 'x prop must be removed') + expect(tester.getAllByTitle('prop').length).toBe(1) + expect(tester.getByTestId('dispatch')).toHaveTextContent('[function dispatch]') }) it('should ignore deep mutations in props', () => { @@ -433,10 +430,9 @@ describe('React', () => { } } - const testRenderer = enzyme.mount() - const stub = testRenderer.find(Passthrough) - expect(stub.prop('foo')).toEqual('bar') - expect(stub.prop('pass')).toEqual('') + const tester = rtl.render() + expect(tester.getByTestId('foo')).toHaveTextContent('bar') + expect(tester.getByTestId('pass')).toHaveTextContent('') }) it('should allow for merge to incorporate state and prop changes', () => { @@ -449,6 +445,8 @@ describe('React', () => { } } + let merged + let externalSetState @connect( state => ({ stateThing: state }), dispatch => ({ @@ -457,10 +455,13 @@ describe('React', () => { (stateProps, actionProps, parentProps) => ({ ...stateProps, ...actionProps, - mergedDoSomething(thing) { - const seed = stateProps.stateThing === '' ? 'HELLO ' : '' - actionProps.doSomething(seed + thing + parentProps.extra) - } + mergedDoSomething: (() => { + merged = function mergedDoSomething(thing) { + const seed = stateProps.stateThing === '' ? 'HELLO ' : '' + actionProps.doSomething(seed + thing + parentProps.extra) + } + return merged + })() }) ) class Container extends Component { @@ -473,6 +474,7 @@ describe('React', () => { constructor() { super() this.state = { extra: 'z' } + externalSetState = this.setState.bind(this) } render() { @@ -484,25 +486,23 @@ describe('React', () => { } } - const testRenderer = enzyme.mount() - const stub = () => testRenderer.find(Passthrough) - expect(stub().prop('stateThing')).toBe('') - stub().prop('mergedDoSomething')('a') - testRenderer.update() - expect(stub().prop('stateThing')).toBe('HELLO az') - stub().prop('mergedDoSomething')('b') - testRenderer.update() - expect(stub().prop('stateThing')).toBe('HELLO azbz') - testRenderer.setState({ extra: 'Z' }) - stub().prop('mergedDoSomething')('c') - testRenderer.update() - expect(stub().prop('stateThing')).toBe('HELLO azbzcZ') + const tester = rtl.render() + + expect(tester.getByTestId('stateThing')).toHaveTextContent('') + merged('a') + expect(tester.getByTestId('stateThing')).toHaveTextContent('HELLO az') + merged('b') + expect(tester.getByTestId('stateThing')).toHaveTextContent('HELLO azbz') + externalSetState({ extra: 'Z' }) + merged('c') + expect(tester.getByTestId('stateThing')).toHaveTextContent('HELLO azbzcZ') }) it('should merge actionProps into WrappedComponent', () => { const store = createStore(() => ({ foo: 'bar' })) + store.dispatch.mine = 'hi' @connect( state => state, @@ -514,25 +514,21 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - const stub = testRenderer.find(Passthrough) - expect(stub.prop('dispatch')).toEqual(store.dispatch) - expect(stub.prop('foo')).toEqual('bar') - expect(() => - testRenderer.find(Container) - ).not.toThrow() - const decorated = testRenderer.find(Container) - expect(decorated.instance().isSubscribed()).toBe(true) + + expect(tester.getByTestId('dispatch')).toHaveTextContent('[my function dispatch]') + expect(tester.getByTestId('foo')).toHaveTextContent('bar') }) it('should not invoke mapState when props change if it only has one argument', () => { const store = createStore(stringBuilder) let invocationCount = 0 + let setFoo /*eslint-disable no-unused-vars */ @connect((arg1) => { @@ -566,7 +562,7 @@ describe('React', () => { } let outerComponent - enzyme.mount( + rtl.render( outerComponent = c} /> @@ -613,7 +609,7 @@ describe('React', () => { } let outerComponent - enzyme.mount( + rtl.render( outerComponent = c} /> @@ -661,7 +657,7 @@ describe('React', () => { } let outerComponent - enzyme.mount( + rtl.render( outerComponent = c} /> @@ -713,7 +709,7 @@ describe('React', () => { } let outerComponent - enzyme.mount( + rtl.render( outerComponent = c} /> @@ -761,7 +757,7 @@ describe('React', () => { } let outerComponent - enzyme.mount( + rtl.render( outerComponent = c} /> @@ -810,7 +806,7 @@ describe('React', () => { } let outerComponent - enzyme.mount( + rtl.render( outerComponent = c} /> @@ -829,6 +825,7 @@ describe('React', () => { const store = createStore(() => ({ foo: 'bar' })) + store.dispatch.mine = 'hi' function runCheck(...connectArgs) { @connect(...connectArgs) @@ -838,20 +835,14 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - const stub = testRenderer.find(Passthrough) - expect(stub.prop('dispatch')).toEqual(store.dispatch) - expect(stub.prop('foo')).toBe(undefined) - expect(stub.prop('pass')).toEqual('through') - expect(() => - testRenderer.find(Container) - ).not.toThrow() - const decorated = testRenderer.find(Container) - expect(decorated.instance().isSubscribed()).toBe(false) + expect(tester.getByTestId('dispatch')).toHaveTextContent('[my function dispatch]') + expect(tester.queryByTestId('foo')).toBe(null) + expect(tester.getByTestId('pass')).toHaveTextContent('through') } runCheck() @@ -1108,15 +1099,13 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - - const stub = testRenderer.find(Passthrough) expect(spy).toHaveBeenCalledTimes(1) - expect(stub.prop('string')).toBe('') + expect(tester.getByTestId('string')).toHaveTextContent('') store.dispatch({ type: 'APPEND', body: 'a' }) expect(spy).toHaveBeenCalledTimes(2) store.dispatch({ type: 'APPEND', body: 'b' }) @@ -1128,6 +1117,7 @@ describe('React', () => { it('should shallowly compare the merged state to prevent unnecessary updates', () => { const store = createStore(stringBuilder) const spy = jest.fn(() => ({})) + const tree = {} function render({ string, pass }) { spy() return @@ -1152,6 +1142,7 @@ describe('React', () => { constructor(props) { super(props) this.state = { pass: '' } + tree.setState = this.setState.bind(this) } render() { @@ -1163,62 +1154,53 @@ describe('React', () => { } } - const testRenderer = enzyme.mount() - const tree = testRenderer.instance() + const tester = rtl.render() expect(spy).toHaveBeenCalledTimes(1) - expect(testRenderer.find(Passthrough).prop('string')).toBe('') - expect(testRenderer.find(Passthrough).prop('pass')).toBe('') + expect(tester.getByTestId('string')).toHaveTextContent('') + expect(tester.getByTestId('pass')).toHaveTextContent('') store.dispatch({ type: 'APPEND', body: 'a' }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(2) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('pass')).toBe('') + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('') tree.setState({ pass: '' }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(2) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('pass')).toBe('') + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('') tree.setState({ pass: 'through' }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(3) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('pass')).toBe('through') + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('through') tree.setState({ pass: 'through' }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(3) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('pass')).toBe('through') + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('through') const obj = { prop: 'val' } tree.setState({ pass: obj }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(4) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('pass')).toBe(obj) + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('{"prop":"val"}') tree.setState({ pass: obj }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(4) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('pass')).toBe(obj) + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('{"prop":"val"}') const obj2 = Object.assign({}, obj, { val: 'otherval' }) tree.setState({ pass: obj2 }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(5) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('pass')).toBe(obj2) + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('{"prop":"val","val":"otherval"}') obj2.val = 'mutation' tree.setState({ pass: obj2 }) - testRenderer.update() expect(spy).toHaveBeenCalledTimes(5) - expect(testRenderer.find(Passthrough).prop('string')).toBe('a') - expect(testRenderer.find(Passthrough).prop('passVal')).toBe('otherval') + expect(tester.getByTestId('string')).toHaveTextContent('a') + expect(tester.getByTestId('pass')).toHaveTextContent('{"prop":"val","val":"otherval"}') }) it('should throw an error if a component is not passed to the function returned by connect', () => { From 1e0ad89cb9d30f3f8f53b244f375e2d898edd930 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 00:06:01 -0400 Subject: [PATCH 07/14] convert more tests to rtl --- test/components/connect.spec.js | 51 ++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index 65475df49..c322bce20 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -1225,7 +1225,7 @@ describe('React', () => { function AwesomeMap() { } let spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => 1, () => ({}), () => ({}))} @@ -1235,9 +1235,10 @@ describe('React', () => { /mapStateToProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => 'hey', () => ({}), () => ({}))} @@ -1247,9 +1248,10 @@ describe('React', () => { /mapStateToProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => new AwesomeMap(), () => ({}), () => ({}))} @@ -1259,9 +1261,10 @@ describe('React', () => { /mapStateToProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => ({}), () => 1, () => ({}))} @@ -1271,9 +1274,10 @@ describe('React', () => { /mapDispatchToProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => ({}), () => 'hey', () => ({}))} @@ -1283,9 +1287,10 @@ describe('React', () => { /mapDispatchToProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => ({}), () => new AwesomeMap(), () => ({}))} @@ -1295,9 +1300,10 @@ describe('React', () => { /mapDispatchToProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => ({}), () => ({}), () => 1)} @@ -1307,9 +1313,10 @@ describe('React', () => { /mergeProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => ({}), () => ({}), () => 'hey')} @@ -1319,9 +1326,10 @@ describe('React', () => { /mergeProps\(\) in Connect\(Container\) must return a plain object/ ) spy.mockRestore() + rtl.cleanup() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - enzyme.mount( + rtl.render( {makeContainer(() => ({}), () => ({}), () => new AwesomeMap())} @@ -1373,23 +1381,21 @@ describe('React', () => { } let container - const testRenderer = enzyme.mount( + const tester = rtl.render( container = instance} /> ) - expect(testRenderer.find(Passthrough).prop('foo')).toEqual(undefined) - expect(testRenderer.find(Passthrough).prop('scooby')).toEqual('doo') + expect(tester.queryByTestId('foo')).toBe(null) + expect(tester.getByTestId('scooby')).toHaveTextContent('doo') imitateHotReloading(ContainerBefore, ContainerAfter, container) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('foo')).toEqual('baz') - expect(testRenderer.find(Passthrough).prop('scooby')).toEqual('foo') + expect(tester.getByTestId('foo')).toHaveTextContent('baz') + expect(tester.getByTestId('scooby')).toHaveTextContent('foo') imitateHotReloading(ContainerBefore, ContainerNext, container) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('foo')).toEqual('bar') - expect(testRenderer.find(Passthrough).prop('scooby')).toEqual('boo') + expect(tester.getByTestId('foo')).toHaveTextContent('bar') + expect(tester.getByTestId('scooby')).toHaveTextContent('boo') }) it('should persist listeners through hot update', () => { @@ -1438,7 +1444,7 @@ describe('React', () => { } let container - const testRenderer = enzyme.mount( + const tester = rtl.render( container = instance}/> @@ -1447,9 +1453,8 @@ describe('React', () => { imitateHotReloading(ParentBefore, ParentAfter, container) store.dispatch({type: ACTION_TYPE}) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('actions')).toEqual(1) + expect(tester.getByTestId('actions')).toHaveTextContent('1') }) it('should set the displayName correctly', () => { @@ -1535,7 +1540,7 @@ describe('React', () => { getState: () => expectedState } - enzyme.mount() + rtl.render() expect(actualState).toEqual(expectedState) }) @@ -1553,7 +1558,7 @@ describe('React', () => { const Decorated = decorator(Container) expect(() => - enzyme.mount() + rtl.render() ).toThrow( /Could not find "store"/ ) From 545f53d816c1e3e8369dfd76c0983a404c0f8e04 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 09:21:57 -0400 Subject: [PATCH 08/14] fully convert to rtl, remove enzyme and test renderer deps --- test/components/connect.spec.js | 118 ++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 52 deletions(-) diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index c322bce20..d70078520 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -6,7 +6,6 @@ import PropTypes from 'prop-types' import ReactDOM from 'react-dom' import { createStore } from 'redux' import { createProvider, connect } from '../../src/index.js' -import { TestRenderer, enzyme } from '../getTestDeps.js' import * as rtl from 'react-testing-library' import 'jest-dom/extend-expect' @@ -1578,19 +1577,24 @@ describe('React', () => { const decorator = connect(state => state) const Decorated = decorator(Container) - const testRenderer = enzyme.mount( + class Wrapper extends Component { + render() { + return ( + comp.getWrappedInstance()}/> + ) + } + } + + expect(() => rtl.render( - + - ) - - const decorated = testRenderer.find(Decorated) - expect(() => decorated.instance().getWrappedInstance()).toThrow( + )).toThrow( /To access the wrapped instance, you need to specify \{ withRef: true \} in the options argument of the connect\(\) call\./ ) }) - it('should return the instance of the wrapped component for use in calling child methods', () => { + it('should return the instance of the wrapped component for use in calling child methods', async (done) => { const store = createStore(() => ({})) const someData = { @@ -1603,24 +1607,36 @@ describe('React', () => { } render() { - return + return } } const decorator = connect(state => state, null, null, { withRef: true }) const Decorated = decorator(Container) - const testRenderer = enzyme.mount( + let ref + + class Wrapper extends Component { + render() { + return ( + { + if (!comp) return + ref = comp.getWrappedInstance() + }}/> + ) + } + } + + const tester = rtl.render( - + ) - const decorated = testRenderer.find(Decorated) + await rtl.waitForElement(() => tester.getByTestId('loaded')) - expect(() => decorated.someInstanceMethod()).toThrow() - expect(decorated.instance().getWrappedInstance().someInstanceMethod()).toBe(someData) - expect(decorated.instance().wrappedInstance.someInstanceMethod()).toBe(someData) + expect(ref.someInstanceMethod()).toBe(someData) + done() }) it('should wrap impure components without supressing updates', () => { @@ -1639,10 +1655,12 @@ describe('React', () => { const decorator = connect(state => state, null, null, { pure: false }) const Decorated = decorator(ImpureComponent) + let externalSetState class StatefulWrapper extends Component { constructor() { super() this.state = { value: 0 } + externalSetState = this.setState.bind(this) } getChildContext() { @@ -1660,18 +1678,15 @@ describe('React', () => { statefulValue: PropTypes.number } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - const target = testRenderer.find(Passthrough) - const wrapper = testRenderer.find(StatefulWrapper).instance() - expect(target.prop('statefulValue')).toEqual(0) - wrapper.setState({ value: 1 }) - testRenderer.update() - expect(testRenderer.find(Passthrough).prop('statefulValue')).toEqual(1) + expect(tester.getByTestId('statefulValue')).toHaveTextContent('0') + externalSetState({ value: 1 }) + expect(tester.getByTestId('statefulValue')).toHaveTextContent('1') }) it('calls mapState and mapDispatch for impure components', () => { @@ -1700,12 +1715,16 @@ describe('React', () => { ) const Decorated = decorator(ImpureComponent) + let externalSetState + let storeGetter class StatefulWrapper extends Component { constructor() { super() + storeGetter = { storeKey: 'foo' } this.state = { - storeGetter: { storeKey: 'foo' } + storeGetter } + externalSetState = this.setState.bind(this) } render() { return @@ -1713,28 +1732,23 @@ describe('React', () => { } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - const target = testRenderer.find(Passthrough) - const wrapper = testRenderer.find(StatefulWrapper).instance() - expect(mapStateSpy).toHaveBeenCalledTimes(2) expect(mapDispatchSpy).toHaveBeenCalledTimes(2) - expect(target.prop('statefulValue')).toEqual('foo') + expect(tester.getByTestId('statefulValue')).toHaveTextContent('foo') // Impure update - const storeGetter = wrapper.state.storeGetter storeGetter.storeKey = 'bar' - wrapper.setState({ storeGetter }) - testRenderer.update() + externalSetState({ storeGetter }) expect(mapStateSpy).toHaveBeenCalledTimes(3) expect(mapDispatchSpy).toHaveBeenCalledTimes(3) - expect(testRenderer.find(Passthrough).prop('statefulValue')).toEqual('bar') + expect(tester.getByTestId('statefulValue')).toHaveTextContent('bar') }) it('should pass state consistently to mapState', () => { @@ -1772,7 +1786,7 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( @@ -1787,8 +1801,8 @@ describe('React', () => { expect(childMapStateInvokes).toBe(2) // setState calls DOM handlers are batched - const button = testRenderer.find('button') - button.prop('onClick')() + const button = tester.getByText('change') + rtl.fireEvent.click(button) expect(childMapStateInvokes).toBe(3) store.dispatch({ type: 'APPEND', body: 'd' }) @@ -1811,7 +1825,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render( @@ -1844,7 +1858,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render( @@ -1894,7 +1908,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render( @@ -1937,7 +1951,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render(
@@ -1973,7 +1987,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render(
@@ -2037,7 +2051,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render( @@ -2061,7 +2075,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render( @@ -2097,7 +2111,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render( @@ -2176,7 +2190,7 @@ describe('React', () => { } } - enzyme.mount( + rtl.render( @@ -2192,7 +2206,7 @@ describe('React', () => { const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) try { - enzyme.mount( + rtl.render( @@ -2253,7 +2267,7 @@ describe('React', () => { } const store = createStore((state = 0, action) => (action.type === 'INC' ? state + 1 : state)) - enzyme.mount() + rtl.render() expect(mapStateToProps).toHaveBeenCalledTimes(1) store.dispatch({ type: 'INC' }) @@ -2275,7 +2289,7 @@ describe('React', () => { class C extends React.Component { render() { return
{this.props.count}
}} const store = createStore((state = 0, action) => (action.type === 'INC' ? state += 1 : state)) - enzyme.mount(
) + rtl.render() store.dispatch({ type: 'INC' }) }) @@ -2307,7 +2321,7 @@ describe('React', () => { render() { return
{this.props.count}
} } - enzyme.mount(
) + rtl.render() expect(mapStateToPropsB).toHaveBeenCalledTimes(1) expect(mapStateToPropsC).toHaveBeenCalledTimes(1) expect(mapStateToPropsD).toHaveBeenCalledTimes(1) @@ -2337,7 +2351,7 @@ describe('React', () => { } } - TestRenderer.create( + rtl.render( @@ -2350,6 +2364,7 @@ describe('React', () => { it('should receive the store in the context using a custom store key', () => { const store = createStore(() => ({})) + store.dispatch.mine = 'hi' const CustomProvider = createProvider('customStoreKey') const connectOptions = { storeKey: 'customStoreKey' } @@ -2360,14 +2375,13 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( ) - const container = testRenderer.find(Container) - expect(container.instance().store).toBe(store) + expect(tester.getByTestId('dispatch')).toHaveTextContent('[my function dispatch]') }) }) }) From 5333b40026dabee7171b3cd447cba6cec3689e15 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 09:56:06 -0400 Subject: [PATCH 09/14] fix error in test --- test/components/connect.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index d70078520..4b4f0d595 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -1580,7 +1580,7 @@ describe('React', () => { class Wrapper extends Component { render() { return ( - comp.getWrappedInstance()}/> + comp && comp.getWrappedInstance()}/> ) } } From a47b64cac2689f72ff6b85acd9f7d1c71581c37b Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 09:56:24 -0400 Subject: [PATCH 10/14] convert to rtl --- test/components/Provider.spec.js | 104 +++++++++++++++++-------------- 1 file changed, 57 insertions(+), 47 deletions(-) diff --git a/test/components/Provider.spec.js b/test/components/Provider.spec.js index 5c7080bf6..039d9e2a9 100644 --- a/test/components/Provider.spec.js +++ b/test/components/Provider.spec.js @@ -5,22 +5,28 @@ import PropTypes from 'prop-types' import semver from 'semver' import { createStore } from 'redux' import { Provider, createProvider, connect } from '../../src/index.js' -import { TestRenderer, enzyme } from '../getTestDeps.js' +import * as rtl from 'react-testing-library' +import 'jest-dom/extend-expect' describe('React', () => { describe('Provider', () => { - const createChild = (storeKey = 'store') => { - class Child extends Component { - render() { - return
- } + afterEach(() => rtl.cleanup()) + const createChild = (storeKey = 'store') => { + class Child extends Component { + render() { + return ( +
+ {storeKey} - {this.context[storeKey] && this.context[storeKey].mine ? this.context[storeKey].mine : ''} +
+ ) } + } - Child.contextTypes = { - [storeKey]: PropTypes.object.isRequired - } + Child.contextTypes = { + [storeKey]: PropTypes.object.isRequired + } - return Child + return Child } const Child = createChild(); @@ -34,33 +40,33 @@ describe('React', () => { const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) try { - expect(() => enzyme.mount( + expect(() => rtl.render(
)).not.toThrow() if (semver.lt(React.version, '15.0.0')) { - expect(() => enzyme.mount( + expect(() => rtl.render( )).toThrow(/children with exactly one child/) } else { - expect(() => enzyme.mount( + expect(() => rtl.render( )).toThrow(/a single React element child/) } if (semver.lt(React.version, '15.0.0')) { - expect(() => enzyme.mount( + expect(() => rtl.render(
)).toThrow(/children with exactly one child/) } else { - expect(() => enzyme.mount( + expect(() => rtl.render(
@@ -75,47 +81,52 @@ describe('React', () => { it('should add the store to the child context', () => { const store = createStore(() => ({})) + store.mine = 'hi' const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - const testRenderer = enzyme.mount( + const tester = rtl.render( ) expect(spy).toHaveBeenCalledTimes(0) spy.mockRestore() - - const child = testRenderer.find(Child).instance() - expect(child.context.store).toBe(store) + + expect(tester.getByTestId('store')).toHaveTextContent('store - hi') }) it('should add the store to the child context using a custom store key', () => { - const store = createStore(() => ({})) - const CustomProvider = createProvider('customStoreKey'); - const CustomChild = createChild('customStoreKey'); - - const spy = jest.spyOn(console, 'error').mockImplementation(() => {}); - const testRenderer = enzyme.mount( - - - - ) - expect(spy).toHaveBeenCalledTimes(0) - spy.mockRestore() + const store = createStore(() => ({})) + store.mine = 'hi' + const CustomProvider = createProvider('customStoreKey'); + const CustomChild = createChild('customStoreKey'); + + const spy = jest.spyOn(console, 'error').mockImplementation(() => {}); + const tester = rtl.render( + + + + ) + expect(spy).toHaveBeenCalledTimes(0) + spy.mockRestore() - const child = testRenderer.find(CustomChild).instance() - expect(child.context.customStoreKey).toBe(store) + expect(tester.getByTestId('store')).toHaveTextContent('customStoreKey - hi') }) it('should warn once when receiving a new store in props', () => { const store1 = createStore((state = 10) => state + 1) + store1.mine = '1' const store2 = createStore((state = 10) => state * 2) + store2.mine = '2' const store3 = createStore((state = 10) => state * state) + store3.mine = '3' + let externalSetState class ProviderContainer extends Component { constructor() { super() this.state = { store: store1 } + externalSetState = this.setState.bind(this) } render() { return ( @@ -126,14 +137,13 @@ describe('React', () => { } } - const testRenderer = enzyme.mount() - const child = testRenderer.find(Child).instance() - expect(child.context.store.getState()).toEqual(11) + const tester = rtl.render() + expect(tester.getByTestId('store')).toHaveTextContent('store - 1') let spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - testRenderer.setState({ store: store2 }) - - expect(child.context.store.getState()).toEqual(11) + externalSetState({ store: store2 }) + + expect(tester.getByTestId('store')).toHaveTextContent('store - 1') expect(spy).toHaveBeenCalledTimes(1) expect(spy.mock.calls[0][0]).toBe( ' does not support changing `store` on the fly. ' + @@ -145,9 +155,9 @@ describe('React', () => { spy.mockRestore() spy = jest.spyOn(console, 'error').mockImplementation(() => {}) - testRenderer.setState({ store: store3 }) - - expect(child.context.store.getState()).toEqual(11) + externalSetState({ store: store3 }) + + expect(tester.getByTestId('store')).toHaveTextContent('store - 1') expect(spy).toHaveBeenCalledTimes(0) spy.mockRestore() }) @@ -168,7 +178,7 @@ describe('React', () => { render() { return } } - enzyme.mount() + rtl.render() expect(innerMapStateToProps).toHaveBeenCalledTimes(1) innerStore.dispatch({ type: 'INC'}) @@ -216,7 +226,7 @@ describe('React', () => { } } - const testRenderer = enzyme.mount( + const tester = rtl.render( @@ -229,8 +239,8 @@ describe('React', () => { expect(childMapStateInvokes).toBe(2) // setState calls DOM handlers are batched - const button = testRenderer.find('button') - button.prop('onClick')() + const button = tester.getByText('change') + rtl.fireEvent.click(button) expect(childMapStateInvokes).toBe(3) // Provider uses unstable_batchedUpdates() under the hood @@ -245,7 +255,7 @@ describe('React', () => { const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) const store = createStore(() => ({})) - TestRenderer.create( + rtl.render(
From 77d4fa3e44d08ab377e996297023b711f8409f28 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 10:00:26 -0400 Subject: [PATCH 11/14] update testing infrastructure --- test/install-test-deps.js | 6 +- test/react/0.14/package-lock.json | 536 +++++++++--------------------- test/react/0.14/package.json | 6 +- test/react/15/package-lock.json | 504 +++++++++------------------- test/react/15/package.json | 5 +- test/react/16.2/package-lock.json | 513 +++++++++------------------- test/react/16.2/package.json | 5 +- test/react/16.3/package-lock.json | 520 +++++++++-------------------- test/react/16.3/package.json | 5 +- test/react/16.4/package-lock.json | 520 +++++++++-------------------- test/react/16.4/package.json | 5 +- 11 files changed, 788 insertions(+), 1837 deletions(-) diff --git a/test/install-test-deps.js b/test/install-test-deps.js index a5be46af6..7ff9e2471 100644 --- a/test/install-test-deps.js +++ b/test/install-test-deps.js @@ -27,12 +27,12 @@ readdirSync(join(__dirname, 'react')).forEach(version => { join(__dirname, 'react', version, 'src', 'connect'), join(__dirname, 'react', version, 'src', 'utils'), ] + if (!existsSync(join(__dirname, 'react', version, 'test'))) { + throw new Error(`react version ${version}'s "test" directory is missing, cannot run tests`) + } if (!existsSync(join(__dirname, 'react', version, 'src'))) { mkdirSync(join(__dirname, 'react', version, 'src')) } - if (!existsSync(join(__dirname, 'react', version))) { - throw new Error(`getTestDeps.js is missing from react version ${version}'s "test" directory, cannot run tests`) - } console.log('Copying test files') tests.forEach((dir, i) => { if (existsSync(dest[i])) { diff --git a/test/react/0.14/package-lock.json b/test/react/0.14/package-lock.json index 68c5a4966..1331318ca 100644 --- a/test/react/0.14/package-lock.json +++ b/test/react/0.14/package-lock.json @@ -30,12 +30,6 @@ } } }, - "@types/node": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.4.tgz", - "integrity": "sha512-8TqvB0ReZWwtcd3LXq3YSrBoLyXFgBX/sBZfGye9+YS8zH7/g+i6QRIuiDmwBoTzcQ/pk89nZYTYU4c5akKkzw==", - "dev": true - }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -624,12 +618,6 @@ "tweetnacl": "^0.14.3" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -765,20 +753,6 @@ "supports-color": "^5.3.0" } }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", @@ -845,12 +819,6 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -970,24 +938,29 @@ "which": "^1.2.9" } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "css": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } } }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -1175,36 +1148,41 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dom-testing-library": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.3.0.tgz", + "integrity": "sha512-on5xM8U+UszlUAmdHVzUnjNIRxM57Sv2k25YFjUcG+aUktYwQG2LJ0HTe8yBkL0Yyfi3iS9xpHRw0y87O+imbA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "mutationobserver-shim": "^0.3.2", + "pretty-format": "^22.4.3", + "wait-for-expect": "^0.4.0" }, "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "wait-for-expect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-0.4.0.tgz", + "integrity": "sha512-itHoJUKL5P8abjhWRlp3F5QLDY7LokcJkgD78tjrX08ozBakfy9YD4bgxUVuSld8yqjza3ld6Sj7UMMOH/twFA==", "dev": true } } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1214,25 +1192,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1253,12 +1212,6 @@ "iconv-lite": "~0.4.13" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, "envify": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.1.tgz", @@ -1269,53 +1222,6 @@ "through": "~2.3.4" } }, - "enzyme": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", - "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", - "dev": true, - "requires": { - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.0.3", - "has": "^1.0.1", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash": "^4.17.4", - "object-inspect": "^1.5.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" - } - }, - "enzyme-adapter-react-14": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-14/-/enzyme-adapter-react-14-1.0.6.tgz", - "integrity": "sha512-r29GLbJdaoZt2WfZpEj4KMZGuD2jkKaN/wzT4x+mkw0j85uJt8hm1MUfIAAV2yCdsQjBWPQZQgXjTvPQS66cww==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.4.0", - "object.assign": "^4.1.0", - "object.values": "^1.0.4", - "prop-types": "^15.6.0", - "react-is": "^16.4.1" - } - }, - "enzyme-adapter-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", - "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", - "dev": true, - "requires": { - "object.assign": "^4.1.0", - "prop-types": "^15.6.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2319,17 +2225,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -2467,12 +2362,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2530,20 +2419,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2580,6 +2455,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2626,12 +2507,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -2765,12 +2640,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2807,18 +2676,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -3243,6 +3100,75 @@ "detect-newline": "^2.1.0" } }, + "jest-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-1.12.0.tgz", + "integrity": "sha512-G8LplxieRJDOmTNJN2SzctewT9HoslclwzEW8znch98gSw5KeajIbporSqUuWHPRB8q8UQl0OI6AtUjGrNcniQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "css": "^2.2.3", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "pretty-format": "^23.0.1", + "redent": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + } + } + }, "jest-each": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", @@ -3858,12 +3784,6 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -4082,18 +4002,18 @@ "minimist": "0.0.8" } }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mutationobserver-shim": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", + "integrity": "sha1-9NXa56SXGiIHkU+1qQ69UUtlrMo=", + "dev": true + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -4134,19 +4054,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nearley": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.0.tgz", - "integrity": "sha512-ZjzdO+yBtMrRrBbr+BJ35ECla6PGCAb/6hqpBQe7bmhEJabQ4rpVdj4sadP1Z1jQGyaDmm1GciQWsGVxIZ3uJA==", - "dev": true, - "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -4175,16 +4082,6 @@ "which": "^1.3.0" } }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -4215,15 +4112,6 @@ "path-key": "^2.0.0" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -4270,18 +4158,6 @@ } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -4297,30 +4173,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -4350,18 +4202,6 @@ "isobject": "^3.0.1" } }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4466,15 +4306,6 @@ "error-ex": "^1.2.0" } }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4639,24 +4470,6 @@ "sisteransi": "^0.1.1" } }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "dev": true, - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } - } - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -4687,31 +4500,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randomatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", @@ -4747,40 +4535,20 @@ "fbjs": "^0.6.1" } }, - "react-addons-test-utils": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-0.14.8.tgz", - "integrity": "sha1-3N3AOecfw8gdgDOOU6NxTxTUHh8=", - "dev": true - }, "react-dom": { "version": "0.14.9", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.9.tgz", "integrity": "sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM=", "dev": true }, - "react-is": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", - "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", - "dev": true - }, - "react-test-renderer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-1.1.0.tgz", - "integrity": "sha1-D6o1os1xoUmaHj1yJno0/LHjUO8=", + "react-testing-library": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-5.0.0.tgz", + "integrity": "sha512-blIVFDHj0j2klvcrudvz8BnMJ3xoGBBh2P0R70JTvlj7uH4rd3oSKcG0BeFolfbNahv6Gz2RZ+S3WCHg/iVSZA==", "dev": true, "requires": { - "object-assign": "^4.1.0", - "react-addons-test-utils": "^0.14.0 || ^15.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } + "dom-testing-library": "^3.1.0", + "wait-for-expect": "^1.0.0" } }, "read-pkg": { @@ -4854,6 +4622,16 @@ } } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -5051,16 +4829,6 @@ } } }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -5547,6 +5315,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -5803,12 +5577,6 @@ "dev": true, "optional": true }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5948,6 +5716,12 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-for-expect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.0.0.tgz", + "integrity": "sha512-I6OlPKnd4qVdKJf1Gjx9M9qQjIk29rALoUkjwIKa9pNDCdzUuJTfaNv1mtsm2QdSvF0ZQogrWJMifTN1lUeXig==", + "dev": true + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", diff --git a/test/react/0.14/package.json b/test/react/0.14/package.json index a259a3afe..272fcf248 100644 --- a/test/react/0.14/package.json +++ b/test/react/0.14/package.json @@ -2,13 +2,11 @@ "private": true, "devDependencies": { "create-react-class": "^15.6.3", - "enzyme": "^3.3.0", - "enzyme-adapter-react-14": "^1.0.6", "jest": "^23.4.2", + "jest-dom": "^1.12.0", "react": "^0.14.9", - "react-addons-test-utils": "^0.14.8", "react-dom": "^0.14.8", - "react-test-renderer": "^1" + "react-testing-library": "^5.0.0" }, "jest": { "testURL": "http://localhost", diff --git a/test/react/15/package-lock.json b/test/react/15/package-lock.json index 4e22b2c46..7151faddc 100644 --- a/test/react/15/package-lock.json +++ b/test/react/15/package-lock.json @@ -30,12 +30,6 @@ } } }, - "@types/node": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.4.tgz", - "integrity": "sha512-8TqvB0ReZWwtcd3LXq3YSrBoLyXFgBX/sBZfGye9+YS8zH7/g+i6QRIuiDmwBoTzcQ/pk89nZYTYU4c5akKkzw==", - "dev": true - }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -594,12 +588,6 @@ "tweetnacl": "^0.14.3" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -742,20 +730,6 @@ "supports-color": "^5.3.0" } }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", @@ -843,12 +817,6 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -922,24 +890,29 @@ "which": "^1.2.9" } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "css": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } } }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -1103,36 +1076,41 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dom-testing-library": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.3.0.tgz", + "integrity": "sha512-on5xM8U+UszlUAmdHVzUnjNIRxM57Sv2k25YFjUcG+aUktYwQG2LJ0HTe8yBkL0Yyfi3iS9xpHRw0y87O+imbA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "mutationobserver-shim": "^0.3.2", + "pretty-format": "^22.4.3", + "wait-for-expect": "^0.4.0" }, "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "wait-for-expect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-0.4.0.tgz", + "integrity": "sha512-itHoJUKL5P8abjhWRlp3F5QLDY7LokcJkgD78tjrX08ozBakfy9YD4bgxUVuSld8yqjza3ld6Sj7UMMOH/twFA==", "dev": true } } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1142,25 +1120,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1181,59 +1140,6 @@ "iconv-lite": "~0.4.13" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "enzyme": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", - "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", - "dev": true, - "requires": { - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.0.3", - "has": "^1.0.1", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash": "^4.17.4", - "object-inspect": "^1.5.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" - } - }, - "enzyme-adapter-react-15": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-15/-/enzyme-adapter-react-15-1.0.6.tgz", - "integrity": "sha512-6JfDjraNOGuTXklmApZlvEoR0VawzFzjWcrMXcNuRE/Xe7y9eFl7tIxD3GLDbg13KWHbIcY6/XbvcMM4LjLPcg==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.4.0", - "object.assign": "^4.1.0", - "object.values": "^1.0.4", - "prop-types": "^15.6.0", - "react-is": "^16.4.1" - } - }, - "enzyme-adapter-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", - "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", - "dev": true, - "requires": { - "object.assign": "^4.1.0", - "prop-types": "^15.6.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2222,17 +2128,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -2380,12 +2275,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2443,20 +2332,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2493,6 +2368,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2539,12 +2420,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -2675,12 +2550,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2717,18 +2586,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -3006,6 +2863,75 @@ "detect-newline": "^2.1.0" } }, + "jest-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-1.12.0.tgz", + "integrity": "sha512-G8LplxieRJDOmTNJN2SzctewT9HoslclwzEW8znch98gSw5KeajIbporSqUuWHPRB8q8UQl0OI6AtUjGrNcniQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "css": "^2.2.3", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "pretty-format": "^23.0.1", + "redent": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + } + } + }, "jest-each": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", @@ -3492,12 +3418,6 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -3716,18 +3636,18 @@ "minimist": "0.0.8" } }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mutationobserver-shim": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", + "integrity": "sha1-9NXa56SXGiIHkU+1qQ69UUtlrMo=", + "dev": true + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -3768,19 +3688,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nearley": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.0.tgz", - "integrity": "sha512-ZjzdO+yBtMrRrBbr+BJ35ECla6PGCAb/6hqpBQe7bmhEJabQ4rpVdj4sadP1Z1jQGyaDmm1GciQWsGVxIZ3uJA==", - "dev": true, - "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -3809,16 +3716,6 @@ "which": "^1.3.0" } }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -3849,15 +3746,6 @@ "path-key": "^2.0.0" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -3904,18 +3792,6 @@ } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -3931,30 +3807,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -3984,18 +3836,6 @@ "isobject": "^3.0.1" } }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4111,15 +3951,6 @@ "error-ex": "^1.2.0" } }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4304,31 +4135,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randomatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", @@ -4379,20 +4185,14 @@ "prop-types": "^15.5.10" } }, - "react-is": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", - "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", - "dev": true - }, - "react-test-renderer": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-15.6.2.tgz", - "integrity": "sha1-0DM0NPwsQ4CSaWyncNpe1IA376g=", + "react-testing-library": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-5.0.0.tgz", + "integrity": "sha512-blIVFDHj0j2klvcrudvz8BnMJ3xoGBBh2P0R70JTvlj7uH4rd3oSKcG0BeFolfbNahv6Gz2RZ+S3WCHg/iVSZA==", "dev": true, "requires": { - "fbjs": "^0.8.9", - "object-assign": "^4.1.0" + "dom-testing-library": "^3.1.0", + "wait-for-expect": "^1.0.0" } }, "read-pkg": { @@ -4461,6 +4261,16 @@ "util.promisify": "^1.0.0" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -4642,16 +4452,6 @@ "glob": "^7.0.5" } }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -5108,6 +4908,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -5312,12 +5118,6 @@ "dev": true, "optional": true }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5457,6 +5257,12 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-for-expect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.0.0.tgz", + "integrity": "sha512-I6OlPKnd4qVdKJf1Gjx9M9qQjIk29rALoUkjwIKa9pNDCdzUuJTfaNv1mtsm2QdSvF0ZQogrWJMifTN1lUeXig==", + "dev": true + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", diff --git a/test/react/15/package.json b/test/react/15/package.json index 7dcc9c515..a6f7f8951 100644 --- a/test/react/15/package.json +++ b/test/react/15/package.json @@ -2,12 +2,11 @@ "private": true, "devDependencies": { "create-react-class": "^15.6.3", - "enzyme": "^3.3.0", - "enzyme-adapter-react-15": "^1.0.6", "jest": "^23.4.2", + "jest-dom": "^1.12.0", "react": "15.6", "react-dom": "15.6", - "react-test-renderer": "15.6" + "react-testing-library": "^5.0.0" }, "jest": { "testURL": "http://localhost", diff --git a/test/react/16.2/package-lock.json b/test/react/16.2/package-lock.json index 2eaab9872..4196a617a 100644 --- a/test/react/16.2/package-lock.json +++ b/test/react/16.2/package-lock.json @@ -30,12 +30,6 @@ } } }, - "@types/node": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.4.tgz", - "integrity": "sha512-8TqvB0ReZWwtcd3LXq3YSrBoLyXFgBX/sBZfGye9+YS8zH7/g+i6QRIuiDmwBoTzcQ/pk89nZYTYU4c5akKkzw==", - "dev": true - }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -594,12 +588,6 @@ "tweetnacl": "^0.14.3" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -742,20 +730,6 @@ "supports-color": "^5.3.0" } }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", @@ -843,12 +817,6 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -922,24 +890,29 @@ "which": "^1.2.9" } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "css": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } } }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -1103,36 +1076,41 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dom-testing-library": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.3.0.tgz", + "integrity": "sha512-on5xM8U+UszlUAmdHVzUnjNIRxM57Sv2k25YFjUcG+aUktYwQG2LJ0HTe8yBkL0Yyfi3iS9xpHRw0y87O+imbA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "mutationobserver-shim": "^0.3.2", + "pretty-format": "^22.4.3", + "wait-for-expect": "^0.4.0" }, "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "wait-for-expect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-0.4.0.tgz", + "integrity": "sha512-itHoJUKL5P8abjhWRlp3F5QLDY7LokcJkgD78tjrX08ozBakfy9YD4bgxUVuSld8yqjza3ld6Sj7UMMOH/twFA==", "dev": true } } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1142,25 +1120,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1181,61 +1140,6 @@ "iconv-lite": "~0.4.13" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "enzyme": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", - "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", - "dev": true, - "requires": { - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.0.3", - "has": "^1.0.1", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash": "^4.17.4", - "object-inspect": "^1.5.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" - } - }, - "enzyme-adapter-react-16": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", - "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.3.0", - "lodash": "^4.17.4", - "object.assign": "^4.0.4", - "object.values": "^1.0.4", - "prop-types": "^15.6.0", - "react-reconciler": "^0.7.0", - "react-test-renderer": "^16.0.0-0" - } - }, - "enzyme-adapter-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", - "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", - "dev": true, - "requires": { - "object.assign": "^4.1.0", - "prop-types": "^15.6.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2224,17 +2128,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -2382,12 +2275,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2445,20 +2332,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2495,6 +2368,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2541,12 +2420,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -2677,12 +2550,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2719,18 +2586,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -3008,6 +2863,75 @@ "detect-newline": "^2.1.0" } }, + "jest-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-1.12.0.tgz", + "integrity": "sha512-G8LplxieRJDOmTNJN2SzctewT9HoslclwzEW8znch98gSw5KeajIbporSqUuWHPRB8q8UQl0OI6AtUjGrNcniQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "css": "^2.2.3", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "pretty-format": "^23.0.1", + "redent": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + } + } + }, "jest-each": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", @@ -3494,12 +3418,6 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -3718,18 +3636,18 @@ "minimist": "0.0.8" } }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mutationobserver-shim": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", + "integrity": "sha1-9NXa56SXGiIHkU+1qQ69UUtlrMo=", + "dev": true + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -3770,19 +3688,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nearley": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.0.tgz", - "integrity": "sha512-ZjzdO+yBtMrRrBbr+BJ35ECla6PGCAb/6hqpBQe7bmhEJabQ4rpVdj4sadP1Z1jQGyaDmm1GciQWsGVxIZ3uJA==", - "dev": true, - "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -3811,16 +3716,6 @@ "which": "^1.3.0" } }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -3851,15 +3746,6 @@ "path-key": "^2.0.0" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -3906,18 +3792,6 @@ } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -3933,30 +3807,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -3986,18 +3836,6 @@ "isobject": "^3.0.1" } }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4113,15 +3951,6 @@ "error-ex": "^1.2.0" } }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4306,31 +4135,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randomatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", @@ -4380,27 +4184,14 @@ "prop-types": "^15.6.0" } }, - "react-reconciler": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", - "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", + "react-testing-library": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-5.0.0.tgz", + "integrity": "sha512-blIVFDHj0j2klvcrudvz8BnMJ3xoGBBh2P0R70JTvlj7uH4rd3oSKcG0BeFolfbNahv6Gz2RZ+S3WCHg/iVSZA==", "dev": true, "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" - } - }, - "react-test-renderer": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.2.0.tgz", - "integrity": "sha512-Kd4gJFtpNziR9ElOE/C23LeflKLZPRpNQYWP3nQBY43SJ5a+xyEGSeMrm2zxNKXcnCbBS/q1UpD9gqd5Dv+rew==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "dom-testing-library": "^3.1.0", + "wait-for-expect": "^1.0.0" } }, "read-pkg": { @@ -4469,6 +4260,16 @@ "util.promisify": "^1.0.0" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -4650,16 +4451,6 @@ "glob": "^7.0.5" } }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -5116,6 +4907,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -5320,12 +5117,6 @@ "dev": true, "optional": true }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5465,6 +5256,12 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-for-expect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.0.0.tgz", + "integrity": "sha512-I6OlPKnd4qVdKJf1Gjx9M9qQjIk29rALoUkjwIKa9pNDCdzUuJTfaNv1mtsm2QdSvF0ZQogrWJMifTN1lUeXig==", + "dev": true + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", diff --git a/test/react/16.2/package.json b/test/react/16.2/package.json index ec365eda0..8203406ef 100644 --- a/test/react/16.2/package.json +++ b/test/react/16.2/package.json @@ -2,12 +2,11 @@ "private": true, "devDependencies": { "create-react-class": "^15.6.3", - "enzyme": "^3.3.0", - "enzyme-adapter-react-16": "^1.0.6", "jest": "^23.4.2", + "jest-dom": "^1.12.0", "react": "16.2", "react-dom": "16.2", - "react-test-renderer": "16.2" + "react-testing-library": "^5.0.0" }, "jest": { "testURL": "http://localhost", diff --git a/test/react/16.3/package-lock.json b/test/react/16.3/package-lock.json index 9cd3b6ac0..876549adc 100644 --- a/test/react/16.3/package-lock.json +++ b/test/react/16.3/package-lock.json @@ -30,12 +30,6 @@ } } }, - "@types/node": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.4.tgz", - "integrity": "sha512-8TqvB0ReZWwtcd3LXq3YSrBoLyXFgBX/sBZfGye9+YS8zH7/g+i6QRIuiDmwBoTzcQ/pk89nZYTYU4c5akKkzw==", - "dev": true - }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -594,12 +588,6 @@ "tweetnacl": "^0.14.3" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -742,20 +730,6 @@ "supports-color": "^5.3.0" } }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", @@ -843,12 +817,6 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -922,24 +890,29 @@ "which": "^1.2.9" } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "css": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } } }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -1103,36 +1076,41 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dom-testing-library": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.3.0.tgz", + "integrity": "sha512-on5xM8U+UszlUAmdHVzUnjNIRxM57Sv2k25YFjUcG+aUktYwQG2LJ0HTe8yBkL0Yyfi3iS9xpHRw0y87O+imbA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "mutationobserver-shim": "^0.3.2", + "pretty-format": "^22.4.3", + "wait-for-expect": "^0.4.0" }, "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "wait-for-expect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-0.4.0.tgz", + "integrity": "sha512-itHoJUKL5P8abjhWRlp3F5QLDY7LokcJkgD78tjrX08ozBakfy9YD4bgxUVuSld8yqjza3ld6Sj7UMMOH/twFA==", "dev": true } } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1142,25 +1120,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1181,61 +1140,6 @@ "iconv-lite": "~0.4.13" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "enzyme": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", - "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", - "dev": true, - "requires": { - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.0.3", - "has": "^1.0.1", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash": "^4.17.4", - "object-inspect": "^1.5.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" - } - }, - "enzyme-adapter-react-16": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", - "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.3.0", - "lodash": "^4.17.4", - "object.assign": "^4.0.4", - "object.values": "^1.0.4", - "prop-types": "^15.6.0", - "react-reconciler": "^0.7.0", - "react-test-renderer": "^16.0.0-0" - } - }, - "enzyme-adapter-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", - "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", - "dev": true, - "requires": { - "object.assign": "^4.1.0", - "prop-types": "^15.6.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2224,17 +2128,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -2382,12 +2275,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2445,20 +2332,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2495,6 +2368,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2541,12 +2420,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -2677,12 +2550,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2719,18 +2586,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -3008,6 +2863,75 @@ "detect-newline": "^2.1.0" } }, + "jest-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-1.12.0.tgz", + "integrity": "sha512-G8LplxieRJDOmTNJN2SzctewT9HoslclwzEW8znch98gSw5KeajIbporSqUuWHPRB8q8UQl0OI6AtUjGrNcniQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "css": "^2.2.3", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "pretty-format": "^23.0.1", + "redent": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + } + } + }, "jest-each": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", @@ -3494,12 +3418,6 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -3718,18 +3636,18 @@ "minimist": "0.0.8" } }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mutationobserver-shim": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", + "integrity": "sha1-9NXa56SXGiIHkU+1qQ69UUtlrMo=", + "dev": true + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -3770,19 +3688,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nearley": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.0.tgz", - "integrity": "sha512-ZjzdO+yBtMrRrBbr+BJ35ECla6PGCAb/6hqpBQe7bmhEJabQ4rpVdj4sadP1Z1jQGyaDmm1GciQWsGVxIZ3uJA==", - "dev": true, - "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -3811,16 +3716,6 @@ "which": "^1.3.0" } }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -3851,15 +3746,6 @@ "path-key": "^2.0.0" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -3906,18 +3792,6 @@ } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -3933,30 +3807,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -3986,18 +3836,6 @@ "isobject": "^3.0.1" } }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4113,15 +3951,6 @@ "error-ex": "^1.2.0" } }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4306,31 +4135,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randomatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", @@ -4380,34 +4184,14 @@ "prop-types": "^15.6.0" } }, - "react-is": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", - "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", - "dev": true - }, - "react-reconciler": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", - "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", + "react-testing-library": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-5.0.0.tgz", + "integrity": "sha512-blIVFDHj0j2klvcrudvz8BnMJ3xoGBBh2P0R70JTvlj7uH4rd3oSKcG0BeFolfbNahv6Gz2RZ+S3WCHg/iVSZA==", "dev": true, "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" - } - }, - "react-test-renderer": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.3.2.tgz", - "integrity": "sha512-lL8WHIpCTMdSe+CRkt0rfMxBkJFyhVrpdQ54BaJRIrXf9aVmbeHbRA8GFRpTvohPN5tPzMabmrzW2PUfWCfWwQ==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0", - "react-is": "^16.3.2" + "dom-testing-library": "^3.1.0", + "wait-for-expect": "^1.0.0" } }, "read-pkg": { @@ -4476,6 +4260,16 @@ "util.promisify": "^1.0.0" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -4657,16 +4451,6 @@ "glob": "^7.0.5" } }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -5123,6 +4907,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -5327,12 +5117,6 @@ "dev": true, "optional": true }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5472,6 +5256,12 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-for-expect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.0.0.tgz", + "integrity": "sha512-I6OlPKnd4qVdKJf1Gjx9M9qQjIk29rALoUkjwIKa9pNDCdzUuJTfaNv1mtsm2QdSvF0ZQogrWJMifTN1lUeXig==", + "dev": true + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", diff --git a/test/react/16.3/package.json b/test/react/16.3/package.json index 305ecbdb7..87dbb8138 100644 --- a/test/react/16.3/package.json +++ b/test/react/16.3/package.json @@ -2,12 +2,11 @@ "private": true, "devDependencies": { "create-react-class": "^15.6.3", - "enzyme": "^3.3.0", - "enzyme-adapter-react-16": "^1.0.6", "jest": "^23.4.2", + "jest-dom": "^1.12.0", "react": "16.3", "react-dom": "16.3", - "react-test-renderer": "16.3" + "react-testing-library": "^5.0.0" }, "jest": { "testURL": "http://localhost", diff --git a/test/react/16.4/package-lock.json b/test/react/16.4/package-lock.json index d792a1dce..48e815edb 100644 --- a/test/react/16.4/package-lock.json +++ b/test/react/16.4/package-lock.json @@ -30,12 +30,6 @@ } } }, - "@types/node": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.4.tgz", - "integrity": "sha512-8TqvB0ReZWwtcd3LXq3YSrBoLyXFgBX/sBZfGye9+YS8zH7/g+i6QRIuiDmwBoTzcQ/pk89nZYTYU4c5akKkzw==", - "dev": true - }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -594,12 +588,6 @@ "tweetnacl": "^0.14.3" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -742,20 +730,6 @@ "supports-color": "^5.3.0" } }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", @@ -843,12 +817,6 @@ "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", "dev": true }, - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -922,24 +890,29 @@ "which": "^1.2.9" } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "css": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", + "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "inherits": "^2.0.1", + "source-map": "^0.1.38", + "source-map-resolve": "^0.5.1", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } } }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -1103,36 +1076,41 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dom-testing-library": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.3.0.tgz", + "integrity": "sha512-on5xM8U+UszlUAmdHVzUnjNIRxM57Sv2k25YFjUcG+aUktYwQG2LJ0HTe8yBkL0Yyfi3iS9xpHRw0y87O+imbA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "mutationobserver-shim": "^0.3.2", + "pretty-format": "^22.4.3", + "wait-for-expect": "^0.4.0" }, "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + }, + "wait-for-expect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-0.4.0.tgz", + "integrity": "sha512-itHoJUKL5P8abjhWRlp3F5QLDY7LokcJkgD78tjrX08ozBakfy9YD4bgxUVuSld8yqjza3ld6Sj7UMMOH/twFA==", "dev": true } } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1142,25 +1120,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1181,61 +1140,6 @@ "iconv-lite": "~0.4.13" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "enzyme": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", - "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", - "dev": true, - "requires": { - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.0.3", - "has": "^1.0.1", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash": "^4.17.4", - "object-inspect": "^1.5.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" - } - }, - "enzyme-adapter-react-16": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", - "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.3.0", - "lodash": "^4.17.4", - "object.assign": "^4.0.4", - "object.values": "^1.0.4", - "prop-types": "^15.6.0", - "react-reconciler": "^0.7.0", - "react-test-renderer": "^16.0.0-0" - } - }, - "enzyme-adapter-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", - "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", - "dev": true, - "requires": { - "object.assign": "^4.1.0", - "prop-types": "^15.6.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2224,17 +2128,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -2382,12 +2275,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2445,20 +2332,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2495,6 +2368,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2541,12 +2420,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -2677,12 +2550,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2719,18 +2586,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -3008,6 +2863,75 @@ "detect-newline": "^2.1.0" } }, + "jest-dom": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-1.12.0.tgz", + "integrity": "sha512-G8LplxieRJDOmTNJN2SzctewT9HoslclwzEW8znch98gSw5KeajIbporSqUuWHPRB8q8UQl0OI6AtUjGrNcniQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "css": "^2.2.3", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "pretty-format": "^23.0.1", + "redent": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "jest-diff": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", + "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", + "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" + }, + "dependencies": { + "pretty-format": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", + "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + } + } + } + } + } + }, "jest-each": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz", @@ -3494,12 +3418,6 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -3718,18 +3636,18 @@ "minimist": "0.0.8" } }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "mutationobserver-shim": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", + "integrity": "sha1-9NXa56SXGiIHkU+1qQ69UUtlrMo=", + "dev": true + }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", @@ -3770,19 +3688,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nearley": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.0.tgz", - "integrity": "sha512-ZjzdO+yBtMrRrBbr+BJ35ECla6PGCAb/6hqpBQe7bmhEJabQ4rpVdj4sadP1Z1jQGyaDmm1GciQWsGVxIZ3uJA==", - "dev": true, - "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", @@ -3811,16 +3716,6 @@ "which": "^1.3.0" } }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -3851,15 +3746,6 @@ "path-key": "^2.0.0" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -3906,18 +3792,6 @@ } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -3933,30 +3807,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -3986,18 +3836,6 @@ "isobject": "^3.0.1" } }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4113,15 +3951,6 @@ "error-ex": "^1.2.0" } }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4306,31 +4135,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randomatic": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", @@ -4380,34 +4184,14 @@ "prop-types": "^15.6.0" } }, - "react-is": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", - "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", - "dev": true - }, - "react-reconciler": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", - "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", + "react-testing-library": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-5.0.0.tgz", + "integrity": "sha512-blIVFDHj0j2klvcrudvz8BnMJ3xoGBBh2P0R70JTvlj7uH4rd3oSKcG0BeFolfbNahv6Gz2RZ+S3WCHg/iVSZA==", "dev": true, "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" - } - }, - "react-test-renderer": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.4.1.tgz", - "integrity": "sha512-wyyiPxRZOTpKnNIgUBOB6xPLTpIzwcQMIURhZvzUqZzezvHjaGNsDPBhMac5fIY3Jf5NuKxoGvV64zDSOECPPQ==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0", - "react-is": "^16.4.1" + "dom-testing-library": "^3.1.0", + "wait-for-expect": "^1.0.0" } }, "read-pkg": { @@ -4476,6 +4260,16 @@ "util.promisify": "^1.0.0" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -4657,16 +4451,6 @@ "glob": "^7.0.5" } }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -5123,6 +4907,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -5327,12 +5117,6 @@ "dev": true, "optional": true }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5472,6 +5256,12 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-for-expect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.0.0.tgz", + "integrity": "sha512-I6OlPKnd4qVdKJf1Gjx9M9qQjIk29rALoUkjwIKa9pNDCdzUuJTfaNv1mtsm2QdSvF0ZQogrWJMifTN1lUeXig==", + "dev": true + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", diff --git a/test/react/16.4/package.json b/test/react/16.4/package.json index d1791a27f..ffab3ce8d 100644 --- a/test/react/16.4/package.json +++ b/test/react/16.4/package.json @@ -2,12 +2,11 @@ "private": true, "devDependencies": { "create-react-class": "^15.6.3", - "enzyme": "^3.3.0", - "enzyme-adapter-react-16": "^1.0.6", "jest": "^23.4.2", + "jest-dom": "^1.12.0", "react": "16.4", "react-dom": "16.4", - "react-test-renderer": "16.4" + "react-testing-library": "^5.0.0" }, "jest": { "testURL": "http://localhost", From 0f427b5f9e488fa507821424aee3df4301f07225 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 10:05:35 -0400 Subject: [PATCH 12/14] remove enzyme and react-test-renderer --- package-lock.json | 393 ---------------------------------------------- package.json | 3 - 2 files changed, 396 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d205b83a..fe3cd5f11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1602,12 +1602,6 @@ "dev": true, "optional": true }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -1765,31 +1759,6 @@ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1933,12 +1902,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -2118,24 +2081,6 @@ } } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, "cssom": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", @@ -2336,12 +2281,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -2351,24 +2290,6 @@ "esutils": "^2.0.2" } }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, "dom-testing-library": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.3.0.tgz", @@ -2413,12 +2334,6 @@ } } }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -2428,25 +2343,6 @@ "webidl-conversions": "^4.0.2" } }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -2465,61 +2361,6 @@ "iconv-lite": "~0.4.13" } }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "enzyme": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", - "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", - "dev": true, - "requires": { - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.0.3", - "has": "^1.0.1", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.3", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash": "^4.17.4", - "object-inspect": "^1.5.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" - } - }, - "enzyme-adapter-react-16": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz", - "integrity": "sha512-kC8pAtU2Jk3OJ0EG8Y2813dg9Ol0TXi7UNxHzHiWs30Jo/hj7alc//G1YpKUsPP1oKl9X+Lkx+WlGJpPYA+nvw==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.3.0", - "lodash": "^4.17.4", - "object.assign": "^4.0.4", - "object.values": "^1.0.4", - "prop-types": "^15.6.0", - "react-reconciler": "^0.7.0", - "react-test-renderer": "^16.0.0-0" - } - }, - "enzyme-adapter-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.4.0.tgz", - "integrity": "sha512-ajvyXQYbmCoKCX/FaraNzBgXDXJBltCd0GdXfKc0DdRPYgCLaZfS6Ts576IFt8aX2GU9ajZv2g5jfcJ+Nttejw==", - "dev": true, - "requires": { - "object.assign": "^4.1.0", - "prop-types": "^15.6.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4108,25 +3949,6 @@ "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", "dev": true }, - "function.prototype.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.0.tgz", - "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" - }, - "dependencies": { - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - } - } - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -4302,12 +4124,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -4398,20 +4214,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -4599,12 +4401,6 @@ "binary-extensions": "^1.0.0" } }, - "is-boolean-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", - "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", - "dev": true - }, "is-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", @@ -4741,12 +4537,6 @@ "kind-of": "^3.0.2" } }, - "is-number-object": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", - "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", - "dev": true - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4826,18 +4616,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "is-string": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", - "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -6191,12 +5969,6 @@ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -6371,12 +6143,6 @@ "minimist": "0.0.8" } }, - "moo": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", - "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6447,19 +6213,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nearley": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.0.tgz", - "integrity": "sha512-ZjzdO+yBtMrRrBbr+BJ35ECla6PGCAb/6hqpBQe7bmhEJabQ4rpVdj4sadP1Z1jQGyaDmm1GciQWsGVxIZ3uJA==", - "dev": true, - "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6", - "semver": "^5.4.1" - } - }, "nice-try": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", @@ -6493,16 +6246,6 @@ "which": "^1.3.0" } }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" - } - }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -6573,15 +6316,6 @@ "which": "^1.2.10" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -6627,18 +6361,6 @@ } } }, - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", @@ -6662,38 +6384,6 @@ } } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "dependencies": { - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - } - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -6731,18 +6421,6 @@ } } }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7101,31 +6779,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -7191,41 +6844,11 @@ "prop-types": "^15.6.0" } }, - "react-is": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", - "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", - "dev": true - }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "react-reconciler": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.7.0.tgz", - "integrity": "sha512-50JwZ3yNyMS8fchN+jjWEJOH3Oze7UmhxeoJLn2j6f3NjpfCRbcmih83XTWmzqtar/ivd5f7tvQhvvhism2fgg==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" - } - }, - "react-test-renderer": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.3.2.tgz", - "integrity": "sha512-lL8WHIpCTMdSe+CRkt0rfMxBkJFyhVrpdQ54BaJRIrXf9aVmbeHbRA8GFRpTvohPN5tPzMabmrzW2PUfWCfWwQ==", - "dev": true, - "requires": { - "fbjs": "^0.8.16", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0", - "react-is": "^16.3.2" - } - }, "react-testing-library": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-5.0.0.tgz", @@ -7726,16 +7349,6 @@ "minimatch": "^3.0.2" } }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -9667,12 +9280,6 @@ "dev": true, "optional": true }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", diff --git a/package.json b/package.json index 5ddbf66ad..f34494999 100644 --- a/package.json +++ b/package.json @@ -81,8 +81,6 @@ "create-react-class": "^15.6.3", "cross-env": "^5.2.0", "cross-spawn": "^6.0.5", - "enzyme": "^3.3.0", - "enzyme-adapter-react-16": "^1.1.1", "es3ify": "^0.2.0", "eslint": "^4.19.1", "eslint-plugin-import": "^2.12.0", @@ -93,7 +91,6 @@ "npm-run": "^5.0.1", "react": "^16.3.2", "react-dom": "^16.3.2", - "react-test-renderer": "^16.3.2", "react-testing-library": "^5.0.0", "redux": "^4.0.0", "rimraf": "^2.6.2", From b255a46cd154d7422877695adf6bd1cf43633b71 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 10:45:40 -0400 Subject: [PATCH 13/14] fix lint errors --- package.json | 2 +- test/components/connect.spec.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index f34494999..a597f5f18 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "build:umd:min": "cross-env BABEL_ENV=rollup NODE_ENV=production rollup -c -o dist/react-redux.min.js", "build": "npm run build:commonjs && npm run build:es && npm run build:umd && npm run build:umd:min", "clean": "rimraf lib dist es coverage", - "lint": "eslint src test/utils test/components test/getTestDeps.js", + "lint": "eslint src test/utils test/components", "prepare": "npm run clean && npm run build", "test": "node ./test/run-tests.js", "coverage": "codecov" diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index 4b4f0d595..3535bd8ed 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -527,7 +527,6 @@ describe('React', () => { const store = createStore(stringBuilder) let invocationCount = 0 - let setFoo /*eslint-disable no-unused-vars */ @connect((arg1) => { From 9578017ed8da8bee91dbe8ef2e7d57499b3c79e7 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Sun, 12 Aug 2018 13:38:40 -0400 Subject: [PATCH 14/14] Revert "Merge branch 'pre-6.x' into master" This reverts commit eb960c49cd9dcd3f61a79df49beb47d967308900, reversing changes made to b255a46cd154d7422877695adf6bd1cf43633b71. --- package-lock.json | 21 +++--- package.json | 5 +- src/components/connectAdvanced.js | 113 +++++++++++++----------------- test/components/Provider.spec.js | 23 +----- test/components/connect.spec.js | 36 ++-------- 5 files changed, 70 insertions(+), 128 deletions(-) diff --git a/package-lock.json b/package-lock.json index 15ed0ccc1..fe3cd5f11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6821,9 +6821,9 @@ } }, "react": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.4.1.tgz", - "integrity": "sha512-3GEs0giKp6E0Oh/Y9ZC60CmYgUPnp7voH9fbjWsvXtYFb4EWtgQub0ADSq0sJR0BbHc4FThLLtzlcFaFXIorwg==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react/-/react-16.3.2.tgz", + "integrity": "sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg==", "dev": true, "requires": { "fbjs": "^0.8.16", @@ -6833,9 +6833,9 @@ } }, "react-dom": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.1.tgz", - "integrity": "sha512-1Gin+wghF/7gl4Cqcvr1DxFX2Osz7ugxSwl6gBqCMpdrxHjIFUS7GYxrFftZ9Ln44FHw0JxCFD9YtZsrbR5/4A==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", + "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", "dev": true, "requires": { "fbjs": "^0.8.16", @@ -6844,11 +6844,10 @@ "prop-types": "^15.6.0" } }, - "react-is": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.1.tgz", - "integrity": "sha512-xpb0PpALlFWNw/q13A+1aHeyJyLYCg0/cCHPUA43zYluZuIPHaHL3k8OBsTgQtxqW0FhyDEMvi8fZ/+7+r4OSQ==", - "dev": true + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-testing-library": { "version": "5.0.0", diff --git a/package.json b/package.json index e3b2ecde4..a597f5f18 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "hoist-non-react-statics": "^2.5.5", "invariant": "^2.2.4", "loose-envify": "^1.1.0", - "prop-types": "^15.6.1" + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.0" }, "devDependencies": { "babel-cli": "^6.26.0", @@ -88,6 +89,8 @@ "jest": "^23.4.1", "jest-dom": "^1.12.0", "npm-run": "^5.0.1", + "react": "^16.3.2", + "react-dom": "^16.3.2", "react-testing-library": "^5.0.0", "redux": "^4.0.0", "rimraf": "^2.6.2", diff --git a/src/components/connectAdvanced.js b/src/components/connectAdvanced.js index c4495b86a..1a5faa625 100644 --- a/src/components/connectAdvanced.js +++ b/src/components/connectAdvanced.js @@ -1,12 +1,35 @@ import hoistStatics from 'hoist-non-react-statics' import invariant from 'invariant' import { Component, createElement } from 'react' +import { polyfill } from 'react-lifecycles-compat' import Subscription from '../utils/Subscription' import { storeShape, subscriptionShape } from '../utils/PropTypes' let hotReloadingVersion = 0 function noop() {} +function makeUpdater(sourceSelector, store) { + return function updater(props, prevState) { + try { + const nextProps = sourceSelector(store.getState(), props) + if (nextProps !== prevState.props || prevState.error) { + return { + shouldComponentUpdate: true, + props: nextProps, + error: null, + } + } + return { + shouldComponentUpdate: false, + } + } catch (error) { + return { + shouldComponentUpdate: true, + error, + } + } + } +} export default function connectAdvanced( /* @@ -65,6 +88,10 @@ export default function connectAdvanced( [subscriptionKey]: subscriptionShape, } + function getDerivedStateFromProps(nextProps, prevState) { + return prevState.updater(nextProps, prevState) + } + return function wrapWithConnect(WrappedComponent) { invariant( typeof WrappedComponent == 'function', @@ -107,14 +134,10 @@ export default function connectAdvanced( `or explicitly pass "${storeKey}" as a prop to "${displayName}".` ) - this.createSelector() this.state = { - updateCount: 0 + updater: this.createUpdater() } - this.storeState = this.store.getState() this.initSubscription() - this.derivedProps = this.derivedPropsUpdater() - this.received = this.props } getChildContext() { @@ -136,17 +159,11 @@ export default function connectAdvanced( // dispatching an action in its componentWillMount, we have to re-run the select and maybe // re-render. this.subscription.trySubscribe() - this.triggerUpdateOnStoreStateChange() + this.runUpdater() } - shouldComponentUpdate(nextProps) { - this.received = nextProps - // received a prop update, store state updates are handled in onStateChange - const oldProps = this.derivedProps - const newProps = this.updateDerivedProps(nextProps) - if (this.error) return true - const sCU = newProps !== oldProps - return sCU + shouldComponentUpdate(_, nextState) { + return nextState.shouldComponentUpdate } componentWillUnmount() { @@ -157,31 +174,6 @@ export default function connectAdvanced( this.isUnmounted = true } - updateDerivedProps(nextProps) { - this.derivedProps = this.derivedPropsUpdater(nextProps) - return this.derivedProps - } - - derivedPropsUpdater(props = this.props) { - // runs when props change, or the store state changes - // and generates the derived props for connected components - try { - const nextProps = this.sourceSelector(this.storeState, props) - if (nextProps !== this.derivedProps || this.error) { - this.error = null - return nextProps - } - return this.derivedProps - } catch (error) { - this.error = error - return this.derivedProps - } - } - - createSelector() { - this.sourceSelector = selectorFactory(this.store.dispatch, selectorFactoryOptions) - } - getWrappedInstance() { invariant(withRef, `To access the wrapped instance, you need to specify ` + @@ -194,24 +186,17 @@ export default function connectAdvanced( this.wrappedInstance = ref } - triggerUpdateOnStoreStateChange(callback = noop) { - // runs when an action is dispatched by the store we are listening to - // if the store state has changed, we save that and update the component state - // to force a re-generation of derived props + createUpdater() { + const sourceSelector = selectorFactory(this.store.dispatch, selectorFactoryOptions) + return makeUpdater(sourceSelector, this.store) + } + + runUpdater(callback = noop) { if (this.isUnmounted) { return } - this.setState(prevState => { - const newState = this.store.getState() - if (this.storeState === newState) { - return prevState - } - this.storeState = newState - return { - updateCount: prevState.updateCount++ - } - }, callback) + this.setState(prevState => prevState.updater(this.props, prevState), callback) } initSubscription() { @@ -232,7 +217,7 @@ export default function connectAdvanced( } onStateChange() { - this.triggerUpdateOnStoreStateChange(this.notifyNestedSubs) + this.runUpdater(this.notifyNestedSubs) } isSubscribed() { @@ -253,16 +238,10 @@ export default function connectAdvanced( } render() { - if (this.received !== this.props) { - // forceUpdate() was called on this component, which skips sCU - // so manually update derived props - this.received = this.props - this.updateDerivedProps(this.props) - } - if (this.error) { - throw this.error + if (this.state.error) { + throw this.state.error } else { - return createElement(WrappedComponent, this.addExtraProps(this.derivedProps)) + return createElement(WrappedComponent, this.addExtraProps(this.state.props)) } } } @@ -272,6 +251,7 @@ export default function connectAdvanced( Connect.childContextTypes = childContextTypes Connect.contextTypes = contextTypes Connect.propTypes = contextTypes + Connect.getDerivedStateFromProps = getDerivedStateFromProps if (process.env.NODE_ENV !== 'production') { Connect.prototype.componentDidUpdate = function componentDidUpdate() { @@ -296,12 +276,15 @@ export default function connectAdvanced( oldListeners.forEach(listener => this.subscription.listeners.subscribe(listener)) } - this.createSelector() - this.triggerUpdateOnStoreStateChange() + const updater = this.createUpdater() + this.setState({updater}) + this.runUpdater() } } } + polyfill(Connect) + return hoistStatics(Connect, WrappedComponent) } } diff --git a/test/components/Provider.spec.js b/test/components/Provider.spec.js index b50906770..039d9e2a9 100644 --- a/test/components/Provider.spec.js +++ b/test/components/Provider.spec.js @@ -214,12 +214,10 @@ describe('React', () => { } } - const childCalls = [] @connect((state, parentProps) => { childMapStateInvokes++ - childCalls.push([state, parentProps.parentState]) // The state from parent props should always be consistent with the current state - //expect(state).toEqual(parentProps.parentState) + expect(state).toEqual(parentProps.parentState) return {} }) class ChildContainer extends Component { @@ -238,31 +236,16 @@ describe('React', () => { // The store state stays consistent when setState calls are batched store.dispatch({ type: 'APPEND', body: 'c' }) - expect(childMapStateInvokes).toBe(3) - expect(childCalls).toEqual([ - ['a', 'a'], - ['a', 'ac'], // parent updates first, passes props - ['ac', 'ac'] // then store update is processed - ]) + expect(childMapStateInvokes).toBe(2) // setState calls DOM handlers are batched - const button = tester.getByText('change') rtl.fireEvent.click(button) expect(childMapStateInvokes).toBe(3) // Provider uses unstable_batchedUpdates() under the hood store.dispatch({ type: 'APPEND', body: 'd' }) - expect(childCalls).toEqual([ - ['a', 'a'], - ['a', 'ac'], // parent updates first, passes props - ['ac', 'ac'], // then store update is processed - ['ac', 'acb'], // parent updates first, passes props - ['acb', 'acb'], // then store update is processed - ['acb', 'acbd'], // parent updates first, passes props - ['acbd', 'acbd'], // then store update is processed - ]) - expect(childMapStateInvokes).toBe(7) + expect(childMapStateInvokes).toBe(4) }) it('works in without warnings (React 16.3+)', () => { diff --git a/test/components/connect.spec.js b/test/components/connect.spec.js index a01a2ca38..3535bd8ed 100644 --- a/test/components/connect.spec.js +++ b/test/components/connect.spec.js @@ -1773,12 +1773,10 @@ describe('React', () => { } } - const childCalls = [] @connect((state, parentProps) => { childMapStateInvokes++ - childCalls.push([state, parentProps.parentState]) // The state from parent props should always be consistent with the current state - //expect(state).toEqual(parentProps.parentState) + expect(state).toEqual(parentProps.parentState) return {} }) class ChildContainer extends Component { @@ -1794,20 +1792,12 @@ describe('React', () => { ) expect(childMapStateInvokes).toBe(1) - expect(childCalls).toEqual([ - ['a', 'a'] - ]) // The store state stays consistent when setState calls are batched ReactDOM.unstable_batchedUpdates(() => { store.dispatch({ type: 'APPEND', body: 'c' }) }) - expect(childMapStateInvokes).toBe(3) - expect(childCalls).toEqual([ - ['a', 'a'], - ['a', 'ac'], - ['ac', 'ac'], - ]) + expect(childMapStateInvokes).toBe(2) // setState calls DOM handlers are batched const button = tester.getByText('change') @@ -1815,16 +1805,7 @@ describe('React', () => { expect(childMapStateInvokes).toBe(3) store.dispatch({ type: 'APPEND', body: 'd' }) - expect(childMapStateInvokes).toBe(7) - expect(childCalls).toEqual([ - ['a', 'a'], - ['a', 'ac'], - ['ac', 'ac'], - ['ac', 'acb'], - ['acb', 'acb'], - ['acb', 'acbd'], - ['acbd', 'acbd'], - ]) + expect(childMapStateInvokes).toBe(4) }) it('should not render the wrapped component when mapState does not produce change', () => { @@ -2040,7 +2021,7 @@ describe('React', () => { return { ...stateProps, ...dispatchProps, name: parentProps.name } } - @connect(() => ({}), mapDispatchFactory, mergeParentDispatch) + @connect(null, mapDispatchFactory, mergeParentDispatch) class Passthrough extends Component { componentDidUpdate() { updatedCount++ @@ -2300,9 +2281,8 @@ describe('React', () => { @connect() // no mapStateToProps. therefore it should be transparent for subscriptions class B extends React.Component { render() { return }} - let calls = [] @connect((state, props) => { - calls.push([state, props.count]) + expect(props.count).toBe(state) return { count: state * 10 + props.count } }) class C extends React.Component { render() { return
{this.props.count}
}} @@ -2311,12 +2291,6 @@ describe('React', () => { rtl.render(
) store.dispatch({ type: 'INC' }) - - expect(calls).toEqual([ - [0, 0], - [0, 1], // props updates first - [1, 1], // then state - ]) }) it('should subscribe properly when a new store is provided via props', () => {