diff --git a/package.json b/package.json index 2c770e1..20074ca 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "react-firestore", "version": "0.0.0-semantically-released", - "description": "React components to fetch data from firestore using render props", + "description": + "React components to fetch data from firestore using render props", "author": "Andrew Walton", "license": "MIT", "homepage": "https://github.com/green-arrow/react-firestore#readme", @@ -27,10 +28,7 @@ "precommit": "kcd-scripts precommit", "prepare": "npm run build" }, - "files": [ - "dist", - "preact" - ], + "files": ["dist", "preact"], "eslintConfig": { "extends": "./node_modules/kcd-scripts/eslint.js", "rules": { @@ -38,40 +36,29 @@ "no-eq-null": "off", "eqeqeq": "off", "react/jsx-indent": "off", - "complexity": [ - "error", - 12 - ] + "complexity": ["error", 12] } }, - "eslintIgnore": [ - "node_modules", - "coverage", - "dist" - ], - "keywords": [ - "react", - "firestore", - "firebase" - ], + "eslintIgnore": ["node_modules", "coverage", "dist"], + "keywords": ["react", "firestore", "firebase"], "dependencies": { "hoist-non-react-statics": "^2.3.1" }, "peerDependencies": { "prop-types": ">=15", - "react": ">=15" + "react": ">=16.3" }, "devDependencies": { "commitizen": "^2.9.6", "cz-conventional-changelog": "^2.1.0", - "enzyme": "^3.3.0", - "enzyme-adapter-react-16": "^1.1.1", + "enzyme": "^3.8.0", + "enzyme-adapter-react-16": "^1.9.1", "kcd-scripts": "^0.32.1", "preact": "^8.2.7", "prop-types": "^15.6.0", - "react": "^16.2.0", - "react-dom": "^16.2.0", - "react-test-renderer": "^16.2.0" + "react": "^16.8.1", + "react-dom": "^16.8.1", + "react-test-renderer": "^16.8.1" }, "config": { "commitizen": { diff --git a/src/Firestore.js b/src/Firestore.js index 14ce68b..186351b 100644 --- a/src/Firestore.js +++ b/src/Firestore.js @@ -1,21 +1,15 @@ -import { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; +import { FirestoreContext } from './FirestoreProvider'; -class Firestore extends Component { - static propTypes = { - render: PropTypes.func.isRequired, - }; +const Firestore = ({ render }) => ( + + {({ firestoreDatabase }) => render({ firestore: firestoreDatabase })} + +); - static contextTypes = { - firestoreDatabase: PropTypes.object.isRequired, - }; - - render() { - const { firestoreDatabase } = this.context; - const { render } = this.props; - - return render({ firestore: firestoreDatabase }); - } -} +Firestore.propTypes = { + render: PropTypes.func.isRequired, +}; export default Firestore; diff --git a/src/FirestoreCollection.js b/src/FirestoreCollection.js index a564fae..4094945 100644 --- a/src/FirestoreCollection.js +++ b/src/FirestoreCollection.js @@ -1,5 +1,6 @@ import { Component } from 'react'; import PropTypes from 'prop-types'; +import withFirestore from './withFirestore'; import deepEqual from './utils/deepEqual'; class FirestoreCollection extends Component { @@ -19,11 +20,7 @@ class FirestoreCollection extends Component { ]), children: PropTypes.func, render: PropTypes.func, - }; - - static contextTypes = { - firestoreDatabase: PropTypes.object.isRequired, - firestoreCache: PropTypes.object.isRequired, + firestore: PropTypes.object.isRequired, }; state = { @@ -63,9 +60,9 @@ class FirestoreCollection extends Component { } setupFirestoreListener = props => { - const { firestoreDatabase } = this.context; + const { firestore } = props; const { path, ...queryProps } = props; - const collectionRef = firestoreDatabase.collection(path); + const collectionRef = firestore.collection(path); const query = this.buildQuery(collectionRef, queryProps); this.unsubscribe = query.onSnapshot( @@ -139,4 +136,4 @@ class FirestoreCollection extends Component { } } -export default FirestoreCollection; +export default withFirestore(FirestoreCollection); diff --git a/src/FirestoreDocument.js b/src/FirestoreDocument.js index d522caf..d5ec50d 100644 --- a/src/FirestoreDocument.js +++ b/src/FirestoreDocument.js @@ -1,16 +1,13 @@ import { Component } from 'react'; import PropTypes from 'prop-types'; +import withFirestore from './withFirestore'; class FirestoreDocument extends Component { static propTypes = { path: PropTypes.string.isRequired, children: PropTypes.func, render: PropTypes.func, - }; - - static contextTypes = { - firestoreDatabase: PropTypes.object.isRequired, - firestoreCache: PropTypes.object.isRequired, + firestore: PropTypes.object.isRequired, }; state = { @@ -45,9 +42,9 @@ class FirestoreDocument extends Component { } setupFirestoreListener = props => { - const { firestoreDatabase } = this.context; + const { firestore } = props; const { path } = props; - const documentRef = firestoreDatabase.doc(path); + const documentRef = firestore.doc(path); this.unsubscribe = documentRef.onSnapshot( this.handleOnSnapshotSuccess, @@ -98,4 +95,4 @@ class FirestoreDocument extends Component { } } -export default FirestoreDocument; +export default withFirestore(FirestoreDocument); diff --git a/src/FirestoreProvider.js b/src/FirestoreProvider.js index b7ea1ca..584691f 100644 --- a/src/FirestoreProvider.js +++ b/src/FirestoreProvider.js @@ -1,23 +1,20 @@ -import { Component } from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; import FirestoreCache from './FirestoreCache'; +export const FirestoreContext = React.createContext(null); + export default class FirestoreProvider extends Component { static propTypes = { firebase: PropTypes.object.isRequired, children: PropTypes.node.isRequired, - useTimestampsInSnapshots: PropTypes.bool.isRequired, + useTimestampsInSnapshots: PropTypes.bool, }; static defaultProps = { useTimestampsInSnapshots: false, }; - static childContextTypes = { - firestoreDatabase: PropTypes.object.isRequired, - firestoreCache: PropTypes.object.isRequired, - }; - constructor(props) { super(props); @@ -32,13 +29,11 @@ export default class FirestoreProvider extends Component { }; } - getChildContext() { - const { firestoreDatabase, firestoreCache } = this.state; - - return { firestoreDatabase, firestoreCache }; - } - render() { - return this.props.children; + return ( + + {this.props.children} + + ); } } diff --git a/src/__tests__/collection.filter.js b/src/__tests__/collection.filter.js index 7effbd1..b51be1b 100644 --- a/src/__tests__/collection.filter.js +++ b/src/__tests__/collection.filter.js @@ -1,11 +1,11 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreCollection } from '../'; +import { FirestoreCollection, FirestoreProvider } from '../'; import { createMocksForCollection } from './helpers/firestore-utils'; test('filters the documents returned with a simple filter', () => { const { - firestoreMock, + firebaseMock, collectionMock, query, onSnapshotMock, @@ -15,12 +15,13 @@ test('filters the documents returned with a simple filter', () => { const filter = ['name', '==', 'Mike']; mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + + , ); expect(collectionMock).toHaveBeenCalledTimes(1); @@ -39,7 +40,7 @@ test('filters the documents returned with a simple filter', () => { test('filters the documents returned with a compound filter', () => { const { - firestoreMock, + firebaseMock, collectionMock, query, onSnapshotMock, @@ -49,12 +50,13 @@ test('filters the documents returned with a compound filter', () => { const filter = [['firstName', '==', 'Mike'], ['lastName', '==', 'Smith']]; mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + + , ); expect(collectionMock).toHaveBeenCalledTimes(1); @@ -73,23 +75,25 @@ test('filters the documents returned with a compound filter', () => { }); test('filter accepts objects and numbers', () => { - const { firestoreMock } = createMocksForCollection(); + const { firebaseMock, firestoreMock } = createMocksForCollection(); const renderMock = jest.fn().mockReturnValue(
); const collectionName = 'users'; mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + + , ); mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + + , ); }); diff --git a/src/__tests__/collection.firestore-error.js b/src/__tests__/collection.firestore-error.js index 6e8fd31..d2218fa 100644 --- a/src/__tests__/collection.firestore-error.js +++ b/src/__tests__/collection.firestore-error.js @@ -1,12 +1,12 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreCollection } from '../'; +import { FirestoreCollection, FirestoreProvider } from '../'; import { createMocksForCollection } from './helpers/firestore-utils'; test('should handle error getting snapshot', () => { const options = { onSnapshotMockError: true }; const { - firestoreMock, + firebaseMock, collectionMock, onSnapshotMock, } = createMocksForCollection(null, options); @@ -14,9 +14,11 @@ test('should handle error getting snapshot', () => { const collectionName = 'error'; const wrapper = mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + + , ); + const component = wrapper.find(FirestoreCollection).children(0); expect(collectionMock).toHaveBeenCalledTimes(1); expect(collectionMock).toHaveBeenCalledWith(collectionName); @@ -30,5 +32,5 @@ test('should handle error getting snapshot', () => { snapshot: null, }), ); - expect(wrapper.state('error')).not.toBe(null); + expect(component.state('error')).not.toBe(null); }); diff --git a/src/__tests__/collection.firestore-integration.js b/src/__tests__/collection.firestore-integration.js index b5a85f1..1ca62b7 100644 --- a/src/__tests__/collection.firestore-integration.js +++ b/src/__tests__/collection.firestore-integration.js @@ -1,6 +1,6 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreCollection } from '../'; +import { FirestoreCollection, FirestoreProvider } from '../'; import { createMocksForCollection } from './helpers/firestore-utils'; test('integrates with firestore using onSnapshot', () => { @@ -15,7 +15,7 @@ test('integrates with firestore using onSnapshot', () => { }, ]; const { - firestoreMock, + firebaseMock, collectionMock, snapshot, onSnapshotMock, @@ -23,9 +23,11 @@ test('integrates with firestore using onSnapshot', () => { const renderMock = jest.fn().mockReturnValue(
); const collectionName = 'users'; - mount(, { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }); + mount( + + + , + ); expect(collectionMock).toHaveBeenCalledTimes(1); expect(collectionMock).toHaveBeenCalledWith(collectionName); @@ -48,12 +50,14 @@ test('integrates with firestore using onSnapshot', () => { }); test('does not re-render if no snapshot is returned', () => { - const { firestoreMock, onSnapshotMock } = createMocksForCollection(); + const { firebaseMock, onSnapshotMock } = createMocksForCollection(); const renderMock = jest.fn().mockReturnValue(
); - mount(, { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }); + mount( + + + , + ); expect(onSnapshotMock).toHaveBeenCalledTimes(1); expect(renderMock).toHaveBeenCalledTimes(1); @@ -61,15 +65,16 @@ test('does not re-render if no snapshot is returned', () => { test('unsubscribes from firestore when component unmounts', () => { const { - firestoreMock, + firebaseMock, onSnapshotMock, unsubscribeMock, } = createMocksForCollection(); const renderMock = jest.fn().mockReturnValue(
); const component = mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + + , ); expect(onSnapshotMock).toHaveBeenCalledTimes(1); @@ -81,18 +86,20 @@ test('unsubscribes from firestore when component unmounts', () => { }); test('does not unsubscribe if no unsubscribe hook exists', () => { - const { firestoreMock, unsubscribeMock } = createMocksForCollection(); + const { firebaseMock, unsubscribeMock } = createMocksForCollection(); const renderMock = jest.fn().mockReturnValue(
); - const component = mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + const wrapper = mount( + + + , ); + const component = wrapper.find(FirestoreCollection).children(0); expect(unsubscribeMock).not.toHaveBeenCalled(); component.instance().unsubscribe = null; - component.unmount(); + wrapper.unmount(); expect(unsubscribeMock).not.toHaveBeenCalled(); }); @@ -109,7 +116,7 @@ describe('when componentWillReceiveProps is executed', () => { }, ]; const { - firestoreMock, + firebaseMock, collectionMock, snapshot, onSnapshotMock, @@ -118,10 +125,16 @@ describe('when componentWillReceiveProps is executed', () => { const renderMock = jest.fn().mockReturnValue(
); const collectionName1 = 'users'; const collectionName2 = 'posts'; - let component = null; + // eslint-disable-next-line react/prop-types + const Wrapper = props => ( + + + + ); + let wrapper = null; const resetsIsLoadingState = newProp => { - component.setProps(newProp); + wrapper.setProps(newProp); expect(renderMock).toHaveBeenCalledWith( expect.objectContaining({ @@ -131,7 +144,7 @@ describe('when componentWillReceiveProps is executed', () => { }; const wiresUpANewListener = (newProp, expectedCollection) => { - component.setProps(newProp); + wrapper.setProps(newProp); expect(collectionMock).toHaveBeenCalledTimes(2); expect(collectionMock).toHaveBeenCalledWith(expectedCollection); @@ -139,13 +152,13 @@ describe('when componentWillReceiveProps is executed', () => { }; const unsubscribesActiveListener = newProp => { - component.setProps(newProp); + wrapper.setProps(newProp); expect(unsubscribeMock).toHaveBeenCalledTimes(1); }; const doesNotExecuteUnsubscribe = newProp => { - component.setProps(newProp); + wrapper.setProps(newProp); expect(unsubscribeMock).toHaveBeenCalledTimes(1); }; @@ -154,19 +167,16 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "path" prop is identical to incoming "path" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); - component.setProps({ path: collectionName1 }); + wrapper.setProps({ path: collectionName1 }); }); test('does not change isLoading state', () => { @@ -200,19 +210,16 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "sort" prop is identical to incoming "sort" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); - component.setProps({ sort: 'date' }); + wrapper.setProps({ sort: 'date' }); }); test('does not change isLoading state', () => { @@ -246,19 +253,16 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "limit" prop is identical to incoming "limit" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); - component.setProps({ limit: 5 }); + wrapper.setProps({ limit: 5 }); }); test('does not change isLoading state', () => { expect(renderMock).toHaveBeenCalledTimes(3); @@ -291,19 +295,16 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "filter" prop is identical to incoming "filter" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); - component.setProps({ filter: ['name', '==', 'Mike'] }); + wrapper.setProps({ filter: ['name', '==', 'Mike'] }); }); test('does not change isLoading state', () => { @@ -337,17 +338,14 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "path" prop is different than incoming "path" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); }); test('resets isLoading state', () => { @@ -369,17 +367,14 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "sort" prop is different than incoming "sort" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); }); test('resets isLoading state', () => { @@ -401,17 +396,14 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "limit" prop is different than incoming "limit" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); }); test('resets isLoading state', () => { @@ -433,17 +425,14 @@ describe('when componentWillReceiveProps is executed', () => { describe('when existing "filter" prop is different than incoming "filter" prop', () => { beforeEach(() => { - component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, ); }); test('resets isLoading state', () => { diff --git a/src/__tests__/collection.initial-state.js b/src/__tests__/collection.initial-state.js index 8618907..4be94d2 100644 --- a/src/__tests__/collection.initial-state.js +++ b/src/__tests__/collection.initial-state.js @@ -1,20 +1,22 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreCollection } from '../'; +import { FirestoreCollection, FirestoreProvider } from '../'; import { createMocksForCollection } from './helpers/firestore-utils'; test('initial state set up correctly', () => { const { - firestoreMock, + firebaseMock, collectionMock, onSnapshotMock, } = createMocksForCollection(); const renderMock = jest.fn().mockReturnValue(
); const collectionName = 'users'; - mount(, { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }); + mount( + + + , + ); expect(collectionMock).toHaveBeenCalledTimes(1); expect(collectionMock).toHaveBeenCalledWith(collectionName); @@ -30,7 +32,7 @@ test('initial state set up correctly', () => { test('renders child prop', () => { const { - firestoreMock, + firebaseMock, collectionMock, onSnapshotMock, } = createMocksForCollection(); @@ -38,12 +40,11 @@ test('renders child prop', () => { const collectionName = 'users'; mount( - - {renderMock} - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, + + + {renderMock} + + , ); expect(collectionMock).toHaveBeenCalledTimes(1); @@ -60,15 +61,17 @@ test('renders child prop', () => { test('renders nothing if passed no render prop or children', () => { const { - firestoreMock, + firebaseMock, collectionMock, onSnapshotMock, } = createMocksForCollection(); const collectionName = 'users'; - mount(, { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }); + mount( + + + , + ); expect(collectionMock).toHaveBeenCalledTimes(1); expect(collectionMock).toHaveBeenCalledWith(collectionName); diff --git a/src/__tests__/collection.limit.js b/src/__tests__/collection.limit.js index e9e1074..e04c050 100644 --- a/src/__tests__/collection.limit.js +++ b/src/__tests__/collection.limit.js @@ -1,11 +1,11 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreCollection } from '../'; +import { FirestoreCollection, FirestoreProvider } from '../'; import { createMocksForCollection } from './helpers/firestore-utils'; test('limits the number of documents returned', () => { const { - firestoreMock, + firebaseMock, collectionMock, query, onSnapshotMock, @@ -15,12 +15,13 @@ test('limits the number of documents returned', () => { const limit = 10; mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + + , ); expect(collectionMock).toHaveBeenCalledTimes(1); diff --git a/src/__tests__/collection.sorting.js b/src/__tests__/collection.sorting.js index feec736..0b092bd 100644 --- a/src/__tests__/collection.sorting.js +++ b/src/__tests__/collection.sorting.js @@ -1,11 +1,11 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreCollection } from '../'; +import { FirestoreCollection, FirestoreProvider } from '../'; import { createMocksForCollection } from './helpers/firestore-utils'; test('sorts by a single field', () => { const { - firestoreMock, + firebaseMock, collectionMock, query, onSnapshotMock, @@ -15,12 +15,13 @@ test('sorts by a single field', () => { const sortField = 'name'; mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } } + + + , ); expect(collectionMock).toHaveBeenCalledTimes(1); @@ -33,13 +34,13 @@ test('sorts by a single field', () => { expect.objectContaining({ isLoading: true, data: [], - }) + }), ); }); test('sorts by a multiple fields', () => { const { - firestoreMock, + firebaseMock, collectionMock, query, onSnapshotMock, @@ -49,12 +50,13 @@ test('sorts by a multiple fields', () => { const sort = 'name,joinedDate:desc'; mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } } + + + , ); expect(collectionMock).toHaveBeenCalledTimes(1); @@ -68,6 +70,6 @@ test('sorts by a multiple fields', () => { expect.objectContaining({ isLoading: true, data: [], - }) + }), ); }); diff --git a/src/__tests__/document.firestore-error.js b/src/__tests__/document.firestore-error.js index d117775..266870c 100644 --- a/src/__tests__/document.firestore-error.js +++ b/src/__tests__/document.firestore-error.js @@ -1,24 +1,23 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreDocument } from '../'; +import { FirestoreDocument, FirestoreProvider } from '../'; import { createMocksForDocument } from './helpers/firestore-utils'; test('should handle error getting snapshot', () => { const options = { onSnapshotMockError: true }; - const { - firestoreMock, - documentMock, - onSnapshotMock, - } = createMocksForDocument(null, options); + const { firebaseMock, documentMock, onSnapshotMock } = createMocksForDocument( + null, + options, + ); const renderMock = jest.fn().mockReturnValue(
); const documentPath = 'error/1'; const wrapper = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, + + + , ); + const component = wrapper.find(FirestoreDocument).children(0); expect(documentMock).toHaveBeenCalledTimes(1); expect(documentMock).toHaveBeenCalledWith(documentPath); @@ -40,7 +39,7 @@ test('should handle error getting snapshot', () => { snapshot: null, }), ); - expect(wrapper.state('error')).not.toBe(null); + expect(component.state('error')).not.toBe(null); }); test('should handle error when document id does not exist', () => { @@ -49,20 +48,19 @@ test('should handle error when document id does not exist', () => { name: 'John Smith', }; const options = { onDataMockError: true }; - const { - firestoreMock, - documentMock, - onSnapshotMock, - } = createMocksForDocument(doc, options); + const { firebaseMock, documentMock, onSnapshotMock } = createMocksForDocument( + doc, + options, + ); const renderMock = jest.fn().mockReturnValue(
); const documentPath = 'error/1'; const wrapper = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, + + + , ); + const component = wrapper.find(FirestoreDocument).children(0); expect(documentMock).toHaveBeenCalledTimes(1); expect(documentMock).toHaveBeenCalledWith(documentPath); @@ -75,5 +73,5 @@ test('should handle error when document id does not exist', () => { error: expect.any(Error), }), ); - expect(wrapper.state('error')).not.toBe(null); + expect(component.state('error')).not.toBe(null); }); diff --git a/src/__tests__/document.firestore-integration.js b/src/__tests__/document.firestore-integration.js index 00fd22f..ffe2521 100644 --- a/src/__tests__/document.firestore-integration.js +++ b/src/__tests__/document.firestore-integration.js @@ -1,6 +1,6 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreDocument } from '../'; +import { FirestoreDocument, FirestoreProvider } from '../'; import { createMocksForDocument } from './helpers/firestore-utils'; test('integrates with firestore using onSnapshot', () => { @@ -9,7 +9,7 @@ test('integrates with firestore using onSnapshot', () => { name: 'John Smith', }; const { - firestoreMock, + firebaseMock, documentMock, snapshot, onSnapshotMock, @@ -17,9 +17,11 @@ test('integrates with firestore using onSnapshot', () => { const renderMock = jest.fn().mockReturnValue(
); const documentPath = 'users/1'; - mount(, { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }); + mount( + + + , + ); expect(documentMock).toHaveBeenCalledTimes(1); expect(documentMock).toHaveBeenCalledWith(documentPath); @@ -43,15 +45,16 @@ test('integrates with firestore using onSnapshot', () => { test('unsubscribes from firestore when component unmounts', () => { const { - firestoreMock, + firebaseMock, onSnapshotMock, unsubscribeMock, } = createMocksForDocument(); const renderMock = jest.fn().mockReturnValue(
); const component = mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + + , + , ); expect(onSnapshotMock).toHaveBeenCalledTimes(1); @@ -63,18 +66,20 @@ test('unsubscribes from firestore when component unmounts', () => { }); test('does not unsubscribe if no unsubscribe hook exists', () => { - const { firestoreMock, unsubscribeMock } = createMocksForDocument(); + const { firebaseMock, unsubscribeMock } = createMocksForDocument(); const renderMock = jest.fn().mockReturnValue(
); - const component = mount( - , - { context: { firestoreDatabase: firestoreMock, firestoreCache: {} } }, + const wrapper = mount( + + , + , ); + const component = wrapper.find(FirestoreDocument).children(0); expect(unsubscribeMock).not.toHaveBeenCalled(); component.instance().unsubscribe = null; - component.unmount(); + wrapper.unmount(); expect(unsubscribeMock).not.toHaveBeenCalled(); }); @@ -86,7 +91,7 @@ describe('when props change', () => { }; const { documentMock, - firestoreMock, + firebaseMock, snapshot, onSnapshotMock, unsubscribeMock, @@ -95,15 +100,19 @@ describe('when props change', () => { const documentPath1 = 'users/1'; const documentPath2 = 'users/2'; - const component = mount( - , - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, + // eslint-disable-next-line react/prop-types + const Wrapper = ({ path }) => ( + + + ); + const wrapper = mount(); + + const component = wrapper.find(FirestoreDocument).children(0); + describe('when "path" prop is the same', () => { - beforeEach(() => component.setProps({ path: documentPath1 })); + beforeEach(() => wrapper.setProps({ path: documentPath1 })); test('it does not change isLoading state', () => { expect(renderMock).toHaveBeenCalledTimes(3); @@ -137,7 +146,7 @@ describe('when props change', () => { describe('when "path" prop is different', () => { test('resets isLoading state', () => { renderMock.mockClear(); - component.setProps({ path: documentPath2 }); + wrapper.setProps({ path: documentPath2 }); expect(renderMock).toHaveBeenCalledWith( expect.objectContaining({ @@ -147,7 +156,7 @@ describe('when props change', () => { }); test('wires up a new listener', () => { - component.setProps({ path: documentPath2 }); + wrapper.setProps({ path: documentPath2 }); expect(documentMock).toHaveBeenCalledTimes(2); expect(documentMock).toHaveBeenCalledWith(documentPath2); @@ -156,7 +165,7 @@ describe('when props change', () => { describe('when an unsubscribe listener exists', () => { test('unsubscribes active listener', () => { - component.setProps({ path: documentPath2 }); + wrapper.setProps({ path: documentPath2 }); expect(unsubscribeMock).toHaveBeenCalledTimes(1); }); @@ -166,7 +175,7 @@ describe('when props change', () => { test('does not execute an unsubscribe method', () => { unsubscribeMock.mockClear(); component.instance().unsubscribe = null; - component.setProps({ path: documentPath2 }); + wrapper.setProps({ path: documentPath2 }); expect(unsubscribeMock).not.toHaveBeenCalled(); }); diff --git a/src/__tests__/document.initial-state.js b/src/__tests__/document.initial-state.js index c95f5bd..c8dc315 100644 --- a/src/__tests__/document.initial-state.js +++ b/src/__tests__/document.initial-state.js @@ -1,20 +1,22 @@ import React from 'react'; import { mount } from 'enzyme'; -import { FirestoreDocument } from '../'; +import { FirestoreDocument, FirestoreProvider } from '../'; import { createMocksForDocument } from './helpers/firestore-utils'; test('initial state set up correctly', () => { const { - firestoreMock, + firebaseMock, documentMock, onSnapshotMock, } = createMocksForDocument(); const renderMock = jest.fn().mockReturnValue(
); const documentPath = 'users/1'; - mount(, { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }); + mount( + + + , + ); expect(documentMock).toHaveBeenCalledTimes(1); expect(documentMock).toHaveBeenCalledWith(documentPath); @@ -30,7 +32,7 @@ test('initial state set up correctly', () => { test('renders child prop', () => { const { - firestoreMock, + firebaseMock, documentMock, onSnapshotMock, } = createMocksForDocument(); @@ -38,10 +40,9 @@ test('renders child prop', () => { const documentPath = 'users/1'; mount( - {renderMock}, - { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }, + + {renderMock}, + , ); expect(documentMock).toHaveBeenCalledTimes(1); @@ -58,15 +59,17 @@ test('renders child prop', () => { test('renders nothing if passed no render prop or children', () => { const { - firestoreMock, + firebaseMock, documentMock, onSnapshotMock, } = createMocksForDocument(); const documentPath = 'users/1'; - mount(, { - context: { firestoreDatabase: firestoreMock, firestoreCache: {} }, - }); + mount( + + + , + ); expect(documentMock).toHaveBeenCalledTimes(1); expect(documentMock).toHaveBeenCalledWith(documentPath); diff --git a/src/__tests__/firestore.provides-database.js b/src/__tests__/firestore.provides-database.js index f42c408..846a930 100644 --- a/src/__tests__/firestore.provides-database.js +++ b/src/__tests__/firestore.provides-database.js @@ -1,15 +1,18 @@ import React from 'react'; import { mount } from 'enzyme'; -import { Firestore } from '../'; +import { Firestore, FirestoreProvider } from '../'; +import { createMocksForDocument } from './helpers/firestore-utils'; test('provides the firestore database in render function', () => { - const firestore = {}; + const { firebaseMock, firestoreMock } = createMocksForDocument(); const renderMock = jest.fn().mockReturnValue(
); - mount(, { - context: { firestoreDatabase: firestore }, - }); + mount( + + + , + ); expect(renderMock).toHaveBeenCalledTimes(1); - expect(renderMock).toHaveBeenCalledWith({ firestore }); + expect(renderMock).toHaveBeenCalledWith({ firestore: firestoreMock }); }); diff --git a/src/__tests__/helpers/firestore-utils.js b/src/__tests__/helpers/firestore-utils.js index 575cd11..04cdf0c 100644 --- a/src/__tests__/helpers/firestore-utils.js +++ b/src/__tests__/helpers/firestore-utils.js @@ -66,7 +66,12 @@ function createBaseMocks(snapshot, options) { doc: documentMock, }; + const firebaseMock = { + firestore: () => firestoreMock, + }; + return { + firebaseMock, firestoreMock, collectionMock, documentMock, diff --git a/src/__tests__/provider.adds-context.js b/src/__tests__/provider.adds-context.js deleted file mode 100644 index d6272a1..0000000 --- a/src/__tests__/provider.adds-context.js +++ /dev/null @@ -1,39 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { mount } from 'enzyme'; -import { FirestoreProvider } from '../'; - -const createChild = () => { - // eslint-disable-next-line react/prefer-stateless-function - class Child extends Component { - render() { - return null; - } - } - - Child.contextTypes = { - firestoreDatabase: PropTypes.object.isRequired, - firestoreCache: PropTypes.object.isRequired, - }; - - return Child; -}; - -test('database and cache are added to child context', () => { - const Child = createChild(); - const firestore = {}; - firestore.settings = jest.fn().mockReturnValue(firestore); - const firebase = { - firestore: jest.fn().mockReturnValueOnce(firestore), - }; - - const component = mount( - - - , - ); - const child = component.find('Child'); - - expect(child.instance().context.firestoreDatabase).toBe(firestore); - expect(child.instance().context.firestoreCache).toBeDefined(); -}); diff --git a/src/__tests__/withRouter.injects-database.js b/src/__tests__/withRouter.injects-database.js index 04c6801..19c0b0a 100644 --- a/src/__tests__/withRouter.injects-database.js +++ b/src/__tests__/withRouter.injects-database.js @@ -1,22 +1,31 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { mount } from 'enzyme'; -import { withFirestore } from '../'; +import { withFirestore, FirestoreProvider } from '../'; +import { createMocksForDocument } from './helpers/firestore-utils'; test('injects component with firestore database', () => { - const firestore = {}; - const emptyContext = {}; + const { firebaseMock, firestoreMock } = createMocksForDocument(); const mockFunctionalComponent = jest.fn().mockReturnValue(
); const Component = withFirestore(mockFunctionalComponent); - mount(, { - context: { firestoreDatabase: firestore }, - childContextTypes: { firestoreDatabase: PropTypes.object.isRequired }, - }); + mount( + + + , + ); expect(mockFunctionalComponent).toHaveBeenCalledTimes(1); expect(mockFunctionalComponent).toHaveBeenCalledWith( - { firestore }, - emptyContext, + { firestore: firestoreMock }, + {}, + ); +}); + +test('throws an error when the FirestoreProvider is missing', () => { + const mockFunctionalComponent = jest.fn().mockReturnValue(
); + const Component = withFirestore(mockFunctionalComponent); + + expect(() => mount()).toThrowError( + 'FirestoreProvider is missing', ); }); diff --git a/src/__tests__/withRouter.passes-props.js b/src/__tests__/withRouter.passes-props.js index a10c3e0..cf0523f 100644 --- a/src/__tests__/withRouter.passes-props.js +++ b/src/__tests__/withRouter.passes-props.js @@ -1,23 +1,23 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { mount } from 'enzyme'; -import { withFirestore } from '../'; +import { withFirestore, FirestoreProvider } from '../'; +import { createMocksForDocument } from './helpers/firestore-utils'; test('passes all props down to wrapped component', () => { - const firestore = {}; - const emptyContext = {}; + const { firebaseMock, firestoreMock } = createMocksForDocument(); const propsToBePassed = { propA: 'test' }; const mockFunctionalComponent = jest.fn().mockReturnValue(
); const Component = withFirestore(mockFunctionalComponent); - mount(, { - context: { firestoreDatabase: firestore }, - childContextTypes: { firestoreDatabase: PropTypes.object.isRequired }, - }); + mount( + + + , + ); expect(mockFunctionalComponent).toHaveBeenCalledTimes(1); expect(mockFunctionalComponent).toHaveBeenCalledWith( - { firestore, ...propsToBePassed }, - emptyContext, + { firestore: firestoreMock, ...propsToBePassed }, + {}, ); }); diff --git a/src/__tests__/withRouter.wrapped-ref.js b/src/__tests__/withRouter.wrapped-ref.js index 462d164..4e48710 100644 --- a/src/__tests__/withRouter.wrapped-ref.js +++ b/src/__tests__/withRouter.wrapped-ref.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; -import PropTypes from 'prop-types'; import { mount } from 'enzyme'; -import { withFirestore } from '../'; +import { withFirestore, FirestoreProvider } from '../'; +import { createMocksForDocument } from './helpers/firestore-utils'; const createChild = () => { // eslint-disable-next-line react/prefer-stateless-function @@ -15,27 +15,25 @@ const createChild = () => { }; test('passes wrappedComponentRef to wrapped component', () => { - const firestore = {}; + const { firebaseMock, firestoreMock } = createMocksForDocument(); const otherProps = { testProp: 'test' }; const Child = createChild(); const ComponentWithFirestore = withFirestore(Child); let wrappedRef; const component = mount( - { - wrappedRef = ref; - }} - />, - { - context: { firestoreDatabase: firestore }, - childContextTypes: { firestoreDatabase: PropTypes.object.isRequired }, - }, + + { + wrappedRef = ref; + }} + /> + , ); const child = component.find(Child); expect(wrappedRef).toBe(child.instance()); - expect(child.props()).toEqual({ firestore, ...otherProps }); + expect(child.props()).toEqual({ firestore: firestoreMock, ...otherProps }); }); diff --git a/src/withFirestore.js b/src/withFirestore.js index 39eba88..e7da9f7 100644 --- a/src/withFirestore.js +++ b/src/withFirestore.js @@ -1,24 +1,26 @@ import React from 'react'; import PropTypes from 'prop-types'; import hoistStatics from 'hoist-non-react-statics'; -import Firestore from './Firestore'; +import { FirestoreContext } from './FirestoreProvider'; const withFirestore = Component => { - const C = props => { - const { wrappedComponentRef, ...remainingProps } = props; - return ( - ( + const C = ({ wrappedComponentRef, ...remainingProps }) => ( + + {value => { + if (!value) { + throw new Error('FirestoreProvider is missing'); + } + const { firestoreDatabase } = value; + return ( - )} - /> - ); - }; - + ); + }} + + ); C.displayName = `withFirestore(${Component.displayName || Component.name})`; C.WrappedComponent = Component; C.propTypes = { diff --git a/yarn.lock b/yarn.lock index c73c7fa..4f14311 100644 --- a/yarn.lock +++ b/yarn.lock @@ -63,8 +63,9 @@ to-fast-properties "^2.0.0" "@types/node@*": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" + version "10.12.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.24.tgz#b13564af612a22a20b5d95ca40f1bffb3af315cf" + integrity sha512-GWWbvt+z9G5otRBW8rssOFgRY87J9N/qbhqfjMZ+gUuL6zoL+Hm6gP/8qQBG4jjimqdaNLCehcVapZ/Fs2WjCQ== abab@^1.0.3: version "1.0.4" @@ -277,6 +278,15 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array.prototype.flat@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz#812db8f02cad24d3fab65dd67eabe3b8903494a4" + integrity sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.10.0" + function-bind "^1.1.1" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -284,6 +294,7 @@ arrify@^1.0.0, arrify@^1.0.1: asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^4.0.0: version "4.9.2" @@ -1079,6 +1090,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= boom@2.x.x: version "2.10.1" @@ -1326,6 +1338,7 @@ chardet@^0.4.0: cheerio@^1.0.0-rc.2: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= dependencies: css-select "~1.2.0" dom-serializer "~0.1.0" @@ -1441,10 +1454,6 @@ color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -colors@0.5.x: - version "0.5.1" - resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" - combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" @@ -1459,6 +1468,11 @@ commander@^2.11.0, commander@^2.9.0, commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" +commander@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + commitizen@^2.9.6: version "2.9.6" resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-2.9.6.tgz#c0d00535ef264da7f63737edfda4228983fa2291" @@ -1537,6 +1551,7 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0: core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.4.0, core-js@^2.5.0: version "2.5.3" @@ -1545,6 +1560,7 @@ core-js@^2.4.0, core-js@^2.5.0: core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cosmiconfig@3.1.0, cosmiconfig@^3.1.0: version "3.1.0" @@ -1628,6 +1644,7 @@ crypto-browserify@^3.11.0: css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= dependencies: boolbase "~1.0.0" css-what "2.1" @@ -1635,8 +1652,9 @@ css-select@~1.2.0: nth-check "~1.0.1" css-what@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + version "2.1.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" + integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" @@ -1737,12 +1755,12 @@ deferred-leveldown@~0.2.0: dependencies: abstract-leveldown "~0.12.1" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + object-keys "^1.0.12" del@^2.0.2: version "2.2.2" @@ -1806,6 +1824,7 @@ diffie-hellman@^5.0.0: discontinuous-range@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= doctoc@^1.3.0: version "1.3.0" @@ -1834,6 +1853,7 @@ doctrine@^2.0.0, doctrine@^2.0.2: dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= dependencies: domelementtype "~1.1.1" entities "~1.1.1" @@ -1843,33 +1863,38 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" domelementtype@1, domelementtype@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= domexception@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" domhandler@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== dependencies: domelementtype "1" domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= dependencies: dom-serializer "0" domelementtype "1" domutils@^1.5.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff" + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: dom-serializer "0" domelementtype "1" @@ -1921,6 +1946,7 @@ emojis-list@^2.0.0: encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" @@ -1942,49 +1968,58 @@ enhanced-resolve@~0.9.0: tapable "^0.1.8" entities@^1.1.1, entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== enzyme-adapter-react-16@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz#a8f4278b47e082fbca14f5bfb1ee50ee650717b4" + version "1.9.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.9.1.tgz#6d49a3a31c3a0fccf527610f31b837e0f307128a" + integrity sha512-Egzogv1y77DUxdnq/CyHxLHaNxmSSKDDSDNNB/EiAXCZVFXdFibaNy2uUuRQ1n24T2m6KH/1Rw16XDRq+1yVEg== dependencies: - 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" + enzyme-adapter-utils "^1.10.0" + function.prototype.name "^1.1.0" + object.assign "^4.1.0" + object.values "^1.1.0" + prop-types "^15.6.2" + react-is "^16.7.0" react-test-renderer "^16.0.0-0" -enzyme-adapter-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.3.0.tgz#d6c85756826c257a8544d362cc7a67e97ea698c7" +enzyme-adapter-utils@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.10.0.tgz#5836169f68b9e8733cb5b69cad5da2a49e34f550" + integrity sha512-VnIXJDYVTzKGbdW+lgK8MQmYHJquTQZiGzu/AseCZ7eHtOMAj4Rtvk8ZRopodkfPves0EXaHkXBDkVhPa3t0jA== dependencies: - lodash "^4.17.4" - object.assign "^4.0.4" - prop-types "^15.6.0" + function.prototype.name "^1.1.0" + object.assign "^4.1.0" + object.fromentries "^2.0.0" + prop-types "^15.6.2" + semver "^5.6.0" enzyme@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.3.0.tgz#0971abd167f2d4bf3f5bd508229e1c4b6dc50479" + version "3.8.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.8.0.tgz#646d2d5d0798cb98fdec39afcee8a53237b47ad5" + integrity sha512-bfsWo5nHyZm1O1vnIsbwdfhU989jk+squU9NKvB+Puwo5j6/Wg9pN5CO0YJelm98Dao3NPjkDZk+vvgwpMwYxw== dependencies: + array.prototype.flat "^1.2.1" cheerio "^1.0.0-rc.2" - function.prototype.name "^1.0.3" - has "^1.0.1" + function.prototype.name "^1.1.0" + has "^1.0.3" is-boolean-object "^1.0.0" - is-callable "^1.1.3" + is-callable "^1.1.4" 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" + lodash.escape "^4.0.1" + lodash.isequal "^4.5.0" + object-inspect "^1.6.0" object-is "^1.0.1" object.assign "^4.1.0" object.entries "^1.0.4" object.values "^1.0.4" raf "^3.4.0" rst-selector-parser "^2.2.3" + string.prototype.trim "^1.1.2" errno@^0.1.1, errno@^0.1.3, errno@~0.1.1: version "0.1.6" @@ -1998,7 +2033,19 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: +es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.5.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.10.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" dependencies: @@ -2008,13 +2055,14 @@ es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: is-callable "^1.1.3" is-regex "^1.0.4" -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" +es-to-primitive@^1.1.1, es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.37" @@ -2434,8 +2482,9 @@ fb-watchman@^2.0.0: bser "^2.0.0" fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -2443,7 +2492,7 @@ fbjs@^0.8.16: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.9" + ua-parser-js "^0.7.18" figures@^1.3.5, figures@^1.7.0: version "1.7.0" @@ -2553,7 +2602,7 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" -foreach@^2.0.5, foreach@~2.0.1: +foreach@~2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" @@ -2621,13 +2670,15 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: +function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.0.3: +function.prototype.name@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327" + integrity sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg== dependencies: define-properties "^1.1.2" function-bind "^1.1.1" @@ -2811,16 +2862,18 @@ has-flag@^2.0.0: has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - function-bind "^1.0.2" + function-bind "^1.1.1" hash-base@^2.0.0: version "2.0.2" @@ -2903,7 +2956,19 @@ html-encoding-sniffer@^1.0.1: dependencies: whatwg-encoding "^1.0.1" -htmlparser2@^3.9.1, htmlparser2@~3.9.2: +htmlparser2@^3.9.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" + integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.0.6" + +htmlparser2@~3.9.2: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" dependencies: @@ -2942,10 +3007,17 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: +iconv-lite@0.4.19, iconv-lite@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + idb-wrapper@^1.5.0: version "1.7.2" resolved "https://registry.yarnpkg.com/idb-wrapper/-/idb-wrapper-1.7.2.tgz#8251afd5e77fe95568b1c16152eb44b396767ea2" @@ -3104,6 +3176,7 @@ is-binary-path@^1.0.0: is-boolean-object@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" + integrity sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M= is-buffer@^1.1.5: version "1.1.6" @@ -3115,9 +3188,10 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-ci@^1.0.10, is-ci@^1.1.0: version "1.1.0" @@ -3128,6 +3202,7 @@ is-ci@^1.0.10, is-ci@^1.1.0: is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= is-decimal@^1.0.0: version "1.0.1" @@ -3202,6 +3277,7 @@ is-module@^1.0.0: is-number-object@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" + integrity sha1-8mWrian0RQNO9q/xWo8AsA9VF5k= is-number@^2.1.0: version "2.1.0" @@ -3260,6 +3336,7 @@ is-promise@^2.1.0: is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" @@ -3280,18 +3357,24 @@ is-resolvable@^1.0.0: is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-string@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" + integrity sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ= is-subset@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" @@ -3344,6 +3427,7 @@ isobject@^2.0.0: isomorphic-fetch@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" @@ -3681,6 +3765,12 @@ jest@^22.0.4: js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.10.0" @@ -4095,9 +4185,15 @@ lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= lodash.get@^3.7.0: version "3.7.0" @@ -4114,6 +4210,11 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.map@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" @@ -4130,10 +4231,15 @@ lodash@4.17.2: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" -lodash@^4.11.2, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.1: +lodash@^4.11.2, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.15.0, lodash@^4.17.4: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -4161,7 +4267,14 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: +loose-envify@^1.0.0, loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -4314,6 +4427,11 @@ minimist@~0.0.1: dependencies: minimist "0.0.8" +moo@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" + integrity sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4335,16 +4453,20 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" nearley@^2.7.10: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.11.0.tgz#5e626c79a6cd2f6ab9e7e5d5805e7668967757ae" + version "2.16.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.16.0.tgz#77c297d041941d268290ec84b739d0ee297e83a7" + integrity sha512-Tr9XD3Vt/EujXbZBv6UAHYoLUSMQAxSsTnm9K3koXzjzNWY195NqALeyrzLZBKzAkL3gl92BcSogqrHjD8QuUg== dependencies: - nomnom "~1.6.2" + commander "^2.19.0" + moo "^0.4.3" railroad-diagrams "^1.0.0" - randexp "^0.4.2" + randexp "0.4.6" + semver "^5.4.1" node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -4406,13 +4528,6 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" -nomnom@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.6.2.tgz#84a66a260174408fc5b77a18f888eccc44fb6971" - dependencies: - colors "0.5.x" - underscore "~1.4.4" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -4469,8 +4584,9 @@ npmlog@^4.0.2: set-blocking "~2.0.0" nth-check@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" @@ -4489,18 +4605,22 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2: object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-inspect@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.5.0.tgz#9d876c11e40f485c79215670281b767488f9bfe3" +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" + integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= -object-keys@^1.0.11, object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== object-keys@~0.2.0: version "0.2.0" @@ -4514,9 +4634,10 @@ object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" -object.assign@^4.0.4, object.assign@^4.1.0: +object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== dependencies: define-properties "^1.1.2" function-bind "^1.1.1" @@ -4524,12 +4645,23 @@ object.assign@^4.0.4, object.assign@^4.1.0: object-keys "^1.0.11" object.entries@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519" + integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +object.fromentries@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab" + integrity sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA== dependencies: define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" + es-abstract "^1.11.0" + function-bind "^1.1.1" has "^1.0.1" object.getownpropertydescriptors@^2.0.3: @@ -4546,14 +4678,15 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -object.values@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" +object.values@^1.0.4, object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" octal@^1.0.0: version "1.0.0" @@ -4801,6 +4934,7 @@ performance-now@^0.2.0: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" @@ -4893,6 +5027,12 @@ process-es6@^0.11.2, process-es6@^0.11.3: process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process@^0.11.10: version "0.11.10" @@ -4905,6 +5045,7 @@ progress@^2.0.0: promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" @@ -4916,6 +5057,14 @@ prop-types@^15.6.0: loose-envify "^1.3.1" object-assign "^4.1.1" +prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== + dependencies: + loose-envify "^1.3.1" + object-assign "^4.1.1" + prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" @@ -4967,18 +5116,21 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" raf@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== dependencies: performance-now "^2.1.0" railroad-diagrams@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= -randexp@^0.4.2: +randexp@0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== dependencies: discontinuous-range "1.0.0" ret "~0.1.10" @@ -5012,40 +5164,40 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044" +react-dom@^16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.1.tgz#ec860f98853d09d39bafd3a6f1e12389d283dbb4" + integrity sha512-N74IZUrPt6UiDjXaO7UbDDFXeUXnVhZzeRLy/6iqqN1ipfjrhR60Bp5NuBK+rv3GMdqdIuwIl22u1SYwf330bg== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.13.1" -react-reconciler@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" +react-is@^16.7.0, react-is@^16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.1.tgz#a80141e246eb894824fb4f2901c0c50ef31d4cdb" + integrity sha512-ioMCzVDWvCvKD8eeT+iukyWrBGrA3DiFYkXfBsVYIRdaREZuBjENG+KjrikavCLasozqRWTwFUagU/O4vPpRMA== -react-test-renderer@^16.0.0-0, react-test-renderer@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211" +react-test-renderer@^16.0.0-0, react-test-renderer@^16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.1.tgz#72845ad9269be526126e97853311982f781767be" + integrity sha512-Bd21TN3+YVl6GZwav6O0T6m5UwGfOj+2+xZH5VH93ToD6M5uclN/c+R1DGX49ueG413KZPUx7Kw3sOYz2aJgfg== dependencies: - fbjs "^0.8.16" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + react-is "^16.8.1" + scheduler "^0.13.1" -react@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" +react@^16.8.1: + version "16.8.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.1.tgz#ae11831f6cb2a05d58603a976afc8a558e852c4a" + integrity sha512-wLw5CFGPdo7p/AgteFz7GblI2JPOos0+biSoxf1FPsGxWQZdN/pj6oToJs1crn61DL3Ln7mN86uZ4j74p31ELQ== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.13.1" read-pkg-up@^1.0.1: version "1.0.1" @@ -5101,7 +5253,7 @@ readable-stream@^1.0.26-4: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.3.3: +readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -5113,6 +5265,28 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@^2.0.2: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.1.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" + integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.26, readable-stream@~1.0.26-4: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -5379,6 +5553,7 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== right-align@^0.1.1: version "0.1.3" @@ -5480,6 +5655,7 @@ rollup@^0.53.3: rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" + integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE= dependencies: lodash.flattendeep "^4.4.0" nearley "^2.7.10" @@ -5514,10 +5690,20 @@ rxjs@^5.4.2: dependencies: symbol-observable "1.0.1" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + sane@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" @@ -5536,10 +5722,23 @@ sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +scheduler@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.1.tgz#1a217df1bfaabaf4f1b92a9127d5d732d85a9591" + integrity sha512-VJKOkiKIN2/6NOoexuypwSrybx13MY7NSy9RNt8wPvZDMRT1CW6qlpF5jXRToXNHz3uWzbm2elNpZfXfGPqP9A== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + semver@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz#b9848f25d6cf36333073ec9ef8856d42f1233e52" @@ -5555,6 +5754,7 @@ set-immediate-shim@^1.0.1: setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.9" @@ -5749,9 +5949,26 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string.prototype.trim@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + string_decoder@^1.0.0, string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" @@ -5759,6 +5976,13 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-entities@^1.0.1: version "1.3.1" resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.1.tgz#b150ec2d72ac4c1b5f324b51fb6b28c9cdff058c" @@ -6018,9 +6242,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -ua-parser-js@^0.7.9: - version "0.7.17" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" +ua-parser-js@^0.7.18: + version "0.7.19" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" + integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== uglify-js@^2.6, uglify-js@^2.8.29: version "2.8.29" @@ -6058,10 +6283,6 @@ unc-path-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" -underscore@~1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" - underscore@~1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" @@ -6115,9 +6336,10 @@ user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@^1.0.0: version "1.0.0" @@ -6241,8 +6463,9 @@ whatwg-encoding@^1.0.1: iconv-lite "0.4.19" whatwg-fetch@>=0.10.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== whatwg-url@^6.3.0: version "6.4.0"