diff --git a/lib/DataCell.js b/lib/DataCell.js index 3664bed..13f2c3d 100644 --- a/lib/DataCell.js +++ b/lib/DataCell.js @@ -49,7 +49,7 @@ var DataCell = function (_PureComponent) { }, { key: 'componentDidUpdate', value: function componentDidUpdate(prevProps) { - if (prevProps.editing === true && this.props.editing === false) { + if (prevProps.editing === true && this.props.editing === false && this.props.reverting === false) { this.onChange(this._input.value); } if (prevProps.editing === false && this.props.editing === true) { diff --git a/lib/DataSheet.js b/lib/DataSheet.js index 9762c42..c6fb0e0 100644 --- a/lib/DataSheet.js +++ b/lib/DataSheet.js @@ -34,6 +34,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var TAB_KEY = 9; var ENTER_KEY = 13; +var ESCAPE_KEY = 27; var LEFT_KEY = 37; var UP_KEY = 38; var RIGHT_KEY = 39; @@ -81,6 +82,7 @@ var DataSheet = function (_PureComponent) { selecting: false, forceEdit: false, editing: {}, + reverting: {}, clear: {} }; _this.state = _this.defaultState; @@ -231,6 +233,7 @@ var DataSheet = function (_PureComponent) { var ctrlKeyPressed = e.ctrlKey || e.metaKey; var deleteKeysPressed = e.keyCode === DELETE_KEY || e.keyCode === BACKSPACE_KEY; var enterKeyPressed = e.keyCode === ENTER_KEY; + var escapeKeyPressed = e.keyCode === ESCAPE_KEY; var numbersPressed = e.keyCode >= 48 && e.keyCode <= 57; var lettersPressed = e.keyCode >= 65 && e.keyCode <= 90; var numPadKeysPressed = e.keyCode >= 96 && e.keyCode <= 105; @@ -255,15 +258,18 @@ var DataSheet = function (_PureComponent) { }); e.preventDefault(); } else if (enterKeyPressed && isEditing) { - this.setState({ editing: {} }); + this.setState({ editing: {}, reverting: {} }); + } else if (escapeKeyPressed && isEditing) { + this.setState({ editing: {}, reverting: editing }); } else if (enterKeyPressed && !isEditing && !cell.readOnly) { - this.setState({ editing: start, clear: {}, forceEdit: true }); + this.setState({ editing: start, clear: {}, reverting: {}, forceEdit: true }); } else if (numbersPressed || numPadKeysPressed || lettersPressed || equationKeysPressed || enterKeyPressed) { //empty out cell if user starts typing without pressing enter if (!isEditing && !cell.readOnly) { this.setState({ editing: start, clear: start, + reverting: {}, forceEdit: false }); } @@ -350,6 +356,9 @@ var DataSheet = function (_PureComponent) { var isEditing = function isEditing(i, j) { return _this4.state.editing.i === i && _this4.state.editing.j === j; }; + var isReverting = function isReverting(i, j) { + return _this4.state.reverting.i === i && _this4.state.reverting.j === j; + }; var shouldClear = function shouldClear(i, j) { return _this4.state.clear.i === i && _this4.state.clear.j === j; }; @@ -376,7 +385,9 @@ var DataSheet = function (_PureComponent) { onMouseDown: cell.disableEvents ? nullFtn : _this4.onMouseDown, onDoubleClick: cell.disableEvents ? nullFtn : _this4.onDoubleClick, onMouseOver: cell.disableEvents ? nullFtn : _this4.onMouseOver, - onContextMenu: cell.disableEvents ? nullFtn : _this4.onContextMenu, editing: isEditing(i, j), + onContextMenu: cell.disableEvents ? nullFtn : _this4.onContextMenu, + editing: isEditing(i, j), + reverting: isReverting(i, j), colSpan: cell.colSpan, value: valueRenderer(cell) }; diff --git a/src/DataCell.js b/src/DataCell.js index 015f410..91146f9 100644 --- a/src/DataCell.js +++ b/src/DataCell.js @@ -15,7 +15,7 @@ export default class DataCell extends PureComponent { } componentDidUpdate(prevProps) { - if (prevProps.editing === true && this.props.editing === false) { + if (prevProps.editing === true && this.props.editing === false && this.props.reverting === false) { this.onChange(this._input.value); } if (prevProps.editing === false && this.props.editing === true) { diff --git a/src/DataSheet.js b/src/DataSheet.js index 2a6f535..7e88058 100644 --- a/src/DataSheet.js +++ b/src/DataSheet.js @@ -5,6 +5,7 @@ import ComponentCell from './ComponentCell'; const TAB_KEY = 9; const ENTER_KEY = 13; +const ESCAPE_KEY = 27; const LEFT_KEY = 37; const UP_KEY = 38; const RIGHT_KEY = 39; @@ -46,6 +47,7 @@ export default class DataSheet extends PureComponent { selecting: false, forceEdit: false, editing: {}, + reverting: {}, clear: {} }; this.state = this.defaultState; @@ -96,7 +98,7 @@ export default class DataSheet extends PureComponent { handlePaste(e) { if(isEmpty(this.state.editing)) { const start = this.state.start; - + const pastedMap = []; const pasteData = e.clipboardData .getData('text/plain') @@ -113,7 +115,7 @@ export default class DataSheet extends PureComponent { this.onChange(start.i + i, start.j + j, pastedData); end = {i: start.i + i, j: start.j + j}; } - + }); pastedMap.push(rowData); }); @@ -176,6 +178,7 @@ export default class DataSheet extends PureComponent { const ctrlKeyPressed = e.ctrlKey || e.metaKey; const deleteKeysPressed = (e.keyCode === DELETE_KEY || e.keyCode === BACKSPACE_KEY); const enterKeyPressed = e.keyCode === ENTER_KEY; + const escapeKeyPressed = e.keyCode === ESCAPE_KEY; const numbersPressed = (e.keyCode >= 48 && e.keyCode <= 57); const lettersPressed = (e.keyCode >= 65 && e.keyCode <= 90); const numPadKeysPressed = (e.keyCode >= 96 && e.keyCode <= 105); @@ -200,9 +203,11 @@ export default class DataSheet extends PureComponent { ); e.preventDefault(); } else if (enterKeyPressed && isEditing) { - this.setState({editing: {}}); + this.setState({editing: {}, reverting: {}}); + } else if (escapeKeyPressed && isEditing) { + this.setState({editing: {}, reverting: editing}); } else if (enterKeyPressed && !isEditing && !cell.readOnly) { - this.setState({editing: start, clear: {}, forceEdit: true}); + this.setState({editing: start, clear: {}, reverting: {}, forceEdit: true}); } else if (numbersPressed || numPadKeysPressed || lettersPressed @@ -214,6 +219,7 @@ export default class DataSheet extends PureComponent { this.setState({ editing: start, clear: start, + reverting: {}, forceEdit: false }); } @@ -288,6 +294,7 @@ export default class DataSheet extends PureComponent { }; const isEditing = (i, j) => this.state.editing.i === i && this.state.editing.j === j; + const isReverting = (i, j) => this.state.reverting.i === i && this.state.reverting.j === j; const shouldClear = (i, j) => this.state.clear.i === i && this.state.clear.j === j; return this.dgDom = r} className={'data-grid ' + (className ? className : '')}> @@ -305,7 +312,9 @@ export default class DataSheet extends PureComponent { onMouseDown: cell.disableEvents ? nullFtn : this.onMouseDown, onDoubleClick: cell.disableEvents ? nullFtn : this.onDoubleClick, onMouseOver: cell.disableEvents ? nullFtn : this.onMouseOver, - onContextMenu: cell.disableEvents ? nullFtn : this.onContextMenu,editing: isEditing(i, j), + onContextMenu: cell.disableEvents ? nullFtn : this.onContextMenu, + editing: isEditing(i, j), + reverting: isReverting(i, j), colSpan: cell.colSpan, value: valueRenderer(cell), }; diff --git a/test/Datasheet.js b/test/Datasheet.js index a13cf42..e8c75a1 100644 --- a/test/Datasheet.js +++ b/test/Datasheet.js @@ -15,6 +15,7 @@ import jsdom from 'mocha-jsdom'; const TAB_KEY = 9; const ENTER_KEY = 13; +const ESCAPE_KEY = 27; const RIGHT_KEY = 39; const LEFT_KEY = 37; const UP_KEY = 38; @@ -50,9 +51,9 @@ describe('Component', () => { const onDoubleClick = sinon.spy(); const onContextMenu = sinon.spy(); const wrapper = shallow( - { 5 ).html()) - + wrapper.simulate('mousedown'); wrapper.simulate('doubleclick'); wrapper.simulate('mouseover'); @@ -88,19 +89,19 @@ describe('Component', () => { it('should properly all update functions and render reading mode to editing mode ', () => { const props = { - editing: false, - selected: false, - value: 5, - data: 5, - row: 1, - col: 1, - onMouseDown: () => {}, - onMouseOver: () => {}, + editing: false, + selected: false, + value: 5, + data: 5, + row: 1, + col: 1, + onMouseDown: () => {}, + onMouseOver: () => {}, onDoubleClick: () => {}, onContextMenu: () => {}, } const wrapper = shallow( - ); @@ -121,19 +122,19 @@ describe('Component', () => { it('should properly render a flash when value changes', () => { const props = { - editing: false, - selected: false, - value: 5, - data: 5, - row: 1, - col: 1, - onMouseDown: () => {}, - onMouseOver: () => {}, + editing: false, + selected: false, + value: 5, + data: 5, + row: 1, + col: 1, + onMouseDown: () => {}, + onMouseOver: () => {}, onDoubleClick: () => {}, onContextMenu: () => {}, } const wrapper = shallow( - ); @@ -143,8 +144,8 @@ describe('Component', () => { 6 ).html()); - }) - }) + }) + }) describe('editing', () => { let onChange = null; @@ -154,15 +155,16 @@ describe('Component', () => { beforeEach(() => { wrapper && wrapper.detach(); props = { - editing: false, - selected: false, + editing: false, + reverting: false, + selected: false, value: '2', data: '5', - row: 1, - col: 2, + row: 1, + col: 2, onChange: sinon.spy(), - onMouseDown: () => {}, - onDoubleClick: () => {}, + onMouseDown: () => {}, + onDoubleClick: () => {}, onMouseOver: () => {}, onContextMenu: () => {}, } @@ -186,24 +188,24 @@ describe('Component', () => { wrapper.setProps({ editing: false, selected: true }); expect(props.onChange.called).toEqual(true); expect(props.onChange.calledWith(props.row, props.col, '6')).toEqual(true); - }) + }) it('input value should be cleared if we go into editing with clear call', () => { wrapper.setProps({ editing: true, selected: true, clear: true}); expect(wrapper.find('input').node.value).toEqual(''); - }) + }) it('input value should be set to value if data is null', () => { wrapper.setProps({ data: null}); wrapper.setProps({ editing: true, selected: true}); expect(wrapper.find('input').node.value).toEqual('2'); - + wrapper.find('input').node.value = '2'; console.log(wrapper.props) wrapper.find('input').simulate('change'); wrapper.setProps({ editing: false, selected: true }); expect(props.onChange.called).toEqual(false) - }) + }) }) }) @@ -216,11 +218,11 @@ describe('Component', () => { const onDoubleClick = sinon.spy(); const onContextMenu = sinon.spy(); const wrapper = shallow( - { wrapper.unmount(); }) - }) + }) describe('rendering', () => { it('should properly render a change (flashing)', (done) => { const wrapper = shallow( - { } }, 750) }) - }) + }) }) describe('Shallow DataSheet component', () => { @@ -368,11 +370,11 @@ describe('Component', () => { customWrapper = null; } }) - describe("rendering with varying props", () => { + describe("rendering with varying props", () => { it('renders the proper elements', () => { expect(wrapper.find('table').length).toEqual(1); expect(_.values(wrapper.find('table').node.classList)).toEqual(['data-grid', 'test']) - + expect(wrapper.find('td > span').length).toEqual(4); expect(wrapper.find('td > span').nodes.map(n => n.innerHTML)).toEqual(['4', '2', '3', '5']); }) @@ -382,7 +384,7 @@ describe('Component', () => { expect(wrapper.find('table tr').at(1).key()).toEqual('custom_key_1'); expect(wrapper.find(DataCell).at(1).key()).toEqual('custom_key'); }) - + it('sets the proper classes for the cells', () => { expect(wrapper.find('td').nodes.map(n => _.values(n.classList).sort())) .toEqual([ @@ -462,6 +464,7 @@ describe('Component', () => { end: {}, selecting: false, editing: {}, + reverting: {}, forceEdit: false, clear: {} }) @@ -470,22 +473,22 @@ describe('Component', () => { describe("selection", () => { it('selects a single field properly', () => { - + expect(wrapper.find('td.cell.selected').length).toEqual(0); wrapper.find('td').at(1).simulate('mouseDown'); wrapper.find('td').at(1).simulate('mouseUp'); expect(wrapper.find('td.cell.selected').length).toEqual(1); expect(wrapper.find('td.cell.selected span').nodes[0].innerHTML).toEqual('2'); }); - - + + it('selects multiple field properly 2x2 (hold left click)', () => { expect(wrapper.find('td.cell.selected').length).toEqual(0); wrapper.find('td').at(0).simulate('mouseDown'); wrapper.find('td').at(3).simulate('mouseOver'); expect(wrapper.find('td.cell.selected').length).toEqual(4); expect(wrapper.find('td.cell.selected span').nodes.map(n => n.innerHTML)).toEqual(['4', '2', '3', '5']); - + expect(wrapper.state('selecting')).toEqual(true); expect(wrapper.state('editing')).toEqual({}); expect(wrapper.state('start')).toEqual({ @@ -497,11 +500,11 @@ describe('Component', () => { j: 1 }); }); - + it('selects multiple field properly 2x2 and stay selected after releasing mouse button', () => { let mouseUpEvt = document.createEvent("HTMLEvents"); mouseUpEvt.initEvent("mouseup", false, true); - + expect(wrapper.find('.selected').length).toEqual(0); expect(wrapper.find('td.cell').length).toEqual(4); wrapper.find('td').at(0).simulate('mouseDown'); @@ -510,7 +513,7 @@ describe('Component', () => { expect(wrapper.state('end')).toEqual({ i: 1, j: 1 }); expect(wrapper.state('selecting')).toEqual(true); document.dispatchEvent(mouseUpEvt); - expect(wrapper.state('selecting')).toEqual(false); + expect(wrapper.state('selecting')).toEqual(false); }); it('calls onSelect prop when a new element is selected', (done) => { @@ -522,7 +525,7 @@ describe('Component', () => { {(cell) => { try { expect(cell).toEqual({data: 4, className: 'test1'}); - done(); + done(); } catch(err) { done(err) @@ -530,14 +533,14 @@ describe('Component', () => { }} valueRenderer = {(cell) => cell.data} onChange = {(cell, i, j, value) => custData[i][j].data = value} - />); + />); customWrapper.find('td').at(0).simulate('mouseDown'); expect(customWrapper.state('end')).toEqual({i: 0, j: 0}); }); }); - - describe("keyboard movement", () => { + + describe("keyboard movement", () => { it('moves right with arrow keys', () => { wrapper.find('td').at(0).simulate('mouseDown'); expect(wrapper.state('start')).toEqual({i: 0, j: 0}); @@ -578,7 +581,7 @@ describe('Component', () => { expect(wrapper.state('start')).toEqual({i: 0, j: 0}); }) }) - + describe("editing", () => { let cells = null; beforeEach(() => { @@ -603,7 +606,6 @@ describe('Component', () => { }); it('starts editing when double clicked', () => { - expect(wrapper.find('td.cell.selected').length).toEqual(0); cells.at(3).simulate('mousedown'); dispatchKeyDownEvent(ENTER_KEY); expect(wrapper.state('editing')).toEqual({ @@ -622,7 +624,7 @@ describe('Component', () => { }); it('starts editing certain keys are pressed', () => { - //[0 , 9 ,a , z , 0 , 9 , + , = , decim] + //[0 , 9 ,a , z , 0 , 9 , + , = , decim] [48, 57, 65, 90, 96, 105, 107, 187, 189].map(charCode => { cells.at(0).simulate('mousedown'); dispatchKeyDownEvent(charCode); @@ -634,7 +636,7 @@ describe('Component', () => { it('does not start editing if cell is readOnly', () => { wrapper.setProps({data: [[{data: 1, readOnly: true},{data: 2, readOnly: true}]]}); - //[0 , 9 ,a , z , 0 , 9 , + , = , decim] + //[0 , 9 ,a , z , 0 , 9 , + , = , decim] [48, 57, 65, 90, 96, 105, 107, 187, 189].map(charCode => { cells.at(0).simulate('mousedown'); dispatchKeyDownEvent(charCode); @@ -664,6 +666,17 @@ describe('Component', () => { expect(wrapper.state('editing')).toEqual({}) }); + it('goes out of edit mode and reverts to original value when ESCAPE is pressed', () => { + cells.at(0).simulate('mouseDown'); + dispatchKeyDownEvent('1'.charCodeAt(0)); + wrapper.find('td.cell.selected input').node.value = 213; + wrapper.find('td.cell.selected input').simulate('change'); + dispatchKeyDownEvent(ESCAPE_KEY); + expect(data[0][0].data).toEqual(4); + expect(wrapper.state('editing')).toEqual({}); + expect(wrapper.state('reverting')).toEqual({ i: 0, j: 0 }); + }); + it('updates value properly after double clicking', () => { cells.at(0).simulate('mouseDown'); cells.at(0).simulate('mouseUp'); @@ -674,10 +687,11 @@ describe('Component', () => { end: { i: 0, j: 0 }, selecting: true, editing: { i: 0, j: 0 }, + reverting: {}, forceEdit: true, clear: {} }); - + cells.at(0).find('input').node.value = 213; cells.at(0).find('input').simulate('change'); dispatchKeyDownEvent(RIGHT_KEY); @@ -691,10 +705,11 @@ describe('Component', () => { cells.at(0).simulate('mouseUp'); dispatchKeyDownEvent('1'.charCodeAt(0)); expect(wrapper.state()).toEqual({ - start: { i: 0, j: 0 }, - end: { i: 0, j: 0 }, + start: { i: 0, j: 0 }, + end: { i: 0, j: 0 }, selecting: true, editing: { i: 0, j: 0 }, + reverting: {}, forceEdit: false, clear: { i: 0, j: 0 } }); @@ -705,10 +720,11 @@ describe('Component', () => { dispatchKeyDownEvent(RIGHT_KEY); expect(data[0][0].data).toEqual(213) expect(wrapper.state()).toEqual({ - start: { i: 0, j: 1 }, //RIGHT_KEY movement + start: { i: 0, j: 1 }, //RIGHT_KEY movement end: { i: 0, j: 1 }, //RIGHT_KEY movement selecting: true, editing: {}, + reverting: {}, forceEdit: false, clear: { i: 0, j: 0 } }); @@ -716,26 +732,28 @@ describe('Component', () => { it('doesn\'t moves to the next cell on left/right arrow if cell is a component', () => { - data[0][0].component =
HELLO
+ data[0][0].component =
HELLO
wrapper.setProps({data: data}); expect(wrapper.exists(
HELLO
)).toEqual(true); cells.at(0).simulate('mouseDown'); cells.at(0).simulate('mouseUp'); dispatchKeyDownEvent('1'.charCodeAt(0)); expect(wrapper.state()).toEqual({ - start: { i: 0, j: 0 }, - end: { i: 0, j: 0 }, + start: { i: 0, j: 0 }, + end: { i: 0, j: 0 }, selecting: true, editing: { i: 0, j: 0 }, + reverting: {}, forceEdit: false, clear: { i: 0, j: 0 } }); dispatchKeyDownEvent(RIGHT_KEY); expect(wrapper.state()).toEqual({ - start: { i: 0, j: 0 }, //RIGHT_KEY movement + start: { i: 0, j: 0 }, //RIGHT_KEY movement end: { i: 0, j: 0 }, //RIGHT_KEY movement selecting: true, editing: { i: 0, j: 0 }, + reverting: {}, forceEdit: false, clear: { i: 0, j: 0 } }); @@ -746,7 +764,7 @@ describe('Component', () => { const evt = document.createEvent("HTMLEvents"); evt.initEvent('copy', false, true); evt.clipboardData = { setData: (type, text)=> { copied = text}}; - + cells.at(0).simulate('mouseDown'); cells.at(3).simulate('mouseOver'); document.dispatchEvent(evt); @@ -779,12 +797,12 @@ describe('Component', () => { const evt = document.createEvent("HTMLEvents"); evt.initEvent('copy', false, true); evt.clipboardData = { setData: (type, text)=> { pasted = text}}; - - expect(wrapper.state('start')).toEqual({}); + + expect(wrapper.state('start')).toEqual({}); document.dispatchEvent(evt); expect(pasted).toEqual(""); }); - + it('does not paste data if no cell is selected', () => { const evt = document.createEvent("HTMLEvents"); evt.initEvent("paste", false, true); @@ -796,7 +814,7 @@ describe('Component', () => { it('pastes data properly', () => { cells.at(0).simulate('mouseDown'); expect(wrapper.state('end')).toEqual({i: 0, j: 0}); - + const evt = document.createEvent("HTMLEvents"); evt.initEvent("paste", false, true); evt.clipboardData = { getData: (type)=> '99\t100\n1001\t1002'}; @@ -860,10 +878,10 @@ describe('Component', () => { [ {cell: datacust[0][0], data: '99'}, {cell: datacust[0][1], data: '100'} - ], + ], [ - {cell: undefined, data: '1001'}, - {cell: undefined, data: '1002'}, + {cell: undefined, data: '1001'}, + {cell: undefined, data: '1002'}, ] ]); done(); @@ -871,7 +889,7 @@ describe('Component', () => { catch(err) { done(err); } - + }} /> ); @@ -881,7 +899,7 @@ describe('Component', () => { evt.clipboardData = { getData: (type)=> '99\t100\n1001\t1002'}; document.dispatchEvent(evt); }); - + it('stops editing on outside page click', () => { @@ -889,15 +907,16 @@ describe('Component', () => { cell.simulate('mouseDown'); cell.simulate('doubleClick'); triggerMouseEvent(document, 'mousedown'); - + expect(wrapper.state()).toEqual({ start: {}, end: {}, selecting: false, editing: {}, + reverting: {}, forceEdit: false, clear: {} - }); + }); }); it('pageClick does not execute if the mouse click is within', () => { @@ -915,9 +934,10 @@ describe('Component', () => { end: {i: 0, j: 0}, selecting: true, editing: {}, + reverting: {}, forceEdit: false, clear: {} - }); + }); }) it('delete on DELETE_KEY', () => { const cell = wrapper.find('td').first(); @@ -955,7 +975,7 @@ describe('Component', () => { catch(err) { done(err); } - + }} /> ); diff --git a/yarn.lock b/yarn.lock index 25c3c24..e01e0ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -377,15 +377,6 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-loader@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" - dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.16" - mkdirp "^0.5.1" - object-assign "^4.0.1" - babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -843,10 +834,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" - binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" @@ -1296,10 +1283,6 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" @@ -1494,10 +1477,6 @@ esprima@^2.6.0, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - esrecurse@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" @@ -2290,20 +2269,13 @@ js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" -js-yaml@3.6.1: +js-yaml@3.6.1, js-yaml@^3.5.1: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" dependencies: argparse "^1.0.7" esprima "^2.6.0" -js-yaml@^3.5.1: - version "3.8.3" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.3.tgz#33a05ec481c850c8875929166fe1beb61c728766" - dependencies: - argparse "^1.0.7" - esprima "^3.1.1" - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -2416,15 +2388,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-utils@^0.2.16: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -2563,7 +2526,7 @@ 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.0.0, loose-envify@^1.1.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: @@ -3063,6 +3026,13 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +prop-types@^15.5.10: + version "15.5.10" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + prop-types@^15.5.2, prop-types@~15.5.0: version "15.5.6" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.6.tgz#797a915b1714b645ebb7c5d6cc690346205bd2aa"