From 2188d3a0e2b0518db180bf1475a792f98b313cd6 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Sun, 22 Dec 2019 00:26:51 +0100 Subject: [PATCH 001/117] Context menu with quick filter initials --- .../BrowserCell/BrowserCell.react.js | 18 ++++++++-- src/components/BrowserRow/BrowserRow.react.js | 6 ++-- .../Data/Browser/BrowserTable.react.js | 6 ++-- .../Data/Browser/ContextMenu.react.js | 35 +++++++++++++++++++ .../Data/Browser/DataBrowser.react.js | 17 +++++++-- 5 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 src/dashboard/Data/Browser/ContextMenu.react.js diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index b2045d6d4a..ce656ac3f2 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -63,7 +63,7 @@ export default class BrowserCell extends Component { } render() { - let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, onPointerClick, row, col } = this.props; + let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, setContextMenu, onPointerClick, row, col } = this.props; let content = value; this.copyableValue = content; let classes = [styles.cell, unselectable]; @@ -143,7 +143,7 @@ export default class BrowserCell extends Component { ); this.copyableValue = undefined; } - + if (current) { classes.push(styles.current); } @@ -169,6 +169,20 @@ export default class BrowserCell extends Component { } onEditChange(true); } + }} + onContextMenu={e => { + if (e.type === 'contextmenu') { + e.preventDefault(); + onSelect({ row, col }); + setCopyableValue(hidden ? undefined : this.copyableValue); + + const { pageX, pageY } = e; + setContextMenu({ pageX, pageY }, { + field: this.props.field, + value: this.copyableValue + }); + + } }}> {content} diff --git a/src/components/BrowserRow/BrowserRow.react.js b/src/components/BrowserRow/BrowserRow.react.js index 11aff817ed..e164589a0d 100644 --- a/src/components/BrowserRow/BrowserRow.react.js +++ b/src/components/BrowserRow/BrowserRow.react.js @@ -19,7 +19,7 @@ export default class BrowserRow extends Component { } render() { - const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation } = this.props; + const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation, setContextMenu } = this.props; let attributes = obj.attributes; return (
@@ -61,6 +61,7 @@ export default class BrowserRow extends Component { return (
diff --git a/src/dashboard/Data/Browser/BrowserTable.react.js b/src/dashboard/Data/Browser/BrowserTable.react.js index 4b5b95255f..b10fd53d15 100644 --- a/src/dashboard/Data/Browser/BrowserTable.react.js +++ b/src/dashboard/Data/Browser/BrowserTable.react.js @@ -137,7 +137,8 @@ export default class BrowserTable extends React.Component { setCurrent={this.props.setCurrent} setEditing={this.props.setEditing} setRelation={this.props.setRelation} - setCopyableValue={this.props.setCopyableValue} /> + setCopyableValue={this.props.setCopyableValue} + setContextMenu={this.props.setContextMenu} /> ); } @@ -170,7 +171,8 @@ export default class BrowserTable extends React.Component { setCurrent={this.props.setCurrent} setEditing={this.props.setEditing} setRelation={this.props.setRelation} - setCopyableValue={this.props.setCopyableValue} /> + setCopyableValue={this.props.setCopyableValue} + setContextMenu={this.props.setContextMenu} /> } if (this.props.editing) { diff --git a/src/dashboard/Data/Browser/ContextMenu.react.js b/src/dashboard/Data/Browser/ContextMenu.react.js new file mode 100644 index 0000000000..e65b215d65 --- /dev/null +++ b/src/dashboard/Data/Browser/ContextMenu.react.js @@ -0,0 +1,35 @@ +import React from 'react'; +import { List, Map } from 'immutable'; + +let ContextMenu = ({ position, entity, onFilterChange, hide }) => { + if (!position) { return null; } + + const { pageX, pageY } = position; + + + return
{ + const filters = new List(); + onFilterChange(filters.push(new Map({ + field: entity.field, + constraint: 'eq', + compareTo: entity.value + }))); + hide(); + }} + >Filter by this value
; +} + +// BrowserContextMenu.propTypes = { +// prop1: PropTypes.string.isRequired.describe('Replace me with the actual props'), +// } + +export default ContextMenu; diff --git a/src/dashboard/Data/Browser/DataBrowser.react.js b/src/dashboard/Data/Browser/DataBrowser.react.js index 105ff4d908..24e9662469 100644 --- a/src/dashboard/Data/Browser/DataBrowser.react.js +++ b/src/dashboard/Data/Browser/DataBrowser.react.js @@ -8,6 +8,7 @@ import copy from 'copy-to-clipboard'; import BrowserTable from 'dashboard/Data/Browser/BrowserTable.react'; import BrowserToolbar from 'dashboard/Data/Browser/BrowserToolbar.react'; +import ContextMenu from 'dashboard/Data/Browser/ContextMenu.react'; import * as ColumnPreferences from 'lib/ColumnPreferences'; import ParseApp from 'lib/ParseApp'; import React from 'react'; @@ -43,6 +44,7 @@ export default class DataBrowser extends React.Component { this.setEditing = this.setEditing.bind(this); this.handleColumnsOrder = this.handleColumnsOrder.bind(this); this.setCopyableValue = this.setCopyableValue.bind(this); + this.setContextMenu = this.setContextMenu.bind(this); this.saveOrderTimeout = null; } @@ -202,13 +204,17 @@ export default class DataBrowser extends React.Component { this.setState({ current }); } } - + setCopyableValue(copyableValue) { if (this.state.copyableValue !== copyableValue) { this.setState({ copyableValue }); } } + setContextMenu(position, entity) { + this.setState({ position, entity }); + } + handleColumnsOrder(order) { this.setState({ order: [ ...order ] }, () => { this.updatePreferences(order); @@ -230,6 +236,7 @@ export default class DataBrowser extends React.Component { setEditing={this.setEditing} setCurrent={this.setCurrent} setCopyableValue={this.setCopyableValue} + setContextMenu={this.setContextMenu} {...other} /> + {...other} /> + ); } From 01cdadf99ed264e20794ddbae4203fab53dbdd53 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Sun, 22 Dec 2019 01:26:58 +0100 Subject: [PATCH 002/117] Support for filtering Pointer type of entities --- src/components/BrowserCell/BrowserCell.react.js | 3 ++- src/dashboard/Data/Browser/ContextMenu.react.js | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index ce656ac3f2..c5fa502a3c 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -179,7 +179,8 @@ export default class BrowserCell extends Component { const { pageX, pageY } = e; setContextMenu({ pageX, pageY }, { field: this.props.field, - value: this.copyableValue + value: this.props.value, + type: this.props.type }); } diff --git a/src/dashboard/Data/Browser/ContextMenu.react.js b/src/dashboard/Data/Browser/ContextMenu.react.js index e65b215d65..f04b534e97 100644 --- a/src/dashboard/Data/Browser/ContextMenu.react.js +++ b/src/dashboard/Data/Browser/ContextMenu.react.js @@ -18,10 +18,24 @@ let ContextMenu = ({ position, entity, onFilterChange, hide }) => { cursor: 'pointer' }} onClick={() => { const filters = new List(); + + + let compareTo; + switch (entity.type) { + case 'Pointer': + compareTo = entity.value.toPointer(); + break; + // TODO: handle other types + + default: + compareTo = entity.value; + } + onFilterChange(filters.push(new Map({ field: entity.field, + // TODO: handle different constraints constraint: 'eq', - compareTo: entity.value + compareTo }))); hide(); }} From 9f4c8f6401ceb207bdeba1cbb7dd1b6ec39c3756 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Sun, 22 Dec 2019 01:52:55 +0100 Subject: [PATCH 003/117] Adding more filters to context menu --- .../BrowserCell/BrowserCell.react.js | 1 + .../Data/Browser/ContextMenu.react.js | 32 +++++++++---------- src/dashboard/Data/Browser/ContextMenu.scss | 24 ++++++++++++++ 3 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 src/dashboard/Data/Browser/ContextMenu.scss diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index c5fa502a3c..d21de63219 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -180,6 +180,7 @@ export default class BrowserCell extends Component { setContextMenu({ pageX, pageY }, { field: this.props.field, value: this.props.value, + copyableValue: this.copyableValue, type: this.props.type }); diff --git a/src/dashboard/Data/Browser/ContextMenu.react.js b/src/dashboard/Data/Browser/ContextMenu.react.js index f04b534e97..cb11947121 100644 --- a/src/dashboard/Data/Browser/ContextMenu.react.js +++ b/src/dashboard/Data/Browser/ContextMenu.react.js @@ -1,25 +1,15 @@ import React from 'react'; import { List, Map } from 'immutable'; +import styles from 'dashboard/Data/Browser/ContextMenu.scss'; let ContextMenu = ({ position, entity, onFilterChange, hide }) => { if (!position) { return null; } const { pageX, pageY } = position; - - return
{ + const pickFilter = (constraint) => { const filters = new List(); - let compareTo; switch (entity.type) { case 'Pointer': @@ -33,13 +23,23 @@ let ContextMenu = ({ position, entity, onFilterChange, hide }) => { onFilterChange(filters.push(new Map({ field: entity.field, - // TODO: handle different constraints - constraint: 'eq', + constraint, compareTo }))); hide(); - }} - >Filter by this value
; + } + + return
+ {/* TODO: menu items should be generated dynamically */} +

{entity.field} exists

+

{entity.field} does not exist

+

{entity.field} equals {entity.copyableValue}

+

{entity.field} does not equal {entity.copyableValue}

+ +
; } // BrowserContextMenu.propTypes = { diff --git a/src/dashboard/Data/Browser/ContextMenu.scss b/src/dashboard/Data/Browser/ContextMenu.scss new file mode 100644 index 0000000000..0327f41fe6 --- /dev/null +++ b/src/dashboard/Data/Browser/ContextMenu.scss @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +@import 'stylesheets/globals.scss'; + +.menu { + position: absolute; + border: 1px solid; + background: #66637a; + color: white; + cursor: pointer; + + .item { + padding: 0.3rem; + } + + .item:hover { + background: #797691; + } +} \ No newline at end of file From 9406b705a59eab1a9d0723818cbe0927943e063f Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Tue, 24 Dec 2019 23:43:24 +0100 Subject: [PATCH 004/117] Introducing general, reusable ContextMenu component --- Parse-Dashboard/parse-dashboard-config.json | 11 ++-- .../BrowserCell/BrowserCell.react.js | 50 +++++++++++++--- src/components/BrowserRow/BrowserRow.react.js | 3 +- .../ContextMenu/ContextMenu.example.js | 48 +++++++++++++++ .../ContextMenu/ContextMenu.react.js | 60 +++++++++++++++++++ src/components/ContextMenu/ContextMenu.scss | 45 ++++++++++++++ .../Data/Browser/BrowserTable.react.js | 2 + .../Data/Browser/ContextMenu.react.js | 49 --------------- src/dashboard/Data/Browser/ContextMenu.scss | 24 -------- .../Data/Browser/DataBrowser.react.js | 19 +++--- src/lib/tests/ContextMenu.test.js | 24 ++++++++ src/parse-interface-guide/ComponentsMap.js | 1 + 12 files changed, 241 insertions(+), 95 deletions(-) create mode 100644 src/components/ContextMenu/ContextMenu.example.js create mode 100644 src/components/ContextMenu/ContextMenu.react.js create mode 100644 src/components/ContextMenu/ContextMenu.scss delete mode 100644 src/dashboard/Data/Browser/ContextMenu.react.js delete mode 100644 src/dashboard/Data/Browser/ContextMenu.scss create mode 100644 src/lib/tests/ContextMenu.test.js diff --git a/Parse-Dashboard/parse-dashboard-config.json b/Parse-Dashboard/parse-dashboard-config.json index c252aebd73..4d0c5fd419 100644 --- a/Parse-Dashboard/parse-dashboard-config.json +++ b/Parse-Dashboard/parse-dashboard-config.json @@ -1,12 +1,13 @@ { "apps": [{ - "serverURL": "http://localhost:1338/parse", - "appId": "hello", - "masterKey": "world", - "appName": "", + "serverURL": "https://digdig-dev.appspot.com/parse", + "appId": "DigDigDev", + "masterKey": "DigDigDevMasterKey", + "appName": "DigDigDev", "iconName": "", "primaryBackgroundColor": "", "secondaryBackgroundColor": "" - }], + } + ], "iconsFolder": "icons" } diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index d21de63219..f73e31d1fa 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -5,6 +5,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. */ +import { List, Map } from 'immutable'; import { dateStringUTC } from 'lib/DateUtils'; import getFileName from 'lib/getFileName'; import Parse from 'parse'; @@ -63,7 +64,7 @@ export default class BrowserCell extends Component { } render() { - let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, setContextMenu, onPointerClick, row, col } = this.props; + let { type, value, hidden, width, current, onSelect, onEditChange, onFilterChange, setCopyableValue, setRelation, setContextMenu, onPointerClick, row, col } = this.props; let content = value; this.copyableValue = content; let classes = [styles.cell, unselectable]; @@ -176,13 +177,48 @@ export default class BrowserCell extends Component { onSelect({ row, col }); setCopyableValue(hidden ? undefined : this.copyableValue); + const { field, value, type } = this.props; + const pickFilter = (constraint) => { + const filters = new List(); + + let compareTo; + switch (type) { + case 'Pointer': + compareTo = value.toPointer(); + break; + // TODO: handle other types + + default: + compareTo = value; + } + + onFilterChange(filters.push(new Map({ + field: field, + constraint, + compareTo + }))); + }; + const { pageX, pageY } = e; - setContextMenu({ pageX, pageY }, { - field: this.props.field, - value: this.props.value, - copyableValue: this.copyableValue, - type: this.props.type - }); + setContextMenu(pageX, pageY, [ + //TODO: create menu items dynamically + { text: 'Set filter...', items: [ + { text: `${field} exists`, + callback: pickFilter.bind(this, 'exists')}, + { text: `${field} does not exist`, + callback: pickFilter.bind(this, 'dne')}, + { text: `${field} equals ${this.copyableValue}`, + callback: pickFilter.bind(this, 'eq')}, + { text: `${field} does not equal ${this.copyableValue}`, + callback: pickFilter.bind(this, 'neq')} + ]}, + { text: 'Add filter...', items: [ + { text: `${field} exists`, callback: () => {}}, + { text: `${field} does not exist`, callback: () => {}}, + { text: `${field} equals ${this.copyableValue}`, callback: () => {}}, + { text: `${field} does not equal ${this.copyableValue}`, callback: () => {}} + ]} + ]); } }}> diff --git a/src/components/BrowserRow/BrowserRow.react.js b/src/components/BrowserRow/BrowserRow.react.js index e164589a0d..704aa3e932 100644 --- a/src/components/BrowserRow/BrowserRow.react.js +++ b/src/components/BrowserRow/BrowserRow.react.js @@ -19,7 +19,7 @@ export default class BrowserRow extends Component { } render() { - const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation, setContextMenu } = this.props; + const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation, setContextMenu, onFilterChange } = this.props; let attributes = obj.attributes; return (
@@ -71,6 +71,7 @@ export default class BrowserRow extends Component { onSelect={setCurrent} onEditChange={setEditing} onPointerClick={onPointerClick} + onFilterChange={onFilterChange} setRelation={setRelation} value={attr} hidden={hidden} diff --git a/src/components/ContextMenu/ContextMenu.example.js b/src/components/ContextMenu/ContextMenu.example.js new file mode 100644 index 0000000000..10afe9c1c8 --- /dev/null +++ b/src/components/ContextMenu/ContextMenu.example.js @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +import React from 'react'; +import ContextMenu from 'components/ContextMenu/ContextMenu.react'; + +export const component = ContextMenu; + +export const demos = [ + { + name: 'Context menu', + render: () => ( +
+ { alert('C1 Item 1 clicked!') } }, + { text: 'C1 Item 2', callback: () => { alert('C1 Item 2 clicked!') } }, + { + text: 'Sub Category 1', items: [ + { text: 'SC1 Item 1', callback: () => { alert('SC1 Item 1 clicked!') } }, + { text: 'SC1 Item 2', callback: () => { alert('SC1 Item 2 clicked!') } }, + ] + } + ] + }, + { + text: 'Category 2', items: [ + { text: 'C2 Item 1', callback: () => { alert('C2 Item 1 clicked!') } }, + { text: 'C2 Item 2', callback: () => { alert('C2 Item 2 clicked!') } } + ] + } + ]} + /> +
+ ) + } +]; diff --git a/src/components/ContextMenu/ContextMenu.react.js b/src/components/ContextMenu/ContextMenu.react.js new file mode 100644 index 0000000000..c4728693c8 --- /dev/null +++ b/src/components/ContextMenu/ContextMenu.react.js @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +import PropTypes from 'lib/PropTypes'; +import React, { useState } from 'react'; +import styles from 'components/ContextMenu/ContextMenu.scss'; + +let ContextMenu = ({ x, y, items }) => { + + const [path, setPath] = useState([]); + + const renderItem = (item, index, array, level = 0) => { + + // items array indicates that we're dealing with the category + if (item.items && item.items.length > 0) { + return ( +
    +
  • { + const newPath = path.slice(0, level); + newPath.push(index); + setPath(newPath); + }}> + {item.text} +
  • + {index === path[level] &&
      + {item.items.map((a, b, c) => renderItem(a, b, c, level + 1))} +
    } +
+ ); + } + + return ( +
  • { + item.callback && item.callback(); + }}> + {item.text} +
  • + ); + } + + return ( +
    + {items.map(renderItem)} +
    + ); +} + +ContextMenu.propTypes = { + x: PropTypes.number.isRequired.describe('X context menu position.'), + y: PropTypes.number.isRequired.describe('Y context menu position.'), + items: PropTypes.array.isRequired.describe('Array with tree representation of context menu items.'), +} + +export default ContextMenu; diff --git a/src/components/ContextMenu/ContextMenu.scss b/src/components/ContextMenu/ContextMenu.scss new file mode 100644 index 0000000000..419c073097 --- /dev/null +++ b/src/components/ContextMenu/ContextMenu.scss @@ -0,0 +1,45 @@ +@import 'stylesheets/globals.scss'; + +.menu { + position: absolute; + font-size: 14px; + + ul { + background: $purple; + } + + li { + height: 30px; + line-height: 30px; + border-radius: 5px; + color: $white; + cursor: pointer; + white-space: nowrap; + padding: 0 30px 0 10px; + } + + li:hover { + background: rgba(255, 255, 255, 0.1); + } + + .category { + display: flex; + + .item { + &:after { + @include arrow('right', 12px, 8px, rgba(255,255,255,0.3)); + position: absolute; + content: ''; + margin-top: 10px; + right: 10px; + } + } + + .body { + left: 100%; + position: absolute; + } + + } + +} \ No newline at end of file diff --git a/src/dashboard/Data/Browser/BrowserTable.react.js b/src/dashboard/Data/Browser/BrowserTable.react.js index b10fd53d15..2e71667acb 100644 --- a/src/dashboard/Data/Browser/BrowserTable.react.js +++ b/src/dashboard/Data/Browser/BrowserTable.react.js @@ -128,6 +128,7 @@ export default class BrowserTable extends React.Component { isUnique={this.props.isUnique} obj={this.props.newObject} onPointerClick={this.props.onPointerClick} + onFilterChange={this.props.onFilterChange} order={this.props.order} readOnlyFields={READ_ONLY} row={-1} @@ -162,6 +163,7 @@ export default class BrowserTable extends React.Component { isUnique={this.props.isUnique} obj={obj} onPointerClick={this.props.onPointerClick} + onFilterChange={this.props.onFilterChange} order={this.props.order} readOnlyFields={READ_ONLY} row={i} diff --git a/src/dashboard/Data/Browser/ContextMenu.react.js b/src/dashboard/Data/Browser/ContextMenu.react.js deleted file mode 100644 index cb11947121..0000000000 --- a/src/dashboard/Data/Browser/ContextMenu.react.js +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react'; -import { List, Map } from 'immutable'; -import styles from 'dashboard/Data/Browser/ContextMenu.scss'; - -let ContextMenu = ({ position, entity, onFilterChange, hide }) => { - if (!position) { return null; } - - const { pageX, pageY } = position; - - const pickFilter = (constraint) => { - const filters = new List(); - - let compareTo; - switch (entity.type) { - case 'Pointer': - compareTo = entity.value.toPointer(); - break; - // TODO: handle other types - - default: - compareTo = entity.value; - } - - onFilterChange(filters.push(new Map({ - field: entity.field, - constraint, - compareTo - }))); - hide(); - } - - return
    - {/* TODO: menu items should be generated dynamically */} -

    {entity.field} exists

    -

    {entity.field} does not exist

    -

    {entity.field} equals {entity.copyableValue}

    -

    {entity.field} does not equal {entity.copyableValue}

    - -
    ; -} - -// BrowserContextMenu.propTypes = { -// prop1: PropTypes.string.isRequired.describe('Replace me with the actual props'), -// } - -export default ContextMenu; diff --git a/src/dashboard/Data/Browser/ContextMenu.scss b/src/dashboard/Data/Browser/ContextMenu.scss deleted file mode 100644 index 0327f41fe6..0000000000 --- a/src/dashboard/Data/Browser/ContextMenu.scss +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2016-present, Parse, LLC - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ -@import 'stylesheets/globals.scss'; - -.menu { - position: absolute; - border: 1px solid; - background: #66637a; - color: white; - cursor: pointer; - - .item { - padding: 0.3rem; - } - - .item:hover { - background: #797691; - } -} \ No newline at end of file diff --git a/src/dashboard/Data/Browser/DataBrowser.react.js b/src/dashboard/Data/Browser/DataBrowser.react.js index 24e9662469..537ec02390 100644 --- a/src/dashboard/Data/Browser/DataBrowser.react.js +++ b/src/dashboard/Data/Browser/DataBrowser.react.js @@ -8,7 +8,7 @@ import copy from 'copy-to-clipboard'; import BrowserTable from 'dashboard/Data/Browser/BrowserTable.react'; import BrowserToolbar from 'dashboard/Data/Browser/BrowserToolbar.react'; -import ContextMenu from 'dashboard/Data/Browser/ContextMenu.react'; +import ContextMenu from 'components/ContextMenu/ContextMenu.react'; import * as ColumnPreferences from 'lib/ColumnPreferences'; import ParseApp from 'lib/ParseApp'; import React from 'react'; @@ -211,8 +211,8 @@ export default class DataBrowser extends React.Component { } } - setContextMenu(position, entity) { - this.setState({ position, entity }); + setContextMenu(contextMenuX, contextMenuY, contextMenuItems) { + this.setState({ contextMenuX, contextMenuY, contextMenuItems }); } handleColumnsOrder(order) { @@ -237,6 +237,7 @@ export default class DataBrowser extends React.Component { setCurrent={this.setCurrent} setCopyableValue={this.setCopyableValue} setContextMenu={this.setContextMenu} + onFilterChange={this.props.onFilterChange} {...other} /> - + + {this.state.contextMenuX && }
    ); } diff --git a/src/lib/tests/ContextMenu.test.js b/src/lib/tests/ContextMenu.test.js new file mode 100644 index 0000000000..eb826f8b82 --- /dev/null +++ b/src/lib/tests/ContextMenu.test.js @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2016-present, Parse, LLC + * All rights reserved. + * + * This source code is licensed under the license found in the LICENSE file in + * the root directory of this source tree. + */ +jest.dontMock('../../components/ContextMenu/ContextMenu.react'); + +import React from 'react'; +import ReactDOM from 'react-dom'; + +const ContextMenu = require('../../components/ContextMenu/ContextMenu.react'); + +describe('ContextMenu', () => { + it('can render examples', () => { + jest.dontMock('../../components/ContextMenu/ContextMenu.example'); + const example = require('../../components/ContextMenu/ContextMenu.example'); + example.demos.forEach((example, i) => { + example.render(); + }); + }); + // test suite goes here +}); diff --git a/src/parse-interface-guide/ComponentsMap.js b/src/parse-interface-guide/ComponentsMap.js index 941aa039d6..505945bb84 100644 --- a/src/parse-interface-guide/ComponentsMap.js +++ b/src/parse-interface-guide/ComponentsMap.js @@ -68,3 +68,4 @@ export let StatusIndicator = require('components/StatusIndicator/Statu export let TextInput = require('components/TextInput/TextInput.example'); export let Toggle = require('components/Toggle/Toggle.example'); export let Tooltip = require('components/Tooltip/Tooltip.example'); +export let ContextMenu = require('components/ContextMenu/ContextMenu.example'); From 1127c64e2727ef0f6a398fbde3b689485452b87b Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Tue, 24 Dec 2019 23:45:17 +0100 Subject: [PATCH 005/117] Move ContextMenu item in pig list to keep alphabetical order --- src/parse-interface-guide/ComponentsMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parse-interface-guide/ComponentsMap.js b/src/parse-interface-guide/ComponentsMap.js index 505945bb84..c773b33f14 100644 --- a/src/parse-interface-guide/ComponentsMap.js +++ b/src/parse-interface-guide/ComponentsMap.js @@ -13,6 +13,7 @@ export let Checkbox = require('components/Checkbox/Checkbox.exa export let ChromeDatePicker = require('components/ChromeDatePicker/ChromeDatePicker.example'); export let ChromeDropdown = require('components/ChromeDropdown/ChromeDropdown.example'); export let CodeSnippet = require('components/CodeSnippet/CodeSnippet.example'); +export let ContextMenu = require('components/ContextMenu/ContextMenu.example'); export let CreditCardInput = require('components/CreditCardInput/CreditCardInput.example'); export let DataBrowserHeader = require('components/DataBrowserHeader/DataBrowserHeader.example'); export let DatePicker = require('components/DatePicker/DatePicker.example'); @@ -68,4 +69,3 @@ export let StatusIndicator = require('components/StatusIndicator/Statu export let TextInput = require('components/TextInput/TextInput.example'); export let Toggle = require('components/Toggle/Toggle.example'); export let Tooltip = require('components/Tooltip/Tooltip.example'); -export let ContextMenu = require('components/ContextMenu/ContextMenu.example'); From ec990f267c37f4bdd6c1c51cd95b103dd14b06c7 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Wed, 25 Dec 2019 02:40:08 +0100 Subject: [PATCH 006/117] Reverting changes in parse-dashboard-config.json file --- Parse-Dashboard/parse-dashboard-config.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Parse-Dashboard/parse-dashboard-config.json b/Parse-Dashboard/parse-dashboard-config.json index 4d0c5fd419..3135888a54 100644 --- a/Parse-Dashboard/parse-dashboard-config.json +++ b/Parse-Dashboard/parse-dashboard-config.json @@ -1,13 +1,12 @@ { "apps": [{ - "serverURL": "https://digdig-dev.appspot.com/parse", - "appId": "DigDigDev", - "masterKey": "DigDigDevMasterKey", - "appName": "DigDigDev", + "serverURL": "http://localhost:1338/parse", + "appId": "hello", + "masterKey": "world", + "appName": "", "iconName": "", "primaryBackgroundColor": "", "secondaryBackgroundColor": "" - } - ], + }], "iconsFolder": "icons" -} +} \ No newline at end of file From c87959a287688976a0a96efdd692588deb39e2d0 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Thu, 26 Dec 2019 19:54:38 +0100 Subject: [PATCH 007/117] Showing "Get related records from..." context menu option when clicking on Pointer or objectId --- .../BrowserCell/BrowserCell.react.js | 63 +++++++++++++------ src/components/BrowserRow/BrowserRow.react.js | 2 + .../Data/Browser/BrowserTable.react.js | 1 + 3 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index f73e31d1fa..41151fef9b 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -200,25 +200,52 @@ export default class BrowserCell extends Component { }; const { pageX, pageY } = e; - setContextMenu(pageX, pageY, [ + const menuItems = [ //TODO: create menu items dynamically - { text: 'Set filter...', items: [ - { text: `${field} exists`, - callback: pickFilter.bind(this, 'exists')}, - { text: `${field} does not exist`, - callback: pickFilter.bind(this, 'dne')}, - { text: `${field} equals ${this.copyableValue}`, - callback: pickFilter.bind(this, 'eq')}, - { text: `${field} does not equal ${this.copyableValue}`, - callback: pickFilter.bind(this, 'neq')} - ]}, - { text: 'Add filter...', items: [ - { text: `${field} exists`, callback: () => {}}, - { text: `${field} does not exist`, callback: () => {}}, - { text: `${field} equals ${this.copyableValue}`, callback: () => {}}, - { text: `${field} does not equal ${this.copyableValue}`, callback: () => {}} - ]} - ]); + { + text: 'Set filter...', items: [ + { + text: `${field} exists`, + callback: pickFilter.bind(this, 'exists') + }, + { + text: `${field} does not exist`, + callback: pickFilter.bind(this, 'dne') + }, + { + text: `${field} equals ${this.copyableValue}`, + callback: pickFilter.bind(this, 'eq') + }, + { + text: `${field} does not equal ${this.copyableValue}`, + callback: pickFilter.bind(this, 'neq') + } + ] + }, + { + text: 'Add filter...', items: [ + { text: `${field} exists`, callback: () => { } }, + { text: `${field} does not exist`, callback: () => { } }, + { text: `${field} equals ${this.copyableValue}`, callback: () => { } }, + { text: `${field} does not equal ${this.copyableValue}`, callback: () => { } } + ] + } + ]; + + const className = this.props.value.className || (field === 'objectId' && this.props.className); + className && menuItems.push({ + text: 'Get related records from...', items: + this.props.schema.data.get('classes').filter(cl => { + return cl.filter(column => { + return column.targetClass === className; + }).size > 0 + }).map((object, key) => { + return { text: key, callback: () => { + // TODO: Browse ClassName filtered by field equals to current value + }} + }).toIndexedSeq().toArray() + }); + setContextMenu(pageX, pageY, menuItems); } }}> diff --git a/src/components/BrowserRow/BrowserRow.react.js b/src/components/BrowserRow/BrowserRow.react.js index 704aa3e932..0ba4974c8c 100644 --- a/src/components/BrowserRow/BrowserRow.react.js +++ b/src/components/BrowserRow/BrowserRow.react.js @@ -61,6 +61,8 @@ export default class BrowserRow extends Component { return ( Date: Thu, 26 Dec 2019 20:01:41 +0100 Subject: [PATCH 008/117] Changing categories to fill context menu horizontally --- src/components/ContextMenu/ContextMenu.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ContextMenu/ContextMenu.scss b/src/components/ContextMenu/ContextMenu.scss index 419c073097..7b17ecbe27 100644 --- a/src/components/ContextMenu/ContextMenu.scss +++ b/src/components/ContextMenu/ContextMenu.scss @@ -26,6 +26,7 @@ display: flex; .item { + width: 100%; &:after { @include arrow('right', 12px, 8px, rgba(255,255,255,0.3)); position: absolute; From a1080f208ac9fbf86c8668c36f76d97e8df0e374 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Fri, 27 Dec 2019 11:06:55 +0100 Subject: [PATCH 009/117] Fully functional 'Get related records from...' context menu item --- .../BrowserCell/BrowserCell.react.js | 39 ++++++++++++------- src/dashboard/Data/Browser/Browser.react.js | 4 +- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 41151fef9b..774b7175ff 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -232,21 +232,32 @@ export default class BrowserCell extends Component { } ]; - const className = this.props.value.className || (field === 'objectId' && this.props.className); - className && menuItems.push({ - text: 'Get related records from...', items: - this.props.schema.data.get('classes').filter(cl => { - return cl.filter(column => { - return column.targetClass === className; - }).size > 0 - }).map((object, key) => { - return { text: key, callback: () => { - // TODO: Browse ClassName filtered by field equals to current value - }} - }).toIndexedSeq().toArray() - }); - setContextMenu(pageX, pageY, menuItems); + // Push "Get related records from..." context menu item if cell holds a Pointer + // or objectId and there's a class in relation + const pointerClassName = this.props.value.className || (field === 'objectId' && this.props.className); + if (pointerClassName) { + const relatedRecordsMenuItem = { text: 'Get related records from...', items: [] }; + this.props.schema.data.get('classes').forEach((cl, className) => { + cl.forEach((column, field) => { + if (column.targetClass !== pointerClassName) { return; } + relatedRecordsMenuItem.items.push({ + text: className, callback: () => { + let id = this.copyableValue; + if (this.props.field === 'objectId') { + const object = new Parse.Object(pointerClassName); + object.id = value; + id = object.toPointer(); + } + onPointerClick({ className, id, field }) + } + }) + }); + }); + + relatedRecordsMenuItem.items.length > 0 && menuItems.push(relatedRecordsMenuItem ); + } + setContextMenu(pageX, pageY, menuItems); } }}> {content} diff --git a/src/dashboard/Data/Browser/Browser.react.js b/src/dashboard/Data/Browser/Browser.react.js index 1838d6cbdc..4ee068fbfc 100644 --- a/src/dashboard/Data/Browser/Browser.react.js +++ b/src/dashboard/Data/Browser/Browser.react.js @@ -496,9 +496,9 @@ class Browser extends DashboardView { }); } - handlePointerClick({ className, id }) { + handlePointerClick({ className, id, field = 'objectId' }) { let filters = JSON.stringify([{ - field: 'objectId', + field, constraint: 'eq', compareTo: id }]); From c08ba6d5b80cc5056ae3fe73210ed31f4ee95f75 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Fri, 27 Dec 2019 13:12:37 +0100 Subject: [PATCH 010/117] Fixing CI build by removing empty test file --- src/lib/tests/ContextMenu.test.js | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 src/lib/tests/ContextMenu.test.js diff --git a/src/lib/tests/ContextMenu.test.js b/src/lib/tests/ContextMenu.test.js deleted file mode 100644 index eb826f8b82..0000000000 --- a/src/lib/tests/ContextMenu.test.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2016-present, Parse, LLC - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ -jest.dontMock('../../components/ContextMenu/ContextMenu.react'); - -import React from 'react'; -import ReactDOM from 'react-dom'; - -const ContextMenu = require('../../components/ContextMenu/ContextMenu.react'); - -describe('ContextMenu', () => { - it('can render examples', () => { - jest.dontMock('../../components/ContextMenu/ContextMenu.example'); - const example = require('../../components/ContextMenu/ContextMenu.example'); - example.demos.forEach((example, i) => { - example.render(); - }); - }); - // test suite goes here -}); From 7bfa990db890e1c609f26e5e4158dbdc684273fb Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Fri, 27 Dec 2019 13:30:35 +0100 Subject: [PATCH 011/117] Closing context menu after chosing an option --- src/components/ContextMenu/ContextMenu.react.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/ContextMenu/ContextMenu.react.js b/src/components/ContextMenu/ContextMenu.react.js index c4728693c8..c3f6639e22 100644 --- a/src/components/ContextMenu/ContextMenu.react.js +++ b/src/components/ContextMenu/ContextMenu.react.js @@ -6,12 +6,14 @@ * the root directory of this source tree. */ import PropTypes from 'lib/PropTypes'; -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import styles from 'components/ContextMenu/ContextMenu.scss'; let ContextMenu = ({ x, y, items }) => { const [path, setPath] = useState([]); + const [visible, setVisible] = useState(true); + useEffect(() => { setVisible(true); }, [items]); const renderItem = (item, index, array, level = 0) => { @@ -36,12 +38,15 @@ let ContextMenu = ({ x, y, items }) => { return (
  • { item.callback && item.callback(); + setVisible(false); }}> {item.text}
  • ); } + if (!visible) { return null; } + return (
    Date: Fri, 27 Dec 2019 19:19:29 +0100 Subject: [PATCH 012/117] Properly handling 'Get related records from...' logic when executing it on cell containing Pointer --- src/components/BrowserCell/BrowserCell.react.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 774b7175ff..7b9d260b93 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -242,13 +242,12 @@ export default class BrowserCell extends Component { if (column.targetClass !== pointerClassName) { return; } relatedRecordsMenuItem.items.push({ text: className, callback: () => { - let id = this.copyableValue; + let relatedObject = value; if (this.props.field === 'objectId') { - const object = new Parse.Object(pointerClassName); - object.id = value; - id = object.toPointer(); + relatedObject = new Parse.Object(pointerClassName); + relatedObject.id = value; } - onPointerClick({ className, id, field }) + onPointerClick({ className, id: relatedObject.toPointer(), field }) } }) }); From 5d6bb776973f6c6d6590ef0188400652ad7254e8 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Sat, 28 Dec 2019 18:05:41 +0100 Subject: [PATCH 013/117] Fixing click on empty cell by checking value --- src/components/BrowserCell/BrowserCell.react.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 7b9d260b93..5a33480e1f 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -234,7 +234,8 @@ export default class BrowserCell extends Component { // Push "Get related records from..." context menu item if cell holds a Pointer // or objectId and there's a class in relation - const pointerClassName = this.props.value.className || (field === 'objectId' && this.props.className); + const pointerClassName = (this.props.value && this.props.value.className) + || (field === 'objectId' && this.props.className); if (pointerClassName) { const relatedRecordsMenuItem = { text: 'Get related records from...', items: [] }; this.props.schema.data.get('classes').forEach((cl, className) => { From 0953350b79d02fc508c7985012555d01a14b5cd0 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Sat, 28 Dec 2019 18:14:37 +0100 Subject: [PATCH 014/117] Closing context menu after clicking outside it --- .../ContextMenu/ContextMenu.react.js | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/ContextMenu/ContextMenu.react.js b/src/components/ContextMenu/ContextMenu.react.js index c3f6639e22..f6c09d6b80 100644 --- a/src/components/ContextMenu/ContextMenu.react.js +++ b/src/components/ContextMenu/ContextMenu.react.js @@ -6,7 +6,7 @@ * the root directory of this source tree. */ import PropTypes from 'lib/PropTypes'; -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import styles from 'components/ContextMenu/ContextMenu.scss'; let ContextMenu = ({ x, y, items }) => { @@ -15,6 +15,25 @@ let ContextMenu = ({ x, y, items }) => { const [visible, setVisible] = useState(true); useEffect(() => { setVisible(true); }, [items]); + //#region Closing menu after clicking outside it + + const menuRef = useRef(null); + + function handleClickOutside(event) { + if (menuRef.current && !menuRef.current.contains(event.target)) { + setVisible(false); + } + } + + useEffect(() => { + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }); + + //#endregion + const renderItem = (item, index, array, level = 0) => { // items array indicates that we're dealing with the category @@ -48,7 +67,7 @@ let ContextMenu = ({ x, y, items }) => { if (!visible) { return null; } return ( -
    {items.map(renderItem)} From 6c80d4379a9447faa729d6a5f836ee9bcb07c4c1 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Sat, 28 Dec 2019 18:59:06 +0100 Subject: [PATCH 015/117] Adding key attributes to ContextMenu JSX --- src/components/ContextMenu/ContextMenu.react.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ContextMenu/ContextMenu.react.js b/src/components/ContextMenu/ContextMenu.react.js index f6c09d6b80..b6c8fbad4b 100644 --- a/src/components/ContextMenu/ContextMenu.react.js +++ b/src/components/ContextMenu/ContextMenu.react.js @@ -39,7 +39,7 @@ let ContextMenu = ({ x, y, items }) => { // items array indicates that we're dealing with the category if (item.items && item.items.length > 0) { return ( -
      +
      • { const newPath = path.slice(0, level); newPath.push(index); @@ -55,7 +55,7 @@ let ContextMenu = ({ x, y, items }) => { } return ( -
      • { +
      • { item.callback && item.callback(); setVisible(false); }}> From 65ce7798aab4bcd940884fe7aa2a2641fbe4b9e7 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Sat, 28 Dec 2019 22:53:07 +0100 Subject: [PATCH 016/117] Positioning menu sections to not go off the screen + animations --- .../ContextMenu/ContextMenu.react.js | 112 +++++++++++++----- src/components/ContextMenu/ContextMenu.scss | 17 ++- 2 files changed, 94 insertions(+), 35 deletions(-) diff --git a/src/components/ContextMenu/ContextMenu.react.js b/src/components/ContextMenu/ContextMenu.react.js index b6c8fbad4b..2e22f943ad 100644 --- a/src/components/ContextMenu/ContextMenu.react.js +++ b/src/components/ContextMenu/ContextMenu.react.js @@ -9,19 +9,80 @@ import PropTypes from 'lib/PropTypes'; import React, { useState, useEffect, useRef } from 'react'; import styles from 'components/ContextMenu/ContextMenu.scss'; +const getPositionToFitVisibleScreen = (ref) => { + if (ref.current) { + + const elBox = ref.current.getBoundingClientRect(); + const y = (elBox.y + elBox.height) < window.innerHeight ? + 0 : (window.innerHeight - (elBox.y + elBox.height)); + + // If there's a previous element show current next to it. + // Try on right side first, then on left if there's no place. + const prevEl = ref.current.previousSibling; + if (prevEl) { + const prevElBox = prevEl.getBoundingClientRect(); + const showOnRight = (prevElBox.x + prevElBox.width + elBox.width) < window.innerWidth; + return { + x: showOnRight ? prevElBox.width : -elBox.width, + y + }; + } + + return { x: 0, y }; + } +}; + +const MenuSection = ({ level, items, path, setPath, hide }) => { + + const sectionRef = useRef(null); + const [position, setPosition] = useState(); + + useEffect(() => { + const newPosition = getPositionToFitVisibleScreen(sectionRef); + newPosition && setPosition(newPosition); + }, [sectionRef]); + + const style = position ? { + left: position.x, + top: position.y, + opacity: 1 + } : {}; + + return (
          + {items.map((item, index) => { + if (item.items) { + return (
        • { + const newPath = path.slice(0, level + 1); + newPath.push(index); + setPath(newPath); + }}>{item.text}
        • ); + } + return (
        • { + item.callback && item.callback(); + hide(); + }}>{item.text}
        • ); + })} +
        ); +} + let ContextMenu = ({ x, y, items }) => { - const [path, setPath] = useState([]); + const [path, setPath] = useState([0]); const [visible, setVisible] = useState(true); useEffect(() => { setVisible(true); }, [items]); + const hide = () => { + setVisible(false); + setPath([0]); + } + //#region Closing menu after clicking outside it const menuRef = useRef(null); function handleClickOutside(event) { if (menuRef.current && !menuRef.current.contains(event.target)) { - setVisible(false); + hide(); } } @@ -34,43 +95,30 @@ let ContextMenu = ({ x, y, items }) => { //#endregion - const renderItem = (item, index, array, level = 0) => { - - // items array indicates that we're dealing with the category - if (item.items && item.items.length > 0) { - return ( -
          -
        • { - const newPath = path.slice(0, level); - newPath.push(index); - setPath(newPath); - }}> - {item.text} -
        • - {index === path[level] &&
            - {item.items.map((a, b, c) => renderItem(a, b, c, level + 1))} -
          } -
        - ); - } + if (!visible) { return null; } - return ( -
      • { - item.callback && item.callback(); - setVisible(false); - }}> - {item.text} -
      • - ); + const getItemsFromLevel = (level) => { + let result = items; + for (let index = 1; index <= level; index++) { + result = result[path[index]].items; + } + return result; } - if (!visible) { return null; } - return (
        - {items.map(renderItem)} + {path.map((position, level) => { + return + })}
        ); } diff --git a/src/components/ContextMenu/ContextMenu.scss b/src/components/ContextMenu/ContextMenu.scss index 7b17ecbe27..f4fae68bab 100644 --- a/src/components/ContextMenu/ContextMenu.scss +++ b/src/components/ContextMenu/ContextMenu.scss @@ -6,12 +6,13 @@ ul { background: $purple; + @include animation('fade-in .2s linear'); + opacity: 0; } li { height: 30px; line-height: 30px; - border-radius: 5px; color: $white; cursor: pointer; white-space: nowrap; @@ -23,7 +24,7 @@ } .category { - display: flex; + position: absolute; .item { width: 100%; @@ -42,5 +43,15 @@ } } - +} + +@include keyframes(fade-in) { + 0% { + // @include transform(scale(0.9)); + opacity: 0; + } + 100% { + // @include transform(scale(1)); + opacity: 1; + } } \ No newline at end of file From cc5e0fd2f7a9a92cd11687d8cb20fb12b3059cd5 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Mon, 30 Dec 2019 20:24:55 +0100 Subject: [PATCH 017/117] Functional options to add a filter to existing one(s) --- .../BrowserCell/BrowserCell.react.js | 25 ++++++++++++++----- src/components/BrowserRow/BrowserRow.react.js | 1 + .../Data/Browser/BrowserTable.react.js | 1 + 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 5a33480e1f..96374ff72f 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -178,8 +178,9 @@ export default class BrowserCell extends Component { setCopyableValue(hidden ? undefined : this.copyableValue); const { field, value, type } = this.props; - const pickFilter = (constraint) => { - const filters = new List(); + + const pickFilter = (constraint, addToExistingFilter) => { + const filters = addToExistingFilter ? this.props.filters : new List(); let compareTo; switch (type) { @@ -224,10 +225,22 @@ export default class BrowserCell extends Component { }, { text: 'Add filter...', items: [ - { text: `${field} exists`, callback: () => { } }, - { text: `${field} does not exist`, callback: () => { } }, - { text: `${field} equals ${this.copyableValue}`, callback: () => { } }, - { text: `${field} does not equal ${this.copyableValue}`, callback: () => { } } + { + text: `${field} exists`, + callback: pickFilter.bind(this, 'exists', true) + }, + { + text: `${field} does not exist`, + callback: pickFilter.bind(this, 'dne', true) + }, + { + text: `${field} equals ${this.copyableValue}`, + callback: pickFilter.bind(this, 'eq', true) + }, + { + text: `${field} does not equal ${this.copyableValue}`, + callback: pickFilter.bind(this, 'neq', true) + } ] } ]; diff --git a/src/components/BrowserRow/BrowserRow.react.js b/src/components/BrowserRow/BrowserRow.react.js index 0ba4974c8c..e7ef746868 100644 --- a/src/components/BrowserRow/BrowserRow.react.js +++ b/src/components/BrowserRow/BrowserRow.react.js @@ -62,6 +62,7 @@ export default class BrowserRow extends Component { Date: Mon, 30 Dec 2019 20:28:51 +0100 Subject: [PATCH 018/117] Showing "Add fiter..." context menu option only if there's any filter applied --- src/components/BrowserCell/BrowserCell.react.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 96374ff72f..0b94c2b050 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -222,8 +222,11 @@ export default class BrowserCell extends Component { callback: pickFilter.bind(this, 'neq') } ] - }, - { + } + ]; + + if (this.props.filters && this.props.filters.size > 0) { + menuItems.push({ text: 'Add filter...', items: [ { text: `${field} exists`, @@ -242,8 +245,8 @@ export default class BrowserCell extends Component { callback: pickFilter.bind(this, 'neq', true) } ] - } - ]; + }); + } // Push "Get related records from..." context menu item if cell holds a Pointer // or objectId and there's a class in relation From b61d7af94e04f5edcb8346f25a2811ff7a4dd3b6 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Mon, 30 Dec 2019 23:57:51 +0100 Subject: [PATCH 019/117] Generating context menu filters dynamically basing on available ones --- .../BrowserCell/BrowserCell.react.js | 148 ++++++++---------- src/components/BrowserRow/BrowserRow.react.js | 1 + .../Data/Browser/BrowserTable.react.js | 1 + .../Data/Browser/DataBrowser.react.js | 19 ++- src/lib/Filters.js | 49 ++++-- 5 files changed, 119 insertions(+), 99 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 0b94c2b050..1f30053f10 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -172,109 +172,83 @@ export default class BrowserCell extends Component { } }} onContextMenu={e => { - if (e.type === 'contextmenu') { - e.preventDefault(); - onSelect({ row, col }); - setCopyableValue(hidden ? undefined : this.copyableValue); + if (e.type !== 'contextmenu') { return; } + e.preventDefault(); - const { field, value, type } = this.props; + onSelect({ row, col }); + setCopyableValue(hidden ? undefined : this.copyableValue); - const pickFilter = (constraint, addToExistingFilter) => { - const filters = addToExistingFilter ? this.props.filters : new List(); + const menuItems = []; + const { field, value, type } = this.props; - let compareTo; - switch (type) { - case 'Pointer': - compareTo = value.toPointer(); - break; - // TODO: handle other types + const pickFilter = (constraint, addToExistingFilter) => { + const filters = addToExistingFilter ? this.props.filters : new List(); + const compareTo = type === 'Pointer' ? value.toPointer() : value; - default: - compareTo = value; - } + onFilterChange(filters.push(new Map({ + field: field, + constraint, + compareTo + }))); + }; - onFilterChange(filters.push(new Map({ - field: field, - constraint, - compareTo - }))); - }; + const available = Filters.availableFilters(this.props.simplifiedSchema, this.props.filters); + const constraints = available && available[field]; - const { pageX, pageY } = e; - const menuItems = [ - //TODO: create menu items dynamically - { - text: 'Set filter...', items: [ - { - text: `${field} exists`, - callback: pickFilter.bind(this, 'exists') - }, - { - text: `${field} does not exist`, - callback: pickFilter.bind(this, 'dne') - }, - { - text: `${field} equals ${this.copyableValue}`, - callback: pickFilter.bind(this, 'eq') - }, - { - text: `${field} does not equal ${this.copyableValue}`, - callback: pickFilter.bind(this, 'neq') - } - ] - } - ]; + if (constraints) { + menuItems.push({ + text: 'Set filter...', items: constraints.map(constraint => { + const definition = Filters.Constraints[constraint]; + const text = `${field} ${definition.name}${definition.comparable ? (' ' + this.copyableValue) : ''}`; + return { + text, + callback: pickFilter.bind(this, constraint) + }; + }) + }); if (this.props.filters && this.props.filters.size > 0) { menuItems.push({ - text: 'Add filter...', items: [ - { - text: `${field} exists`, - callback: pickFilter.bind(this, 'exists', true) - }, - { - text: `${field} does not exist`, - callback: pickFilter.bind(this, 'dne', true) - }, - { - text: `${field} equals ${this.copyableValue}`, - callback: pickFilter.bind(this, 'eq', true) - }, - { - text: `${field} does not equal ${this.copyableValue}`, - callback: pickFilter.bind(this, 'neq', true) - } - ] + text: 'Add filter...', items: constraints.map(constraint => { + const definition = Filters.Constraints[constraint]; + const text = `${field} ${definition.name}${definition.comparable ? (' ' + this.copyableValue) : ''}`; + return { + text, + callback: pickFilter.bind(this, constraint) + }; + }) }); } + } - // Push "Get related records from..." context menu item if cell holds a Pointer - // or objectId and there's a class in relation - const pointerClassName = (this.props.value && this.props.value.className) - || (field === 'objectId' && this.props.className); - if (pointerClassName) { - const relatedRecordsMenuItem = { text: 'Get related records from...', items: [] }; - this.props.schema.data.get('classes').forEach((cl, className) => { - cl.forEach((column, field) => { - if (column.targetClass !== pointerClassName) { return; } - relatedRecordsMenuItem.items.push({ - text: className, callback: () => { - let relatedObject = value; - if (this.props.field === 'objectId') { - relatedObject = new Parse.Object(pointerClassName); - relatedObject.id = value; - } - onPointerClick({ className, id: relatedObject.toPointer(), field }) + // Push "Get related records from..." context menu item if cell holds a Pointer + // or objectId and there's a class in relation + const pointerClassName = (this.props.value && this.props.value.className) + || (field === 'objectId' && this.props.className); + if (pointerClassName) { + const relatedRecordsMenuItem = { text: 'Get related records from...', items: [] }; + this.props.schema.data.get('classes').forEach((cl, className) => { + cl.forEach((column, field) => { + if (column.targetClass !== pointerClassName) { return; } + relatedRecordsMenuItem.items.push({ + text: className, callback: () => { + let relatedObject = value; + if (this.props.field === 'objectId') { + relatedObject = new Parse.Object(pointerClassName); + relatedObject.id = value; } - }) - }); + onPointerClick({ className, id: relatedObject.toPointer(), field }) + } + }) }); + }); - relatedRecordsMenuItem.items.length > 0 && menuItems.push(relatedRecordsMenuItem ); - } - - setContextMenu(pageX, pageY, menuItems); + relatedRecordsMenuItem.items.length > 0 && menuItems.push(relatedRecordsMenuItem); } + + const { pageX, pageY } = e; + menuItems.length && setContextMenu(pageX, pageY, menuItems); + }}> {content} diff --git a/src/components/BrowserRow/BrowserRow.react.js b/src/components/BrowserRow/BrowserRow.react.js index e7ef746868..8cee80e460 100644 --- a/src/components/BrowserRow/BrowserRow.react.js +++ b/src/components/BrowserRow/BrowserRow.react.js @@ -62,6 +62,7 @@ export default class BrowserRow extends Component { { + schemaSimplifiedData[col] = { + type, + targetClass, + }; + }); + } + return schemaSimplifiedData; + } + handleResize(index, delta) { this.setState(({ order }) => { order[index].width = Math.max(60, order[index].width + delta); @@ -230,6 +246,7 @@ export default class DataBrowser extends React.Component { order={this.state.order} current={this.state.current} editing={this.state.editing} + simplifiedSchema={this.state.simplifiedSchema} className={className} handleHeaderDragDrop={this.handleHeaderDragDrop} handleResize={this.handleResize} diff --git a/src/lib/Filters.js b/src/lib/Filters.js index fb64ee6eec..3a04e57fa4 100644 --- a/src/lib/Filters.js +++ b/src/lib/Filters.js @@ -10,130 +10,157 @@ import Parse from 'parse'; export const Constraints = { exists: { name: 'exists', - field: null + field: null, + comparable: false }, dne: { name: 'does not exist', - field: null + field: null, + comparable: false }, eq: { name: 'equals', + comparable: true }, neq: { name: 'does not equal', + comparable: true }, lt: { name: 'less than', field: 'Number', composable: true, + comparable: true }, lte: { name: 'less than or equal', field: 'Number', composable: true, + comparable: true }, gt: { name: 'greater than', field: 'Number', composable: true, + comparable: true }, gte: { name: 'greater than or equal', field: 'Number', composable: true, + comparable: true }, starts: { name: 'starts with', + comparable: true }, ends: { name: 'ends with', + comparable: true }, stringContainsString: { name: 'string contains string', field: 'String', composable: true, + comparable: true }, before: { name: 'is before', field: 'Date', composable: true, + comparable: true }, after: { name: 'is after', field: 'Date', composable: true, + comparable: true }, containsString: { name: 'contains string', field: 'String', composable: true, + comparable: true }, doesNotContainString: { name: 'without string', field: 'String', composable: true, + comparable: true }, containsNumber: { name: 'contains number', field: 'Number', composable: true, + comparable: true }, doesNotContainNumber: { name: 'without number', field: 'Number', composable: true, + comparable: true }, containsAny: { name: 'contains', field: 'Array', + comparable: true }, doesNotContainAny: { name: 'does not contain', field: 'Array', + comparable: true }, keyExists: { name: 'key exists', field: 'Object', - composable: true + comparable: false }, keyDne: { name: 'key does not exist', field: 'Object', - composable: true + composable: true, + comparable: false }, keyEq: { name: 'key equals', field: 'Object', - composable: true + composable: true, + comparable: true }, keyNeq: { name: 'key does not equal', field: 'Object', - composable: true + composable: true, + comparable: true }, keyGt: { name: 'key greater than', field: 'Object', - composable: true + composable: true, + comparable: true }, keyGte: { name: 'key greater than/equal', field: 'Object', - composable: true + composable: true, + comparable: true }, keyLt: { name: 'key less than', field: 'Object', - composable: true + composable: true, + comparable: true }, keyLte: { name: 'key less than/equal', field: 'Object', - composable: true + composable: true, + comparable: true }, unique: { name: 'unique', - field: null + field: null, + comparable: false }, }; From e1248d910cd6397fb4751563a5f6241f114f466b Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Tue, 31 Dec 2019 00:54:25 +0100 Subject: [PATCH 020/117] Code cleaning + missing import --- .../BrowserCell/BrowserCell.react.js | 193 ++++++++++-------- 1 file changed, 113 insertions(+), 80 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 1f30053f10..7db2de2f56 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -5,6 +5,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. */ +import * as Filters from 'lib/Filters'; import { List, Map } from 'immutable'; import { dateStringUTC } from 'lib/DateUtils'; import getFileName from 'lib/getFileName'; @@ -63,8 +64,117 @@ export default class BrowserCell extends Component { return isRefDifferent; } + //#region Cell Context Menu related methods + + onContextMenu(event) { + if (event.type !== 'contextmenu') { return; } + event.preventDefault(); + + const { field, hidden, onSelect, setCopyableValue, setContextMenu, row, col } = this.props; + + onSelect({ row, col }); + setCopyableValue(hidden ? undefined : this.copyableValue); + + const available = Filters.availableFilters(this.props.simplifiedSchema, this.props.filters); + const constraints = available && available[field]; + + const { pageX, pageY } = event; + const menuItems = this.getContextMenuOptions(constraints); + menuItems.length && setContextMenu(pageX, pageY, menuItems); + } + + getContextMenuOptions(constraints) { + const contextMenuOptions = []; + + const setFilterContextMenuOption = this.getSetFilterContextMenuOption(constraints); + setFilterContextMenuOption && contextMenuOptions.push(setFilterContextMenuOption); + + const addFilterContextMenuOption = this.getAddFilterContextMenuOption(constraints); + addFilterContextMenuOption && contextMenuOptions.push(addFilterContextMenuOption); + + const relatedObjectsContextMenuOption = this.getRelatedObjectsContextMenuOption(); + relatedObjectsContextMenuOption && contextMenuOptions.push(relatedObjectsContextMenuOption); + + return contextMenuOptions; + } + + getSetFilterContextMenuOption(constraints) { + if (constraints) { + return { + text: 'Set filter...', items: constraints.map(constraint => { + const definition = Filters.Constraints[constraint]; + const text = `${this.props.field} ${definition.name}${definition.comparable ? (' ' + this.copyableValue) : ''}`; + return { + text, + callback: this.pickFilter.bind(this, constraint) + }; + }) + }; + } + } + + getAddFilterContextMenuOption(constraints) { + if (constraints && this.props.filters && this.props.filters.size > 0) { + return { + text: 'Add filter...', items: constraints.map(constraint => { + const definition = Filters.Constraints[constraint]; + const text = `${this.props.field} ${definition.name}${definition.comparable ? (' ' + this.copyableValue) : ''}`; + return { + text, + callback: this.pickFilter.bind(this, constraint, true) + }; + }) + }; + } + } + + /** + * Returns "Get related records from..." context menu item if cell holds a Pointer + * or objectId and there's a class in relation. + */ + getRelatedObjectsContextMenuOption() { + const { value, schema, onPointerClick } = this.props; + + const pointerClassName = (value && value.className) + || (this.props.field === 'objectId' && this.props.className); + if (pointerClassName) { + const relatedRecordsMenuItem = { text: 'Get related records from...', items: [] }; + schema.data.get('classes').forEach((cl, className) => { + cl.forEach((column, field) => { + if (column.targetClass !== pointerClassName) { return; } + relatedRecordsMenuItem.items.push({ + text: className, callback: () => { + let relatedObject = value; + if (this.props.field === 'objectId') { + relatedObject = new Parse.Object(pointerClassName); + relatedObject.id = value; + } + onPointerClick({ className, id: relatedObject.toPointer(), field }) + } + }) + }); + }); + + return relatedRecordsMenuItem.items.length ? relatedRecordsMenuItem : undefined; + } + } + + pickFilter(constraint, addToExistingFilter) { + const { filters, type, value, field } = this.props; + const newFilters = addToExistingFilter ? filters : new List(); + const compareTo = type === 'Pointer' ? value.toPointer() : value; + + this.props.onFilterChange(newFilters.push(new Map({ + field, + constraint, + compareTo + }))); + } + + //#endregion + render() { - let { type, value, hidden, width, current, onSelect, onEditChange, onFilterChange, setCopyableValue, setRelation, setContextMenu, onPointerClick, row, col } = this.props; + let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, onPointerClick, row, col } = this.props; let content = value; this.copyableValue = content; let classes = [styles.cell, unselectable]; @@ -171,85 +281,8 @@ export default class BrowserCell extends Component { onEditChange(true); } }} - onContextMenu={e => { - if (e.type !== 'contextmenu') { return; } - e.preventDefault(); - - onSelect({ row, col }); - setCopyableValue(hidden ? undefined : this.copyableValue); - - const menuItems = []; - const { field, value, type } = this.props; - - const pickFilter = (constraint, addToExistingFilter) => { - const filters = addToExistingFilter ? this.props.filters : new List(); - const compareTo = type === 'Pointer' ? value.toPointer() : value; - - onFilterChange(filters.push(new Map({ - field: field, - constraint, - compareTo - }))); - }; - - const available = Filters.availableFilters(this.props.simplifiedSchema, this.props.filters); - const constraints = available && available[field]; - - if (constraints) { - menuItems.push({ - text: 'Set filter...', items: constraints.map(constraint => { - const definition = Filters.Constraints[constraint]; - const text = `${field} ${definition.name}${definition.comparable ? (' ' + this.copyableValue) : ''}`; - return { - text, - callback: pickFilter.bind(this, constraint) - }; - }) - }); - - if (this.props.filters && this.props.filters.size > 0) { - menuItems.push({ - text: 'Add filter...', items: constraints.map(constraint => { - const definition = Filters.Constraints[constraint]; - const text = `${field} ${definition.name}${definition.comparable ? (' ' + this.copyableValue) : ''}`; - return { - text, - callback: pickFilter.bind(this, constraint) - }; - }) - }); - } - } - - // Push "Get related records from..." context menu item if cell holds a Pointer - // or objectId and there's a class in relation - const pointerClassName = (this.props.value && this.props.value.className) - || (field === 'objectId' && this.props.className); - if (pointerClassName) { - const relatedRecordsMenuItem = { text: 'Get related records from...', items: [] }; - this.props.schema.data.get('classes').forEach((cl, className) => { - cl.forEach((column, field) => { - if (column.targetClass !== pointerClassName) { return; } - relatedRecordsMenuItem.items.push({ - text: className, callback: () => { - let relatedObject = value; - if (this.props.field === 'objectId') { - relatedObject = new Parse.Object(pointerClassName); - relatedObject.id = value; - } - onPointerClick({ className, id: relatedObject.toPointer(), field }) - } - }) - }); - }); - - relatedRecordsMenuItem.items.length > 0 && menuItems.push(relatedRecordsMenuItem); - } - - const { pageX, pageY } = e; - menuItems.length && setContextMenu(pageX, pageY, menuItems); - - }}> + onContextMenu={this.onContextMenu.bind(this)} + > {content} ); From 649925d05782d5522c3b28fa216cefab27ab3851 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Tue, 31 Dec 2019 00:58:50 +0100 Subject: [PATCH 021/117] Passing BLACKLISTED_FILTERS when getting filters available for context menu --- src/components/BrowserCell/BrowserCell.react.js | 2 +- src/components/BrowserFilter/BrowserFilter.react.js | 8 +++----- src/lib/Filters.js | 2 ++ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 7db2de2f56..81a56a9c73 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -75,7 +75,7 @@ export default class BrowserCell extends Component { onSelect({ row, col }); setCopyableValue(hidden ? undefined : this.copyableValue); - const available = Filters.availableFilters(this.props.simplifiedSchema, this.props.filters); + const available = Filters.availableFilters(this.props.simplifiedSchema, this.props.filters, Filters.BLACKLISTED_FILTERS); const constraints = available && available[field]; const { pageX, pageY } = event; diff --git a/src/components/BrowserFilter/BrowserFilter.react.js b/src/components/BrowserFilter/BrowserFilter.react.js index 9d821b6fca..d01766ccaf 100644 --- a/src/components/BrowserFilter/BrowserFilter.react.js +++ b/src/components/BrowserFilter/BrowserFilter.react.js @@ -17,8 +17,6 @@ import ReactDOM from 'react-dom'; import styles from 'components/BrowserFilter/BrowserFilter.scss'; import { List, Map } from 'immutable'; -const BLACKLISTED_FILTERS = [ 'containsAny', 'doesNotContainAny' ]; - export default class BrowserFilter extends React.Component { constructor() { super(); @@ -43,7 +41,7 @@ export default class BrowserFilter extends React.Component { toggle() { let filters = this.props.filters; if (this.props.filters.size === 0) { - let available = Filters.availableFilters(this.props.schema, null, BLACKLISTED_FILTERS); + let available = Filters.availableFilters(this.props.schema, null, Filters.BLACKLISTED_FILTERS); let field = Object.keys(available)[0]; filters = new List([new Map({ field: field, constraint: available[field][0] })]); } @@ -55,7 +53,7 @@ export default class BrowserFilter extends React.Component { } addRow() { - let available = Filters.availableFilters(this.props.schema, this.state.filters, BLACKLISTED_FILTERS); + let available = Filters.availableFilters(this.props.schema, this.state.filters, Filters.BLACKLISTED_FILTERS); let field = Object.keys(available)[0]; this.setState(({ filters }) => ({ filters: filters.push(new Map({ field: field, constraint: available[field][0] })), @@ -97,7 +95,7 @@ export default class BrowserFilter extends React.Component {
        this.setState({ filters: filters })} diff --git a/src/lib/Filters.js b/src/lib/Filters.js index 3a04e57fa4..18a618aaa4 100644 --- a/src/lib/Filters.js +++ b/src/lib/Filters.js @@ -231,3 +231,5 @@ export function availableFilters(schema, currentFilters, blacklist) { } return available; } + +export const BLACKLISTED_FILTERS = [ 'containsAny', 'doesNotContainAny' ]; \ No newline at end of file From 09a510acdc7b91a9c0f27bb6d439c1f78f008d53 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Tue, 31 Dec 2019 01:01:08 +0100 Subject: [PATCH 022/117] Restoring accidentally removed line --- src/lib/Filters.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/Filters.js b/src/lib/Filters.js index 18a618aaa4..f95a705a93 100644 --- a/src/lib/Filters.js +++ b/src/lib/Filters.js @@ -113,6 +113,7 @@ export const Constraints = { keyExists: { name: 'key exists', field: 'Object', + composable: true, comparable: false }, keyDne: { From 8dce3796b0cd7ed742b9869122c8b45d51295316 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Tue, 31 Dec 2019 10:11:12 +0100 Subject: [PATCH 023/117] Sorting objects listed in context menu item "Get related records from..." alphabetically; --- src/components/BrowserCell/BrowserCell.react.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index 81a56a9c73..bdbd585530 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -139,7 +139,7 @@ export default class BrowserCell extends Component { || (this.props.field === 'objectId' && this.props.className); if (pointerClassName) { const relatedRecordsMenuItem = { text: 'Get related records from...', items: [] }; - schema.data.get('classes').forEach((cl, className) => { + schema.data.get('classes').sortBy((v, k) => k).forEach((cl, className) => { cl.forEach((column, field) => { if (column.targetClass !== pointerClassName) { return; } relatedRecordsMenuItem.items.push({ From f3af11251e625f493038eb7586db0d4ab091a8a3 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Fri, 3 Jan 2020 20:40:23 +0100 Subject: [PATCH 024/117] Handling context menu filters for "Date" type of data --- src/components/BrowserCell/BrowserCell.react.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index bdbd585530..ff7c23af3b 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -162,7 +162,22 @@ export default class BrowserCell extends Component { pickFilter(constraint, addToExistingFilter) { const { filters, type, value, field } = this.props; const newFilters = addToExistingFilter ? filters : new List(); - const compareTo = type === 'Pointer' ? value.toPointer() : value; + let compareTo; + switch (type) { + case 'Pointer': + compareTo = value.toPointer() + break; + case 'Date': + compareTo = value.__type ? value : { + __type: 'Date', + iso: value + }; + break; + + default: + compareTo = value; + break; + } this.props.onFilterChange(newFilters.push(new Map({ field, From a5717848447b704b3382b41e900d6d7eb26f9c04 Mon Sep 17 00:00:00 2001 From: Artur Drozdz Date: Fri, 3 Jan 2020 20:46:16 +0100 Subject: [PATCH 025/117] Getting "compareTo" value only for constrains that are comparable --- .../BrowserCell/BrowserCell.react.js | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index ff7c23af3b..f02f980e50 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -160,23 +160,26 @@ export default class BrowserCell extends Component { } pickFilter(constraint, addToExistingFilter) { + const definition = Filters.Constraints[constraint]; const { filters, type, value, field } = this.props; const newFilters = addToExistingFilter ? filters : new List(); let compareTo; - switch (type) { - case 'Pointer': - compareTo = value.toPointer() - break; - case 'Date': - compareTo = value.__type ? value : { - __type: 'Date', - iso: value - }; - break; + if (definition.comparable) { + switch (type) { + case 'Pointer': + compareTo = value.toPointer() + break; + case 'Date': + compareTo = value.__type ? value : { + __type: 'Date', + iso: value + }; + break; - default: - compareTo = value; - break; + default: + compareTo = value; + break; + } } this.props.onFilterChange(newFilters.push(new Map({ From c688f6901d5999c918d86a7ba977878103fe2932 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Sun, 19 Jan 2020 04:36:10 +0000 Subject: [PATCH 026/117] =?UTF-8?q?Update=20csurf=20to=20the=20latest=20ve?= =?UTF-8?q?rsion=20=F0=9F=9A=80=20(#1452)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(package): update csurf to version 1.11.0 * chore(package): update lockfile package-lock.json --- package-lock.json | 35 +++++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 70444e2af3..faf7b7c82b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5977,9 +5977,9 @@ } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-session": { "version": "2.0.0-beta.3", @@ -6315,14 +6315,33 @@ "integrity": "sha512-9Mcn9sFbGBAdmimWb2gLVDtFJzeKtDGIr76TUqmjZrw9LFXBMSU70lcs+C0/7fyCd6iBDqmksUcCOUIkisPHsQ==" }, "csurf": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.10.0.tgz", - "integrity": "sha512-fh725p0R83wA5JukCik5hdEko/LizW/Vl7pkKDa1WJUVCosg141mqaAWCScB+nkEaRMFMGbutHMOr6oBNc/j9A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.11.0.tgz", + "integrity": "sha512-UCtehyEExKTxgiu8UHdGvHj4tnpE/Qctue03Giq5gPgMQ9cg/ciod5blZQ5a4uCEenNQjxyGuzygLdKUmee/bQ==", "requires": { - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "csrf": "3.1.0", - "http-errors": "~1.7.2" + "http-errors": "~1.7.3" + }, + "dependencies": { + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } } }, "cuid": { diff --git a/package.json b/package.json index 2461755e2e..684a1334da 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "cookie-session": "2.0.0-beta.3", "copy-to-clipboard": "^3.2.0", "create-react-class": "15.6.3", - "csurf": "1.10.0", + "csurf": "1.11.0", "express": "4.17.1", "graphql": "14.5.8", "graphql-playground-react": "1.7.20", From a5c452829e7d722e5e168f9377e186a6a39c9fbb Mon Sep 17 00:00:00 2001 From: Jeff Gu Kang Date: Thu, 23 Jan 2020 17:31:40 +0900 Subject: [PATCH 027/117] Update README.md (#1455) * Update README.md Add the PARSE_DASHBOARD_COOKIE_SESSION_SECRET option explanation * improve grammar Co-authored-by: Tom Fox <13188249+TomWFox@users.noreply.github.com> --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5d949625ea..625c482762 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,8 @@ PARSE_DASHBOARD_USER_PASSWORD: "pass" PARSE_DASHBOARD_SSL_KEY: "sslKey" PARSE_DASHBOARD_SSL_CERT: "sslCert" PARSE_DASHBOARD_CONFIG: undefined // Only for reference, it must not exist +PARSE_DASHBOARD_COOKIE_SESSION_SECRET: undefined // set the cookie session secret, defaults to a random string. Use this option if you want sessions to work across multiple servers, or across restarts + ``` ## Managing Multiple Apps From 3f15f6f8e45bf1540a104177919784b7170e884f Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Sat, 25 Jan 2020 19:06:35 +0000 Subject: [PATCH 028/117] =?UTF-8?q?Update=20cross-env=20to=20the=20latest?= =?UTF-8?q?=20version=20=F0=9F=9A=80=20(#1456)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(package): update cross-env to version 7.0.0 * chore(package): update lockfile package-lock.json --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index faf7b7c82b..fdb13384df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6165,12 +6165,12 @@ } }, "cross-env": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", - "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.0.tgz", + "integrity": "sha512-rV6M9ldNgmwP7bx5u6rZsTbYidzwvrwIYZnT08hSGLcQCcggofgFW+sNe7IhA1SRauPS0QuLbbX+wdNtpqE5CQ==", "dev": true, "requires": { - "cross-spawn": "^7.0.0" + "cross-spawn": "^7.0.1" } }, "cross-fetch": { @@ -12851,9 +12851,9 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", - "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -16667,9 +16667,9 @@ } }, "which": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", - "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" diff --git a/package.json b/package.json index 684a1334da..60fb19a6b9 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "babel-loader": "8.0.6", "babel-plugin-transform-object-rest-spread": "6.26.0", "core-js": "3.4.4", - "cross-env": "6.0.3", + "cross-env": "7.0.0", "css-loader": "3.4.0", "eslint": "6.8.0", "eslint-plugin-jest": "23.2.0", From 2a20162f69aad72f0c9a17617a1c2b38d5eb68b5 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Sun, 26 Jan 2020 16:45:40 +0000 Subject: [PATCH 029/117] =?UTF-8?q?Update=20graphql=20to=20the=20latest=20?= =?UTF-8?q?version=20=F0=9F=9A=80=20(#1457)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(package): update graphql to version 14.6.0 * chore(package): update lockfile package-lock.json --- package-lock.json | 7 +++---- package.json | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdb13384df..514b96f561 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8802,9 +8802,9 @@ } }, "graphql": { - "version": "14.5.8", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.8.tgz", - "integrity": "sha512-MMwmi0zlVLQKLdGiMfWkgQD7dY/TUKt4L+zgJ/aR0Howebod3aNgP5JkgvAULiR2HPVZaP2VEElqtdidHweLkg==", + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.6.0.tgz", + "integrity": "sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==", "requires": { "iterall": "^1.2.2" } @@ -12728,7 +12728,6 @@ "deepcopy": "2.0.0", "express": "4.17.1", "follow-redirects": "1.9.0", - "graphql": "14.5.8", "graphql-list-fields": "2.0.2", "graphql-tools": "^4.0.5", "graphql-upload": "8.1.0", diff --git a/package.json b/package.json index 60fb19a6b9..c0cdb554db 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "create-react-class": "15.6.3", "csurf": "1.11.0", "express": "4.17.1", - "graphql": "14.5.8", + "graphql": "14.6.0", "graphql-playground-react": "1.7.20", "history": "4.10.1", "immutable": "4.0.0-rc.9", From 47c40c620885f3903146484d548b9b5dbe048a03 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2020 15:31:20 +0000 Subject: [PATCH 030/117] =?UTF-8?q?Update=20puppeteer=20to=20the=20latest?= =?UTF-8?q?=20version=20=F0=9F=9A=80=20(#1458)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(package): update puppeteer to version 2.1.0 * chore(package): update lockfile package-lock.json --- package-lock.json | 58 +++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 514b96f561..5ed944cee4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3909,6 +3909,12 @@ "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", "dev": true }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", + "dev": true + }, "@types/node": { "version": "12.11.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", @@ -13512,21 +13518,29 @@ "dev": true }, "puppeteer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.0.0.tgz", - "integrity": "sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.0.tgz", + "integrity": "sha512-PC4oKMtwAElo8YtS/cYnk2/dew/3TonsGKKzjpFLWwkhBCteFsOZCVOXTt2QlP6w53mH0YsJE+fPLPzOW+DCug==", "dev": true, "requires": { + "@types/mime-types": "^2.1.0", "debug": "^4.1.0", "extract-zip": "^1.6.6", - "https-proxy-agent": "^3.0.0", + "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", + "mime-types": "^2.1.25", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", "rimraf": "^2.6.1", "ws": "^6.1.0" }, "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -13537,24 +13551,13 @@ } }, "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "agent-base": "5", + "debug": "4" } }, "mime": { @@ -13563,6 +13566,21 @@ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", diff --git a/package.json b/package.json index c0cdb554db..bccbd28eef 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "null-loader": "^3.0.0", "parse-server": "github:parseplatform/parse-server#master", "path-to-regexp": "3.2.0", - "puppeteer": "2.0.0", + "puppeteer": "2.1.0", "react-test-renderer": "16.12.0", "request": "2.87.0", "request-promise": "4.2.5", From c2bddd781e99dae0c5aa5cd5da398dfe387ea8c4 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Thu, 30 Jan 2020 13:45:09 +0000 Subject: [PATCH 031/117] =?UTF-8?q?Update=20babel7=20to=20the=20latest=20v?= =?UTF-8?q?ersion=20=F0=9F=9A=80=20(#1461)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(package): update @babel/core to version 7.8.4 * chore(package): update @babel/plugin-proposal-decorators to version 7.8.3 * chore(package): update @babel/preset-env to version 7.8.4 * chore(package): update @babel/preset-react to version 7.8.3 * fix(package): update @babel/runtime to version 7.8.4 * chore(package): update lockfile package-lock.json --- package-lock.json | 1123 ++++++++++++++++++--------------------------- package.json | 10 +- 2 files changed, 454 insertions(+), 679 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ed944cee4..23a11cff14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,12 +28,12 @@ } }, "@babel/compat-data": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", - "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.4.tgz", + "integrity": "sha512-lHLhlsvFjJAqNU71b7k6Vv9ewjmTXKvqaMv7n0G1etdCabWLw3nEYE8mmgoVOxMIFE07xOvo7H7XBASirX6Rrg==", "dev": true, "requires": { - "browserslist": "^4.8.2", + "browserslist": "^4.8.5", "invariant": "^2.2.4", "semver": "^5.5.0" }, @@ -47,18 +47,18 @@ } }, "@babel/core": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", - "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helpers": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -70,59 +70,59 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -131,43 +131,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -250,19 +250,19 @@ } }, "@babel/helper-builder-react-jsx": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz", - "integrity": "sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", + "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "esutils": "^2.0.0" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -293,9 +293,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -345,9 +345,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -362,16 +362,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -407,15 +407,15 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz", - "integrity": "sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", + "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", "dev": true, "requires": { - "@babel/compat-data": "^7.8.1", - "browserslist": "^4.8.2", + "@babel/compat-data": "^7.8.4", + "browserslist": "^4.8.5", "invariant": "^2.2.4", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { @@ -428,67 +428,67 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", - "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", + "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-member-expression-to-functions": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -497,26 +497,26 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -588,9 +588,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -637,9 +637,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -689,9 +689,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -706,16 +706,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -791,18 +791,18 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", - "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -873,9 +873,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -903,18 +903,18 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", - "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -962,9 +962,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -1023,9 +1023,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1040,16 +1040,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -1085,71 +1085,71 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", - "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", + "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1158,43 +1158,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1250,9 +1250,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1309,9 +1309,9 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { "@babel/types": "^7.8.3", @@ -1361,9 +1361,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -1378,16 +1378,16 @@ } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.8.4", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", + "@babel/parser": "^7.8.4", "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", @@ -1423,70 +1423,70 @@ } }, "@babel/helpers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", - "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", "dev": true, "requires": { - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.8.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "dev": true, "requires": { - "@babel/types": "^7.8.0", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.8.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", @@ -1495,43 +1495,43 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1591,20 +1591,20 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.0.tgz", - "integrity": "sha512-HKltBhhrRigrHYkDrO/9rg+ZerXSAtZjepm8URUrNxgzTzEfuOb06fUU311chMkahZHSfASNUxWVwRzIwGt/uw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", + "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-decorators": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-decorators": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } @@ -1762,18 +1762,18 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.0.tgz", - "integrity": "sha512-Qz68qh9jJqQePGWqbNW9PA7vkE2gvnWkYtx32jgPOszpE7u+xObPkRGm3B80oXAjQlBdTa4ktqjkOIRiKRuapw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", + "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } @@ -1813,18 +1813,18 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", - "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } @@ -2022,18 +2022,6 @@ "@babel/highlight": "^7.8.3" } }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, "@babel/helper-annotate-as-pure": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", @@ -2063,42 +2051,12 @@ "@babel/types": "^7.8.3" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, "@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, "@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", @@ -2120,9 +2078,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -2136,23 +2094,6 @@ "@babel/types": "^7.8.3" } }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, "@babel/types": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", @@ -2163,21 +2104,6 @@ "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, @@ -2269,9 +2195,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz", - "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", + "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -2342,9 +2268,9 @@ } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "dev": true }, "@babel/template": { @@ -2518,169 +2444,18 @@ "@babel/helper-replace-supers": "^7.8.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, "@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", - "dev": true - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, "@babel/plugin-transform-parameters": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz", - "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", + "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", "dev": true, "requires": { "@babel/helper-call-delegate": "^7.8.3", @@ -2734,73 +2509,73 @@ } }, "@babel/plugin-transform-react-display-name": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.0.tgz", - "integrity": "sha512-oozdOhU2hZ6Tb9LS9BceGqDSmiUrlZX8lmRqnxQuiGzqWlhflIRQ1oFBHdV+hv+Zi9e5BhRkfSYtMLRLEkuOVA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } }, "@babel/plugin-transform-react-jsx": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.0.tgz", - "integrity": "sha512-r5DgP2ZblaGmW/azRS9rlaf3oY4r/ByXRDA5Lcr3iHUkx3cCfL9RM10gU7AQmzwKymoq8LZ55sHyq9VeQFHwyQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", + "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-jsx": "^7.8.0" + "@babel/helper-builder-react-jsx": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.0.tgz", - "integrity": "sha512-hJXfJdLDDlJoxW/rAjkuIpGUUTizQ6fN9tIciW1M8KIqFsmpEf9psBPNTXYRCOLYLEsra+/WgVq+sc+1z05nQw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", + "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-jsx": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.0.tgz", - "integrity": "sha512-W+0VXOhMRdUTL7brjKXND+BiXbsxczfMdZongQ/Jtti0JVMtcTxWo66NMxNNtbPYvbc4aUXmgjl3eMms41sYtg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", + "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-jsx": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } @@ -2968,9 +2743,9 @@ } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz", - "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -3003,23 +2778,23 @@ } }, "@babel/preset-env": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.2.tgz", - "integrity": "sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.8.0", - "@babel/helper-compilation-targets": "^7.8.0", - "@babel/helper-module-imports": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-proposal-async-generator-functions": "^7.8.0", - "@babel/plugin-proposal-dynamic-import": "^7.8.0", - "@babel/plugin-proposal-json-strings": "^7.8.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-proposal-object-rest-spread": "^7.8.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.0", - "@babel/plugin-proposal-optional-chaining": "^7.8.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.0", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -3027,43 +2802,43 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.0", - "@babel/plugin-transform-arrow-functions": "^7.8.0", - "@babel/plugin-transform-async-to-generator": "^7.8.0", - "@babel/plugin-transform-block-scoped-functions": "^7.8.0", - "@babel/plugin-transform-block-scoping": "^7.8.0", - "@babel/plugin-transform-classes": "^7.8.0", - "@babel/plugin-transform-computed-properties": "^7.8.0", - "@babel/plugin-transform-destructuring": "^7.8.0", - "@babel/plugin-transform-dotall-regex": "^7.8.0", - "@babel/plugin-transform-duplicate-keys": "^7.8.0", - "@babel/plugin-transform-exponentiation-operator": "^7.8.0", - "@babel/plugin-transform-for-of": "^7.8.0", - "@babel/plugin-transform-function-name": "^7.8.0", - "@babel/plugin-transform-literals": "^7.8.0", - "@babel/plugin-transform-member-expression-literals": "^7.8.0", - "@babel/plugin-transform-modules-amd": "^7.8.0", - "@babel/plugin-transform-modules-commonjs": "^7.8.0", - "@babel/plugin-transform-modules-systemjs": "^7.8.0", - "@babel/plugin-transform-modules-umd": "^7.8.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.0", - "@babel/plugin-transform-new-target": "^7.8.0", - "@babel/plugin-transform-object-super": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.8.0", - "@babel/plugin-transform-property-literals": "^7.8.0", - "@babel/plugin-transform-regenerator": "^7.8.0", - "@babel/plugin-transform-reserved-words": "^7.8.0", - "@babel/plugin-transform-shorthand-properties": "^7.8.0", - "@babel/plugin-transform-spread": "^7.8.0", - "@babel/plugin-transform-sticky-regex": "^7.8.0", - "@babel/plugin-transform-template-literals": "^7.8.0", - "@babel/plugin-transform-typeof-symbol": "^7.8.0", - "@babel/plugin-transform-unicode-regex": "^7.8.0", - "@babel/types": "^7.8.0", - "browserslist": "^4.8.2", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { @@ -3111,30 +2886,30 @@ } }, "@babel/preset-react": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.0.tgz", - "integrity": "sha512-GP9t18RjtH67ea3DA2k71VqtMnTOupYJx34Z+KUEBRoRxvdETaucmtMWH5uoGHWzAD4qxbuV5ckxpewm39NXkA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", + "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-transform-react-display-name": "^7.8.0", - "@babel/plugin-transform-react-jsx": "^7.8.0", - "@babel/plugin-transform-react-jsx-self": "^7.8.0", - "@babel/plugin-transform-react-jsx-source": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-react-display-name": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.8.3", + "@babel/plugin-transform-react-jsx-self": "^7.8.3", + "@babel/plugin-transform-react-jsx-source": "^7.8.3" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", - "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true } } }, "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", + "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -5353,14 +5128,14 @@ } }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "version": "4.8.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", + "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001023", + "electron-to-chromium": "^1.3.341", + "node-releases": "^1.1.47" } }, "bser": { @@ -5568,9 +5343,9 @@ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, "caniuse-lite": { - "version": "1.0.30001020", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", - "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==", + "version": "1.0.30001023", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz", + "integrity": "sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==", "dev": true }, "capture-exit": { @@ -6057,9 +5832,9 @@ "dev": true }, "core-js-compat": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.3.tgz", - "integrity": "sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", "dev": true, "requires": { "browserslist": "^4.8.3", @@ -6808,9 +6583,9 @@ "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==" }, "electron-to-chromium": { - "version": "1.3.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", - "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==", + "version": "1.3.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.344.tgz", + "integrity": "sha512-tvbx2Wl8WBR+ym3u492D0L6/jH+8NoQXqe46+QhbWH3voVPauGuZYeb1QAXYoOAWuiP2dbSvlBx0kQ1F3hu/Mw==", "dev": true }, "elliptic": { @@ -10842,9 +10617,9 @@ "dev": true }, "levenary": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", - "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", "dev": true, "requires": { "leven": "^3.1.0" @@ -11933,9 +11708,9 @@ } }, "node-releases": { - "version": "1.1.45", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", - "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", + "version": "1.1.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", "dev": true, "requires": { "semver": "^6.3.0" diff --git a/package.json b/package.json index bccbd28eef..5af066c2dd 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "LICENSE" ], "dependencies": { - "@babel/runtime": "7.8.3", + "@babel/runtime": "7.8.4", "bcryptjs": "2.3.0", "body-parser": "1.19.0", "codemirror-graphql": "github:timsuchanek/codemirror-graphql#details-fix", @@ -71,12 +71,12 @@ "semver": "7.1.1" }, "devDependencies": { - "@babel/core": "7.8.0", - "@babel/plugin-proposal-decorators": "7.8.0", + "@babel/core": "7.8.4", + "@babel/plugin-proposal-decorators": "7.8.3", "@babel/plugin-transform-regenerator": "7.8.3", "@babel/plugin-transform-runtime": "7.8.3", - "@babel/preset-env": "7.8.2", - "@babel/preset-react": "7.8.0", + "@babel/preset-env": "7.8.4", + "@babel/preset-react": "7.8.3", "babel-eslint": "10.0.3", "babel-loader": "8.0.6", "babel-plugin-transform-object-rest-spread": "6.26.0", From 1dc5facdb6e842359e5c4b34b8a6b8668e714a2f Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2020 02:05:17 +0000 Subject: [PATCH 032/117] =?UTF-8?q?Update=20semver=20to=20the=20latest=20v?= =?UTF-8?q?ersion=20=F0=9F=9A=80=20(#1462)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(package): update semver to version 7.1.2 * chore(package): update lockfile package-lock.json --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23a11cff14..7dccdedb3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14616,9 +14616,9 @@ "optional": true }, "semver": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", - "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.2.tgz", + "integrity": "sha512-BJs9T/H8sEVHbeigqzIEo57Iu/3DG6c4QoqTfbQB3BPA4zgzAomh/Fk9E7QtjWQ8mx2dgA9YCfSF4y9k9bHNpQ==" }, "send": { "version": "0.17.1", diff --git a/package.json b/package.json index 5af066c2dd..c8fdc5e62b 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "react-router": "5.1.2", "react-router-dom": "5.1.2", "regenerator-runtime": "0.13.3", - "semver": "7.1.1" + "semver": "7.1.2" }, "devDependencies": { "@babel/core": "7.8.4", From 01af861b5bb7474b6b1b610bd00db0d19e3ed256 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Mon, 3 Feb 2020 06:36:52 +0000 Subject: [PATCH 033/117] =?UTF-8?q?Update=20commander=20to=20the=20latest?= =?UTF-8?q?=20version=20=F0=9F=9A=80=20(#1467)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(package): update commander to version 4.1.1 * chore(package): update lockfile package-lock.json --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7dccdedb3d..b8951f56b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5660,9 +5660,9 @@ } }, "commander": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz", - "integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" }, "commondir": { "version": "1.0.1", diff --git a/package.json b/package.json index c8fdc5e62b..500ad5a0ad 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "bcryptjs": "2.3.0", "body-parser": "1.19.0", "codemirror-graphql": "github:timsuchanek/codemirror-graphql#details-fix", - "commander": "4.0.1", + "commander": "4.1.1", "connect-flash": "0.1.1", "cookie-session": "2.0.0-beta.3", "copy-to-clipboard": "^3.2.0", From 8edef22d5ce4068ca173191ab68d043e8098d810 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Wed, 5 Feb 2020 14:15:45 +0000 Subject: [PATCH 034/117] =?UTF-8?q?Update=20puppeteer=20to=20the=20latest?= =?UTF-8?q?=20version=20=F0=9F=9A=80=20(#1468)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(package): update puppeteer to version 2.1.1 * chore(package): update lockfile package-lock.json --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8951f56b9..91962b3eca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13293,9 +13293,9 @@ "dev": true }, "puppeteer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.0.tgz", - "integrity": "sha512-PC4oKMtwAElo8YtS/cYnk2/dew/3TonsGKKzjpFLWwkhBCteFsOZCVOXTt2QlP6w53mH0YsJE+fPLPzOW+DCug==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", + "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", "dev": true, "requires": { "@types/mime-types": "^2.1.0", diff --git a/package.json b/package.json index 500ad5a0ad..a50e510bac 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "null-loader": "^3.0.0", "parse-server": "github:parseplatform/parse-server#master", "path-to-regexp": "3.2.0", - "puppeteer": "2.1.0", + "puppeteer": "2.1.1", "react-test-renderer": "16.12.0", "request": "2.87.0", "request-promise": "4.2.5", From 21c018b6a6b648857c12bda97fb21e496f2e3e6f Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2020 21:30:35 +0000 Subject: [PATCH 035/117] =?UTF-8?q?Update=20eslint-plugin-jest=20to=20the?= =?UTF-8?q?=20latest=20version=20=F0=9F=9A=80=20(#1469)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(package): update eslint-plugin-jest to version 23.7.0 * chore(package): update lockfile package-lock.json --- package-lock.json | 28 +++++++++++----------------- package.json | 2 +- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 91962b3eca..bff24ecf74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3757,27 +3757,27 @@ "dev": true }, "@typescript-eslint/experimental-utils": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.13.0.tgz", - "integrity": "sha512-+Hss3clwa6aNiC8ZjA45wEm4FutDV5HsVXPl/rDug1THq6gEtOYRGLqS3JlTk7mSnL5TbJz0LpEbzbPnKvY6sw==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.19.0.tgz", + "integrity": "sha512-zwpg6zEOPbhB3+GaQfufzlMUOO6GXCNZq6skk+b2ZkZAIoBhVoanWK255BS1g5x9bMwHpLhX0Rpn5Fc3NdCZdg==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.13.0", + "@typescript-eslint/typescript-estree": "2.19.0", "eslint-scope": "^5.0.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.13.0.tgz", - "integrity": "sha512-t21Mg5cc8T3ADEUGwDisHLIubgXKjuNRbkpzDMLb7/JMmgCe/gHM9FaaujokLey+gwTuLF5ndSQ7/EfQqrQx4g==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.19.0.tgz", + "integrity": "sha512-n6/Xa37k0jQdwpUszffi19AlNbVCR0sdvCs3DmSKMD7wBttKY31lhD2fug5kMD91B2qW4mQldaTEc1PEzvGu8w==", "dev": true, "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", "glob": "^7.1.6", "is-glob": "^4.0.1", - "lodash.unescape": "4.0.1", + "lodash": "^4.17.15", "semver": "^6.3.0", "tsutils": "^3.17.1" }, @@ -6934,9 +6934,9 @@ "dev": true }, "eslint-plugin-jest": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.2.0.tgz", - "integrity": "sha512-/jbCUW+g0jejXAvsytgcNhii6uEgolt0RO2e4+mhmXybfkcram5V3XIyrHCnUsb0vCmDKgHhJ1lYSm7F3VCEDA==", + "version": "23.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.7.0.tgz", + "integrity": "sha512-zkiyGlvJeHNjAEz8FaIxTXNblJJ/zj3waNbYbgflK7K6uy0cpE5zJBt/JpJtOBGM/UGkC6BqsQ4n0y7kQ2HA8w==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^2.5.0" @@ -10777,12 +10777,6 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", - "dev": true - }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", diff --git a/package.json b/package.json index a50e510bac..2b9713c625 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "cross-env": "7.0.0", "css-loader": "3.4.0", "eslint": "6.8.0", - "eslint-plugin-jest": "23.2.0", + "eslint-plugin-jest": "23.7.0", "eslint-plugin-react": "7.17.0", "file-loader": "4.3.0", "http-server": "0.12.0", From df543e5e087a7c377ddab7c9a4ef8057a92c3bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?NIno=20=C4=8Crljenec?= Date: Tue, 11 Feb 2020 09:44:00 +0100 Subject: [PATCH 036/117] View/Edit single row modal (#1448) * EditRowDialog - initial version * TextInput - change focus to new input/textarea field when multiline props has changed * EditRowDialg - removed custom FormModal width * EditRowDialog - initial version * TextInput - change focus to new input/textarea field when multiline props has changed * EditRowDialg - removed custom FormModal width * package-lock.json sync after rebase from master * EditRowDialog - moved objectId, createdAt, updatedAt to dialog title. ACL added as confim button in footer. Also removed these fields from content * EditRowDialog - creating new objects with modal implemented * EditRowDialog: - fixed bug when creating new objects with modal; - ACL modal visible without closing editRowDialog; - fixed bug when relation clicked after newly saved object - FormModal replaced with Modal component * EditRowDialog - picker for pointer and relation Co-authored-by: Antonio Davi Macedo Coelho de Castro --- package-lock.json | 1366 +++++++++++------ .../BrowserCell/BrowserCell.react.js | 19 +- .../BrowserFilter/BrowserFilter.react.js | 16 +- .../BrowserFilter/BrowserFilter.scss | 6 + src/components/BrowserRow/BrowserRow.react.js | 6 +- .../ChromeDropdown/ChromeDropdown.react.js | 2 +- .../ColumnsConfiguration.react.js | 6 +- .../ColumnsConfiguration.scss | 6 + .../DataBrowserHeaderBar.react.js | 36 +- .../DataBrowserHeaderBar.scss | 8 + src/components/FileEditor/FileEditor.react.js | 22 +- src/components/FileEditor/FileEditor.scss | 2 +- .../GeoPointEditor/GeoPointEditor.react.js | 27 +- src/components/Popover/Popover.react.js | 21 +- src/components/TextInput/TextInput.react.js | 33 +- src/components/Toolbar/Toolbar.scss | 16 + src/dashboard/Data/Browser/Browser.react.js | 105 +- src/dashboard/Data/Browser/Browser.scss | 62 + .../Data/Browser/BrowserTable.react.js | 17 +- .../Data/Browser/BrowserToolbar.react.js | 32 +- .../Data/Browser/DataBrowser.react.js | 10 +- .../Data/Browser/EditRowDialog.react.js | 423 +++++ src/dashboard/Data/Browser/Editor.react.js | 5 +- .../Data/Browser/ObjectPickerDialog.react.js | 411 +++++ 24 files changed, 2080 insertions(+), 577 deletions(-) create mode 100644 src/dashboard/Data/Browser/EditRowDialog.react.js create mode 100644 src/dashboard/Data/Browser/ObjectPickerDialog.react.js diff --git a/package-lock.json b/package-lock.json index bff24ecf74..bd7ffa20fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,13 +4,33 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@apollographql/apollo-tools": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.0.tgz", - "integrity": "sha512-7wEO+S+zgz/wVe3ilFQqICufRBYYDSNUkd1V03JWvXuSydbYq2SM5EgvWmFF+04iadt+aQ0XCCsRzCzRPQODfQ==", + "@apollo/protobufjs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.0.3.tgz", + "integrity": "sha512-gqeT810Ect9WIqsrgfUvr+ljSB5m1PyBae9HGdrRyQ3HjHjTcjVvxpsMYXlUk4rUHnrfUqyoGvLSy2yLlRGEOw==", "dev": true, "requires": { - "apollo-env": "0.5.1" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", + "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==", + "dev": true + } } }, "@apollographql/graphql-playground-html": { @@ -3338,27 +3358,6 @@ } } }, - "@parse/push-adapter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-3.1.0.tgz", - "integrity": "sha512-SvLXKtAtlVMvlwl0Dw3smpy8ZgGicZDIxkUokV5HrZIFaQxHCEIj+9aj4y9IYOo6+7jE97vVwDmvh+n4geyZRg==", - "dev": true, - "requires": { - "@parse/node-apn": "^3.1.0", - "@parse/node-gcm": "^1.0.0", - "npmlog": "^4.0.2", - "parse": "^2.7.1" - } - }, - "@parse/s3-files-adapter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@parse/s3-files-adapter/-/s3-files-adapter-1.3.0.tgz", - "integrity": "sha512-Sw5P2qLt5wxFv/j8auChfOomZFIZ4jhP5f85qpgOk1OCITFwvd7FWF6Qo3N72Hqn/9MCr76tblb/JBNEU+Qgjw==", - "dev": true, - "requires": { - "aws-sdk": "^2.59.0" - } - }, "@parse/simple-mailgun-adapter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@parse/simple-mailgun-adapter/-/simple-mailgun-adapter-1.1.0.tgz", @@ -3696,6 +3695,15 @@ "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==", "dev": true }, + "@types/node-fetch": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.4.tgz", + "integrity": "sha512-Oz6id++2qAOFuOlE1j0ouk1dzl3mmI1+qINPNBhi9nt/gVOz0G+13Ao6qjhdF0Ys+eOkhu6JnFmt38bR3H0POQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", @@ -3716,6 +3724,16 @@ "csstype": "^2.2.0" } }, + "@types/readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-Mq2eLkGYamlcolW603FY2ROBvcl90jPF+3jLkjpBV6qS+2aVeJqlgRG0TVAa1oWbmPdb5yOWlOPVvQle76nUNw==", + "dev": true, + "requires": { + "@types/node": "*", + "safe-buffer": "*" + } + }, "@types/serve-static": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", @@ -4150,79 +4168,6 @@ } } }, - "apollo-cache-control": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.5.tgz", - "integrity": "sha512-2yQ1vKgJQ54SGkoQS/ZLZrDX3La6cluAYYdruFYJMJtL4zQrSdeOCy11CQliCMYEd6eKNyE70Rpln51QswW2Og==", - "dev": true, - "requires": { - "apollo-server-env": "^2.4.3", - "graphql-extensions": "^0.10.4" - } - }, - "apollo-datasource": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.6.3.tgz", - "integrity": "sha512-gRYyFVpJgHE2hhS+VxMeOerxXQ/QYxWG7T6QddfugJWYAG9DRCl65e2b7txcGq2NP3r+O1iCm4GNwhRBDJbd8A==", - "dev": true, - "requires": { - "apollo-server-caching": "^0.5.0", - "apollo-server-env": "^2.4.3" - } - }, - "apollo-engine-reporting": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.4.7.tgz", - "integrity": "sha512-qsKDz9VkoctFhojM3Nj3nvRBO98t8TS2uTgtiIjUGs3Hln2poKMP6fIQ37Nm2Q2B3JJst76HQtpPwXmRJd1ZUg==", - "dev": true, - "requires": { - "apollo-engine-reporting-protobuf": "^0.4.1", - "apollo-graphql": "^0.3.4", - "apollo-server-caching": "^0.5.0", - "apollo-server-env": "^2.4.3", - "apollo-server-types": "^0.2.5", - "async-retry": "^1.2.1", - "graphql-extensions": "^0.10.4" - } - }, - "apollo-engine-reporting-protobuf": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.1.tgz", - "integrity": "sha512-d7vFFZ2oUrvGaN0Hpet8joe2ZG0X0lIGilN+SwgVP38dJnOuadjsaYMyrD9JudGQJg0bJA5wVQfYzcCVy0slrw==", - "dev": true, - "requires": { - "protobufjs": "^6.8.6" - } - }, - "apollo-env": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.5.1.tgz", - "integrity": "sha512-fndST2xojgSdH02k5hxk1cbqA9Ti8RX4YzzBoAB4oIe1Puhq7+YlhXGXfXB5Y4XN0al8dLg+5nAkyjNAR2qZTw==", - "dev": true, - "requires": { - "core-js": "^3.0.1", - "node-fetch": "^2.2.0", - "sha.js": "^2.4.11" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true - } - } - }, - "apollo-graphql": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.3.4.tgz", - "integrity": "sha512-w+Az1qxePH4oQ8jvbhQBl5iEVvqcqynmU++x/M7MM5xqN1C7m1kyIzpN17gybXlTJXY4Oxej2WNURC2/hwpfYw==", - "dev": true, - "requires": { - "apollo-env": "^0.5.1", - "lodash.sortby": "^4.7.0" - } - }, "apollo-link": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.13.tgz", @@ -4262,72 +4207,6 @@ "apollo-link": "^1.2.2" } }, - "apollo-server-caching": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.0.tgz", - "integrity": "sha512-l7ieNCGxUaUAVAAp600HjbUJxVaxjJygtPV0tPTe1Q3HkPy6LEWoY6mNHV7T268g1hxtPTxcdRu7WLsJrg7ufw==", - "dev": true, - "requires": { - "lru-cache": "^5.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "apollo-server-core": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.9.7.tgz", - "integrity": "sha512-EqKyROy+21sM93YHjGpy6wlnzK/vH0fnZh7RCf3uB69aQ3OjgdP4AQ5oWRQ62NDN+aoic7OLhChSDJeDonq/NQ==", - "dev": true, - "requires": { - "@apollographql/apollo-tools": "^0.4.0", - "@apollographql/graphql-playground-html": "1.6.24", - "@types/graphql-upload": "^8.0.0", - "@types/ws": "^6.0.0", - "apollo-cache-control": "^0.8.5", - "apollo-datasource": "^0.6.3", - "apollo-engine-reporting": "^1.4.7", - "apollo-server-caching": "^0.5.0", - "apollo-server-env": "^2.4.3", - "apollo-server-errors": "^2.3.4", - "apollo-server-plugin-base": "^0.6.5", - "apollo-server-types": "^0.2.5", - "apollo-tracing": "^0.8.5", - "fast-json-stable-stringify": "^2.0.0", - "graphql-extensions": "^0.10.4", - "graphql-tag": "^2.9.2", - "graphql-tools": "^4.0.0", - "graphql-upload": "^8.0.2", - "sha.js": "^2.4.11", - "subscriptions-transport-ws": "^0.9.11", - "ws": "^6.0.0" - }, - "dependencies": { - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, "apollo-server-env": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.3.tgz", @@ -4344,60 +4223,6 @@ "integrity": "sha512-Y0PKQvkrb2Kd18d1NPlHdSqmlr8TgqJ7JQcNIfhNDgdb45CnqZlxL1abuIRhr8tiw8OhVOcFxz2KyglBi8TKdA==", "dev": true }, - "apollo-server-express": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.9.7.tgz", - "integrity": "sha512-+DuJk1oq34Zx0bLYzgBgJH/eXS0JNxw2JycHQvV0+PAQ0Qi01oomJRA2r1S5isnfnSAnHb2E9jyBTptoHdw3MQ==", - "dev": true, - "requires": { - "@apollographql/graphql-playground-html": "1.6.24", - "@types/accepts": "^1.3.5", - "@types/body-parser": "1.17.1", - "@types/cors": "^2.8.4", - "@types/express": "4.17.1", - "accepts": "^1.3.5", - "apollo-server-core": "^2.9.7", - "apollo-server-types": "^0.2.5", - "body-parser": "^1.18.3", - "cors": "^2.8.4", - "express": "^4.17.1", - "graphql-subscriptions": "^1.0.0", - "graphql-tools": "^4.0.0", - "parseurl": "^1.3.2", - "subscriptions-transport-ws": "^0.9.16", - "type-is": "^1.6.16" - } - }, - "apollo-server-plugin-base": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.5.tgz", - "integrity": "sha512-z2ve7HEPWmZI3EzL0iiY9qyt1i0hitT+afN5PzssCw594LB6DfUQWsI14UW+W+gcw8hvl8VQUpXByfUntAx5vw==", - "dev": true, - "requires": { - "apollo-server-types": "^0.2.5" - } - }, - "apollo-server-types": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.5.tgz", - "integrity": "sha512-6iJQsPh59FWu4K7ABrVmpnQVgeK8Ockx8BcawBh+saFYWTlVczwcLyGSZPeV1tPSKwFwKZutyEslrYSafcarXQ==", - "dev": true, - "requires": { - "apollo-engine-reporting-protobuf": "^0.4.1", - "apollo-server-caching": "^0.5.0", - "apollo-server-env": "^2.4.3" - } - }, - "apollo-tracing": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.8.5.tgz", - "integrity": "sha512-lZn10/GRBZUlMxVYLghLMFsGcLN0jTYDd98qZfBtxw+wEWUx+PKkZdljDT+XNoOm/kDvEutFGmi5tSLhArIzWQ==", - "dev": true, - "requires": { - "apollo-server-env": "^2.4.3", - "graphql-extensions": "^0.10.4" - } - }, "apollo-utilities": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.2.tgz", @@ -4613,37 +4438,6 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "aws-sdk": { - "version": "2.556.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.556.0.tgz", - "integrity": "sha512-qILMUNl/a7FYWU67Y24OGsXFhyDHM4qYdplMR2tps/g17pN9bEQ5ijxvGzW2T8VVyAsTanmn+dFyl/CH38pC5Q==", - "dev": true, - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -4803,6 +4597,15 @@ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, + "backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", + "dev": true, + "requires": { + "precond": "0.2" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -4875,26 +4678,6 @@ "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=", "dev": true }, - "bcrypt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.6.tgz", - "integrity": "sha512-taA5bCTfXe7FUjKroKky9EXpdhkVvhE5owfxfLYodbrAR1Ul3juLmIQmIQBK4L9a5BuUcE6cqmwT+Da20lF9tg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.13.2", - "node-pre-gyp": "0.12.0" - }, - "dependencies": { - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "dev": true, - "optional": true - } - } - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -5202,6 +4985,18 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", + "dev": true, + "requires": { + "dtrace-provider": "~0.8", + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "busboy": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", @@ -6488,6 +6283,16 @@ "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", "dev": true }, + "dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.14.0" + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -7068,12 +6873,6 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -8579,6 +8378,7 @@ "integrity": "sha512-+r8qY2JRRs+uaZcrZOxpNhdlCZoS8yS5KQ6X53Twc8WecZ6VtAn+MVHroLOd4u9HVPxTXZ9RUd9+556EpTc0xA==", "requires": { "codemirror": "^5.26.0", + "codemirror-graphql": "^0.6.11", "markdown-it": "^8.4.0" } }, @@ -8602,17 +8402,6 @@ "minimatch": "^3.0.4" } }, - "graphql-extensions": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.4.tgz", - "integrity": "sha512-lE6MroluEYocbR/ICwccv39w+Pz4cBPadJ11z1rJkbZv5wstISEganbDOwl9qN21rcZGiWzh7QUNxUiFUXXEDw==", - "dev": true, - "requires": { - "@apollographql/apollo-tools": "^0.4.0", - "apollo-server-env": "^2.4.3", - "apollo-server-types": "^0.2.5" - } - }, "graphql-import": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/graphql-import/-/graphql-import-0.4.5.tgz", @@ -8839,6 +8628,15 @@ } } }, + "graphql-relay": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.6.0.tgz", + "integrity": "sha512-OVDi6C9/qOT542Q3KxZdXja3NrDvqzbihn1B44PH8P/c5s0Q90RyQwT6guhGqXqbYEH6zbeLJWjQqiYvcg2vVw==", + "dev": true, + "requires": { + "prettier": "^1.16.0" + } + }, "graphql-request": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", @@ -8875,39 +8673,6 @@ "uuid": "^3.1.0" } }, - "graphql-upload": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz", - "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==", - "dev": true, - "requires": { - "busboy": "^0.3.1", - "fs-capacitor": "^2.0.4", - "http-errors": "^1.7.3", - "object-path": "^0.11.4" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -9812,7 +9577,16 @@ "@babel/template": "^7.4.0", "@babel/traverse": "^7.4.3", "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5" + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-report": { @@ -10231,7 +10005,16 @@ "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "jest-util": { @@ -10604,6 +10387,49 @@ "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, + "ldap-filter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", + "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", + "dev": true, + "requires": { + "assert-plus": "0.1.5" + }, + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "dev": true + } + } + }, + "ldapjs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", + "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "bunyan": "^1.8.3", + "dashdash": "^1.14.0", + "dtrace-provider": "~0.8", + "ldap-filter": "0.2.2", + "once": "^1.4.0", + "vasync": "^1.6.4", + "verror": "^1.8.1" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + } + } + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -11024,6 +10850,13 @@ "readable-stream": "^2.0.1" } }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "dev": true, + "optional": true + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", @@ -11347,29 +11180,10 @@ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", "dev": true }, - "mongodb": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.2.tgz", - "integrity": "sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg==", - "dev": true, - "requires": { - "bson": "^1.1.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { "aproba": "^1.1.1", @@ -11391,6 +11205,44 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "dev": true, + "optional": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -11422,6 +11274,13 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true, + "optional": true + }, "needle": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", @@ -11643,64 +11502,6 @@ } } }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } - } - }, "node-releases": { "version": "1.1.47", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", @@ -11718,15 +11519,6 @@ } } }, - "node-rsa": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.0.6.tgz", - "integrity": "sha512-v42495lozKpuQmrcIzld9ds/Tn7pwjuh0BHSHnhPrKkAVSyTAyrZodFLFafOfWiUKamLt4lgWdngP8W/LzCm2w==", - "dev": true, - "requires": { - "asn1": "^0.2.4" - } - }, "node-sass": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", @@ -12401,7 +12193,15 @@ "requires": { "got": "^9.6.0", "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0" + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "packet-reader": { @@ -12448,6 +12248,14 @@ "xmlhttprequest": "1.8.0" }, "dependencies": { + "@babel/runtime": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", + "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, "ws": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", @@ -12492,44 +12300,411 @@ "requires": { "@apollographql/graphql-playground-html": "1.6.24", "@parse/fs-files-adapter": "1.0.1", - "@parse/push-adapter": "3.1.0", - "@parse/s3-files-adapter": "1.3.0", + "@parse/push-adapter": "3.2.0", + "@parse/s3-files-adapter": "1.4.0", "@parse/simple-mailgun-adapter": "1.1.0", - "apollo-server-express": "2.9.7", - "bcrypt": "3.0.6", + "apollo-server-express": "2.9.13", + "bcrypt": "3.0.7", "bcryptjs": "2.4.3", "body-parser": "1.19.0", + "commander": "4.0.1", "cors": "2.8.5", "deepcopy": "2.0.0", "express": "4.17.1", "follow-redirects": "1.9.0", "graphql-list-fields": "2.0.2", + "graphql-relay": "^0.6.0", "graphql-tools": "^4.0.5", - "graphql-upload": "8.1.0", + "graphql-upload": "9.0.0", "intersect": "1.0.1", "jsonwebtoken": "8.5.1", + "ldapjs": "1.0.2", "lodash": "4.17.15", "lru-cache": "5.1.1", "mime": "2.4.4", - "mongodb": "3.3.2", - "node-rsa": "1.0.6", - "pg-promise": "9.3.3", + "mongodb": "3.4.0", + "node-rsa": "1.0.7", + "parse": "2.10.0", + "pg-promise": "10.3.1", "pluralize": "^8.0.0", "redis": "2.8.0", + "semver": "7.1.0", "subscriptions-transport-ws": "0.9.16", "tv4": "1.3.0", "uuid": "3.3.3", "winston": "3.2.1", "winston-daily-rotate-file": "3.10.0", - "ws": "7.2.0" + "ws": "7.2.1" }, "dependencies": { + "@apollographql/apollo-tools": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.3.tgz", + "integrity": "sha512-CtC1bmohB1owdGMT2ZZKacI94LcPAZDN2WvCe+4ZXT5d7xO5PHOAb70EP/LcFbvnS8QI+pkYRSCGFQnUcv9efg==", + "dev": true, + "requires": { + "apollo-env": "^0.6.1" + } + }, + "@babel/runtime": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/runtime-corejs3": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.6.3.tgz", + "integrity": "sha512-933SXHQr7apa95F+3IqkBne8mqOnu1kDh6dnSddC07aW/R51WsOVD7MSczJ6DRpq/L8KLll7TFDxmt30pft44w==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.2" + } + }, + "@parse/push-adapter": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@parse/push-adapter/-/push-adapter-3.2.0.tgz", + "integrity": "sha512-6V7Bnh9+pSRc2U6ONvDPrPN20nRO4YT9eAITiZyVQu2N9WRCE+QoR2wyK7f+iTmyhRbVWP5xeSEoEhOPkS4pWA==", + "dev": true, + "requires": { + "@parse/node-apn": "^3.1.0", + "@parse/node-gcm": "^1.0.0", + "npmlog": "^4.0.2", + "parse": "2.8.0" + }, + "dependencies": { + "parse": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-2.8.0.tgz", + "integrity": "sha512-dd6IOPYST+qDqWG22xyZpBLQJ+vqozzE4/43cc0OcKakELoSEsJS43JPaxmELI5/sVxsYYYAqshuPePPnefu5A==", + "dev": true, + "requires": { + "@babel/runtime": "7.6.3", + "@babel/runtime-corejs3": "7.6.3", + "uuid": "3.3.3", + "ws": "7.1.2", + "xmlhttprequest": "1.8.0" + } + }, + "ws": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", + "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "dev": true, + "requires": { + "async-limiter": "^1.0.0" + } + } + } + }, + "@parse/s3-files-adapter": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@parse/s3-files-adapter/-/s3-files-adapter-1.4.0.tgz", + "integrity": "sha512-qivvhL09Fqozo6B86PgUZjnY3VZQtxbH+6TtHEIg20Ol9THG/JaHGzSxlWNOBsCf7lvpRp0dELgbhMnMK3LWJA==", + "dev": true, + "requires": { + "aws-sdk": "2.59.0", + "parse": "2.10.0" + } + }, + "apollo-cache-control": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.8.11.tgz", + "integrity": "sha512-8yz4qbRBIFDWRHdT8uPh0HHh+VbQXxoFGJQRAG8hyMRvR+EuURXX1ltXYkn5J3YJ3MKEqgsvwGaq60dFZq63UQ==", + "dev": true, + "requires": { + "apollo-server-env": "^2.4.3", + "graphql-extensions": "^0.10.10" + } + }, + "apollo-datasource": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.6.4.tgz", + "integrity": "sha512-u4eu6Q94q6KuZacZfdo4vCevA81F4QWeTYEXUvoksQMJpiacPHHe0DJrofKVKvxngUp5kCi1RnPXSc6kBY+/oA==", + "dev": true, + "requires": { + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3" + } + }, + "apollo-engine-reporting": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.4.14.tgz", + "integrity": "sha512-cCG9qDOPwbh87ZjQGHgmnP3oPqhqjIZcNmm/lNtWkWXGTlxV/jmUEqpVi+wsDbE5gR7d1OFk6GqSy2ZQh+S+Bw==", + "dev": true, + "requires": { + "apollo-engine-reporting-protobuf": "^0.4.4", + "apollo-graphql": "^0.3.7", + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3", + "apollo-server-errors": "^2.3.4", + "apollo-server-types": "^0.2.10", + "async-retry": "^1.2.1", + "graphql-extensions": "^0.10.10" + } + }, + "apollo-engine-reporting-protobuf": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.4.tgz", + "integrity": "sha512-SGrIkUR7Q/VjU8YG98xcvo340C4DaNUhg/TXOtGsMlfiJDzHwVau/Bv6zifAzBafp2lj0XND6Daj5kyT/eSI/w==", + "dev": true, + "requires": { + "@apollo/protobufjs": "^1.0.3" + } + }, + "apollo-env": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.1.tgz", + "integrity": "sha512-B9BgpQGR1ndeDtb4Gtor0J4CITQ+OPACZrVW6lgStnljKEe9ZB76DZ1dAd3OCeizAswW6Lo9uvfK8jhVS5nBhQ==", + "dev": true, + "requires": { + "@types/node-fetch": "2.5.4", + "core-js": "^3.0.1", + "node-fetch": "^2.2.0", + "sha.js": "^2.4.11" + } + }, + "apollo-graphql": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.3.7.tgz", + "integrity": "sha512-ghW16xx9tRcyL38Pw6G5OidMnYn+CNUGZWmvqQgEO2nRy4T0ONPZZBOvGrIMtJQ70oEykNMKGm0zm6PdHdxd8Q==", + "dev": true, + "requires": { + "apollo-env": "^0.6.1", + "lodash.sortby": "^4.7.0" + } + }, + "apollo-server-caching": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz", + "integrity": "sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw==", + "dev": true, + "requires": { + "lru-cache": "^5.0.0" + } + }, + "apollo-server-core": { + "version": "2.9.16", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.9.16.tgz", + "integrity": "sha512-4ftdjSfs/3aEare9QNTVSF0yUvXETxiohuDLZ7gmMIQxNnZhUjVXiZL1rYKuIZ12uH7xLvh/DwkXRt6nLG/lZA==", + "dev": true, + "requires": { + "@apollographql/apollo-tools": "^0.4.3", + "@apollographql/graphql-playground-html": "1.6.24", + "@types/graphql-upload": "^8.0.0", + "@types/ws": "^6.0.0", + "apollo-cache-control": "^0.8.11", + "apollo-datasource": "^0.6.4", + "apollo-engine-reporting": "^1.4.14", + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3", + "apollo-server-errors": "^2.3.4", + "apollo-server-plugin-base": "^0.6.10", + "apollo-server-types": "^0.2.10", + "apollo-tracing": "^0.8.11", + "fast-json-stable-stringify": "^2.0.0", + "graphql-extensions": "^0.10.10", + "graphql-tag": "^2.9.2", + "graphql-tools": "^4.0.0", + "graphql-upload": "^8.0.2", + "sha.js": "^2.4.11", + "subscriptions-transport-ws": "^0.9.11", + "ws": "^6.0.0" + }, + "dependencies": { + "graphql-upload": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz", + "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==", + "dev": true, + "requires": { + "busboy": "^0.3.1", + "fs-capacitor": "^2.0.4", + "http-errors": "^1.7.3", + "object-path": "^0.11.4" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "apollo-server-express": { + "version": "2.9.13", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.9.13.tgz", + "integrity": "sha512-M306e07dpZ8YpZx4VBYa0FWlt+wopj4Bwn0Iy1iJ6VjaRyGx2HCUJvLpHZ+D0TIXtQ2nX3DTYeOouVaDDwJeqQ==", + "dev": true, + "requires": { + "@apollographql/graphql-playground-html": "1.6.24", + "@types/accepts": "^1.3.5", + "@types/body-parser": "1.17.1", + "@types/cors": "^2.8.4", + "@types/express": "4.17.1", + "accepts": "^1.3.5", + "apollo-server-core": "^2.9.13", + "apollo-server-types": "^0.2.8", + "body-parser": "^1.18.3", + "cors": "^2.8.4", + "express": "^4.17.1", + "graphql-subscriptions": "^1.0.0", + "graphql-tools": "^4.0.0", + "parseurl": "^1.3.2", + "subscriptions-transport-ws": "^0.9.16", + "type-is": "^1.6.16" + } + }, + "apollo-server-plugin-base": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.10.tgz", + "integrity": "sha512-/xT7UT/tbCDIoTQ4lcEQsJ0ACh7h7QG0BDmeSlDXjwDuENRI50bQ2QoluCMPitZXGe+FCQfLhvzFgzbsZGT0IA==", + "dev": true, + "requires": { + "apollo-server-types": "^0.2.10" + } + }, + "apollo-server-types": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.2.10.tgz", + "integrity": "sha512-ke9ViPEWfW+2XLe66CaKGVZdS7duSLbamSKSprmmeMBd8s6tmjf0FumUVxV7X4quxPZi0OPo8x0LoLU7GWsmaA==", + "dev": true, + "requires": { + "apollo-engine-reporting-protobuf": "^0.4.4", + "apollo-server-caching": "^0.5.1", + "apollo-server-env": "^2.4.3" + } + }, + "apollo-tracing": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.8.11.tgz", + "integrity": "sha512-Z0wDZ5QOBmpGoajB74ZKGTM7GzG6rqZRzAph4kxud6axcyNqUDKiKZ3Eere+NSLwvvt8M3qnPW4UJSUy/wwOXg==", + "dev": true, + "requires": { + "apollo-server-env": "^2.4.3", + "graphql-extensions": "^0.10.10" + } + }, + "aws-sdk": { + "version": "2.59.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.59.0.tgz", + "integrity": "sha1-8kG2SrqIyI4jW4Wz8cHnFUgzGyc=", + "dev": true, + "requires": { + "buffer": "5.0.6", + "crypto-browserify": "1.0.9", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.0.1", + "xml2js": "0.4.17", + "xmlbuilder": "4.2.1" + }, + "dependencies": { + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true + } + } + }, + "bcrypt": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.7.tgz", + "integrity": "sha512-K5UglF9VQvBMHl/1elNyyFvAfOY9Bj+rpKrCSR9sFwcW8FywAYJSRwTURNej5TaAK2TEJkcJ6r6lh1YPmspx5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.14.0", + "node-pre-gyp": "0.13.0" + } + }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=", "dev": true }, + "buffer": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.6.tgz", + "integrity": "sha1-LqZp9+7Atu2gWwj4tf9mGyhXNYg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "crypto-browserify": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-1.0.9.tgz", + "integrity": "sha1-zFRJaF37hesRyYKKzHy4erW7/MA=", + "dev": true + }, + "graphql-extensions": { + "version": "0.10.10", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.10.10.tgz", + "integrity": "sha512-pNb1DmUk6vsGtCjCRecpKoXadKNMyKxyLyE9IX65N9aKSmLL+AF7dJOOc4MWhdaAXlzxaDDhe54GpaOfoH7AOw==", + "dev": true, + "requires": { + "@apollographql/apollo-tools": "^0.4.3", + "apollo-server-env": "^2.4.3", + "apollo-server-types": "^0.2.10" + } + }, + "graphql-upload": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-9.0.0.tgz", + "integrity": "sha512-YR2o9GoDa5On3q3lYLkLo3gHfa8crCHvMY1QbT7Zqja6BUqiihqaGjbWbvSPko/gbDSmZE+zLcX46Ef+/SmRyA==", + "dev": true, + "requires": { + "busboy": "^0.3.1", + "fs-capacitor": "^4.0.1", + "http-errors": "^1.7.3", + "object-path": "^0.11.4" + }, + "dependencies": { + "fs-capacitor": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-4.0.1.tgz", + "integrity": "sha512-e0qFoKQMFe52F54dMvZLD+I1M/Gs6xB2gnZVQB5FYT/8ioP6qTb3U/tzp55O0IuPOMvSM8j4ta0bVafIFjJzxQ==", + "dev": true, + "requires": { + "@types/readable-stream": "^2.3.5", + "readable-stream": "^3.4.0" + } + } + } + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12545,13 +12720,208 @@ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, + "mongodb": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.0.tgz", + "integrity": "sha512-W90jm/n8F0Edm47ljkVRK9l8qGW9g8T9ZSiZWRiUP58wLhsCJCeN/JxdpVnH0CUwwAw2hITUcCo9x58udpX2Uw==", + "dev": true, + "requires": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, + "node-pre-gyp": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", + "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + } + } + }, + "node-rsa": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.0.7.tgz", + "integrity": "sha512-idwRXma6scFufZmbaKkHpJoLL93yynRefP6yur13wZ5i9FR35ex451KCoF2OORDeJanyRVahmjjiwmUlCnTqJA==", + "dev": true, + "requires": { + "asn1": "^0.2.4" + } + }, + "parse": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/parse/-/parse-2.10.0.tgz", + "integrity": "sha512-TBJCvQPachrcGGLbN8llN8tOr01VsKB6pxi3OWq3/C0bIHHdb2Bd+cgH4v5ZlRCrZt3MHVasGH4rvx7Klkp7Wg==", + "dev": true, + "requires": { + "@babel/runtime": "7.7.4", + "@babel/runtime-corejs3": "7.7.4", + "uuid": "3.3.3", + "ws": "7.2.0", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", + "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/runtime-corejs3": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.4.tgz", + "integrity": "sha512-BBIEhzk8McXDcB3IbOi8zQPzzINUp4zcLesVlBSOcyGhzPUU8Xezk5GAG7Sy5GVhGmAO0zGd2qRSeY2g4Obqxw==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.2" + } + }, + "ws": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", + "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", + "dev": true, + "requires": { + "async-limiter": "^1.0.0" + } + } + } + }, + "pg": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.14.0.tgz", + "integrity": "sha512-TLsdOWKFu44vHdejml4Uoo8h0EwCjdIj9Z9kpz7pA5i8iQxOTwVb1+Fy+X86kW5AXKxQpYpYDs4j/qPDbro/lg==", + "dev": true, + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "0.1.3", + "pg-pool": "^2.0.7", + "pg-types": "^2.1.0", + "pgpass": "1.x", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=", + "dev": true + } + } + }, + "pg-promise": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-10.3.1.tgz", + "integrity": "sha512-1b9Nx1UMV0SE5zJC92ckM+DHFGB5koly/AILd5DpV0Zx4Z9/iytnbdUGz9qnnqKt+XIuXjdizT2FIyGyV2AxTQ==", + "dev": true, + "requires": { + "assert-options": "0.6.0", + "manakin": "0.5.2", + "pg": "7.14.0", + "pg-minify": "1.5.1", + "spex": "3.0.0" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true + }, + "semver": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.0.tgz", + "integrity": "sha512-4P8Vc43MxQL6UKqSiEnf0jZNYx545R9W1HwXP6p65paPp86AUJiafZ8XG81hAbcldKMCUIbeykUTVYG19LB7Cw==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, "ws": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", - "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", + "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==", + "dev": true + }, + "xml2js": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", + "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", "dev": true, "requires": { - "async-limiter": "^1.0.0" + "sax": ">=0.6.0", + "xmlbuilder": "^4.1.0" + } + }, + "xmlbuilder": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", + "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "dev": true, + "requires": { + "lodash": "^4.0.0" } }, "yallist": { @@ -12698,29 +13068,6 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "pg": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.12.1.tgz", - "integrity": "sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA==", - "dev": true, - "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "0.1.3", - "pg-pool": "^2.0.4", - "pg-types": "^2.1.0", - "pgpass": "1.x", - "semver": "4.3.2" - }, - "dependencies": { - "semver": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", - "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=", - "dev": true - } - } - }, "pg-connection-string": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", @@ -12745,19 +13092,6 @@ "integrity": "sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw==", "dev": true }, - "pg-promise": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-9.3.3.tgz", - "integrity": "sha512-C7Mj5RSUvK0cGOaJ0p1fcOk5jhS1n+HgY+DoE8s1+Zjzf6ta70zYDIlOmy6MtYWs4DFHhUW654hb0FmtGKkIkg==", - "dev": true, - "requires": { - "assert-options": "0.6.0", - "manakin": "0.5.2", - "pg": "7.12.1", - "pg-minify": "1.5.1", - "spex": "3.0.0" - } - }, "pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", @@ -12984,6 +13318,12 @@ "xtend": "^4.0.0" } }, + "precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -13132,35 +13472,6 @@ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" }, - "protobufjs": { - "version": "6.8.8", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", - "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "10.17.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.0.tgz", - "integrity": "sha512-wuJwN2KV4tIRz1bu9vq5kSPasJ8IsEjZaP1ZR7KlmdUZvGF/rXy8DmXOVwUD0kAtvtJ7aqMKPqUXC0NUTDbrDg==", - "dev": true - } - } - }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -14277,6 +14588,13 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "dev": true, + "optional": true + }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -14316,6 +14634,16 @@ } } }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "dev": true, + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sass-graph": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", @@ -14543,7 +14871,16 @@ "clone-deep": "^4.0.1", "loader-utils": "^1.2.3", "neo-async": "^2.6.1", - "schema-utils": "^2.1.0" + "schema-utils": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "sax": { @@ -14985,6 +15322,16 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "dev": true, + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -16096,6 +16443,32 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vasync": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", + "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", + "dev": true, + "requires": { + "verror": "1.6.0" + }, + "dependencies": { + "extsprintf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", + "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=", + "dev": true + }, + "verror": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", + "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", + "dev": true, + "requires": { + "extsprintf": "1.2.0" + } + } + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -16552,9 +16925,18 @@ "requires": { "file-stream-rotator": "^0.4.1", "object-hash": "^1.3.0", + "semver": "^6.2.0", "triple-beam": "^1.3.0", "winston-compat": "^0.1.4", "winston-transport": "^4.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "winston-transport": { diff --git a/src/components/BrowserCell/BrowserCell.react.js b/src/components/BrowserCell/BrowserCell.react.js index b2045d6d4a..3f43e440a2 100644 --- a/src/components/BrowserCell/BrowserCell.react.js +++ b/src/components/BrowserCell/BrowserCell.react.js @@ -24,10 +24,12 @@ export default class BrowserCell extends Component { componentDidUpdate() { if (this.props.current) { const node = this.cellRef.current; + const { setRelation } = this.props; const { left, right, bottom, top } = node.getBoundingClientRect(); // Takes into consideration Sidebar width when over 980px wide. - const leftBoundary = window.innerWidth > 980 ? 300 : 0; + // If setRelation is undefined, DataBrowser is used as ObjectPicker, so it does not have a sidebar. + const leftBoundary = window.innerWidth > 980 && setRelation ? 300 : 0; // BrowserToolbar + DataBrowserHeader height const topBoundary = 126; @@ -63,7 +65,7 @@ export default class BrowserCell extends Component { } render() { - let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, onPointerClick, row, col } = this.props; + let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, onPointerClick, row, col, name, onEditSelectedRow } = this.props; let content = value; this.copyableValue = content; let classes = [styles.cell, unselectable]; @@ -89,10 +91,12 @@ export default class BrowserCell extends Component { object.id = value.objectId; value = object; } - content = ( + content = onPointerClick ? ( + ) : ( + value.id ); this.copyableValue = value.id; } else if (type === 'Date') { @@ -136,10 +140,12 @@ export default class BrowserCell extends Component { } else if (type === 'Polygon') { this.copyableValue = content = value.coordinates.map(coord => `(${coord})`) } else if (type === 'Relation') { - content = ( + content = setRelation ? (
        setRelation(value)} value='View relation' />
        + ) : ( + 'Relation' ); this.copyableValue = undefined; } @@ -157,7 +163,10 @@ export default class BrowserCell extends Component { setCopyableValue(hidden ? undefined : this.copyableValue); }} onDoubleClick={() => { - if (type !== 'Relation') { + // Since objectId can't be edited, double click event opens edit row dialog + if (name === 'objectId' && onEditSelectedRow) { + onEditSelectedRow(true, value); + } else if (type !== 'Relation') { onEditChange(true) } }} diff --git a/src/components/BrowserFilter/BrowserFilter.react.js b/src/components/BrowserFilter/BrowserFilter.react.js index 9d821b6fca..89c7c587a8 100644 --- a/src/components/BrowserFilter/BrowserFilter.react.js +++ b/src/components/BrowserFilter/BrowserFilter.react.js @@ -18,14 +18,16 @@ import styles from 'components/BrowserFilter/BrowserFilter.scss'; import { List, Map } from 'immutable'; const BLACKLISTED_FILTERS = [ 'containsAny', 'doesNotContainAny' ]; +const POPOVER_CONTENT_ID = 'browserFilterPopover'; export default class BrowserFilter extends React.Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { open: false, filters: new List(), + blacklistedFilters: BLACKLISTED_FILTERS.concat(props.blacklistedFilters) }; this.toggle = this.toggle.bind(this) } @@ -43,7 +45,7 @@ export default class BrowserFilter extends React.Component { toggle() { let filters = this.props.filters; if (this.props.filters.size === 0) { - let available = Filters.availableFilters(this.props.schema, null, BLACKLISTED_FILTERS); + let available = Filters.availableFilters(this.props.schema, null, this.state.blacklistedFilters); let field = Object.keys(available)[0]; filters = new List([new Map({ field: field, constraint: available[field][0] })]); } @@ -55,7 +57,7 @@ export default class BrowserFilter extends React.Component { } addRow() { - let available = Filters.availableFilters(this.props.schema, this.state.filters, BLACKLISTED_FILTERS); + let available = Filters.availableFilters(this.props.schema, this.state.filters, this.state.blacklistedFilters); let field = Object.keys(available)[0]; this.setState(({ filters }) => ({ filters: filters.push(new Map({ field: field, constraint: available[field][0] })), @@ -92,12 +94,12 @@ export default class BrowserFilter extends React.Component { } let available = Filters.availableFilters(this.props.schema, this.state.filters); popover = ( - -
        this.props.setCurrent(null)}> + +
        this.props.setCurrent(null)} id={POPOVER_CONTENT_ID}>
        this.setState({ filters: filters })} diff --git a/src/components/BrowserFilter/BrowserFilter.scss b/src/components/BrowserFilter/BrowserFilter.scss index afe7f2f3af..be017aa56a 100644 --- a/src/components/BrowserFilter/BrowserFilter.scss +++ b/src/components/BrowserFilter/BrowserFilter.scss @@ -68,6 +68,12 @@ } } +.objectPickerContent { + .entry svg { + fill: rgba(0, 0, 0, 0.3); + } +} + .body { position: absolute; top: 30px; diff --git a/src/components/BrowserRow/BrowserRow.react.js b/src/components/BrowserRow/BrowserRow.react.js index 11aff817ed..b7774a3696 100644 --- a/src/components/BrowserRow/BrowserRow.react.js +++ b/src/components/BrowserRow/BrowserRow.react.js @@ -19,7 +19,7 @@ export default class BrowserRow extends Component { } render() { - const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation } = this.props; + const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation, onEditSelectedRow } = this.props; let attributes = obj.attributes; return (
        @@ -61,6 +61,7 @@ export default class BrowserRow extends Component { return (
        diff --git a/src/components/ChromeDropdown/ChromeDropdown.react.js b/src/components/ChromeDropdown/ChromeDropdown.react.js index dac17a3409..6f2c38ff68 100644 --- a/src/components/ChromeDropdown/ChromeDropdown.react.js +++ b/src/components/ChromeDropdown/ChromeDropdown.react.js @@ -77,7 +77,7 @@ export default class ChromeDropdown extends React.Component { widthStyle = { width: measuredWidth }; content = ( this.setState({ open: false })}> -
        +
        {this.props.options.map((o) => { let key = o; let value = o; diff --git a/src/components/ColumnsConfiguration/ColumnsConfiguration.react.js b/src/components/ColumnsConfiguration/ColumnsConfiguration.react.js index b56f1466b8..b4e6df4280 100644 --- a/src/components/ColumnsConfiguration/ColumnsConfiguration.react.js +++ b/src/components/ColumnsConfiguration/ColumnsConfiguration.react.js @@ -10,6 +10,8 @@ import Icon from 'components/Icon/Icon.react'; import Popover from 'components/Popover/Popover.react'; import Position from 'lib/Position'; +const POPOVER_CONTENT_ID = 'columnsConfigurationPopover'; + export default class ColumnsConfiguration extends React.Component { constructor() { super(); @@ -57,8 +59,8 @@ export default class ColumnsConfiguration extends React.Component { let popover = null; if (this.state.open) { popover = ( - -
        + +
        {title}
        diff --git a/src/components/ColumnsConfiguration/ColumnsConfiguration.scss b/src/components/ColumnsConfiguration/ColumnsConfiguration.scss index 046621f7cf..5efb6b55e8 100644 --- a/src/components/ColumnsConfiguration/ColumnsConfiguration.scss +++ b/src/components/ColumnsConfiguration/ColumnsConfiguration.scss @@ -42,6 +42,12 @@ } } +.objectPickerContent { + .entry svg { + fill: rgba(0, 0, 0, 0.3); + } +} + .body { color: white; position: absolute; diff --git a/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.react.js b/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.react.js index ed0b411696..a773e13cf4 100644 --- a/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.react.js +++ b/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.react.js @@ -60,25 +60,27 @@ export default class DataBrowserHeaderBar extends React.Component { ); }); - let finalStyle = {}; - if (headers.length % 2) { - finalStyle.background = 'rgba(224,224,234,0.10)'; + if (onAddColumn) { + let finalStyle = {}; + if (headers.length % 2) { + finalStyle.background = 'rgba(224,224,234,0.10)'; + } + + elements.push( + readonly || preventSchemaEdits ? null : ( + + ) + ); } - elements.push( - readonly || preventSchemaEdits ? null : ( - - ) - ); - return (
        {elements}
        diff --git a/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss b/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss index 2f21ff4c88..eb38c70c29 100644 --- a/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss +++ b/src/components/DataBrowserHeaderBar/DataBrowserHeaderBar.scss @@ -64,3 +64,11 @@ margin: 0 -4px; cursor: ew-resize; } + +.pickerPointer { + .check { + input { + display: none; + } + } +} diff --git a/src/components/FileEditor/FileEditor.react.js b/src/components/FileEditor/FileEditor.react.js index a3c06cafe9..dbd839ceb6 100644 --- a/src/components/FileEditor/FileEditor.react.js +++ b/src/components/FileEditor/FileEditor.react.js @@ -20,6 +20,7 @@ export default class FileEditor extends React.Component { this.checkExternalClick = this.checkExternalClick.bind(this); this.handleKey = this.handleKey.bind(this); + this.removeFile = this.removeFile.bind(this); } componentDidMount() { @@ -33,18 +34,20 @@ export default class FileEditor extends React.Component { } checkExternalClick(e) { - if (!hasAncestor(e.target, this.refs.input)) { - this.props.onCommit(this.state.value); + const { onCancel } = this.props; + if (!hasAncestor(e.target, this.refs.input) && onCancel) { + onCancel(); } } handleKey(e) { - if (e.keyCode === 13) { - this.props.onCommit(this.state.value); + const { onCancel } = this.props; + if (e.keyCode === 13 && onCancel) { + onCancel(); } } - getBase64(file){ + getBase64(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); @@ -53,6 +56,11 @@ export default class FileEditor extends React.Component { }); } + removeFile() { + this.refs.fileInput.value = ''; + this.props.onCommit(undefined); + } + async handleChange(e) { let file = e.target.files[0]; if (file) { @@ -67,10 +75,10 @@ export default class FileEditor extends React.Component {
        {file && file.url() ? Download : null} - + {file ? 'Replace file' : 'Upload file'} - {file ? this.props.onCommit(undefined)}>Delete : null} + {file ? Delete : null}
        ); } diff --git a/src/components/FileEditor/FileEditor.scss b/src/components/FileEditor/FileEditor.scss index 9f4245999d..5a2faf2c3b 100644 --- a/src/components/FileEditor/FileEditor.scss +++ b/src/components/FileEditor/FileEditor.scss @@ -41,8 +41,8 @@ opacity: 0; top: 0; right: 0; - left: -100px; bottom: 0; cursor: pointer; + width: 100%; } } diff --git a/src/components/GeoPointEditor/GeoPointEditor.react.js b/src/components/GeoPointEditor/GeoPointEditor.react.js index e151cff00d..15d57f0a22 100644 --- a/src/components/GeoPointEditor/GeoPointEditor.react.js +++ b/src/components/GeoPointEditor/GeoPointEditor.react.js @@ -6,7 +6,6 @@ * the root directory of this source tree. */ import { GeoPoint } from 'parse'; -import hasAncestor from 'lib/hasAncestor'; import React from 'react'; import styles from 'components/GeoPointEditor/GeoPointEditor.scss'; import validateNumeric from 'lib/validateNumeric'; @@ -26,23 +25,31 @@ export default class GeoPointEditor extends React.Component { } componentDidMount() { - this.refs.latitude.focus(); + if (!this.props.disableAutoFocus) { + this.refs.latitude.focus(); + } this.refs.latitude.setSelectionRange(0, String(this.state.latitude).length); - document.body.addEventListener('click', this.checkExternalClick); this.refs.latitude.addEventListener('keypress', this.handleKeyLatitude); this.refs.longitude.addEventListener('keypress', this.handleKeyLongitude); } componentWillUnmount() { - document.body.removeEventListener('click', this.checkExternalClick); this.refs.latitude.removeEventListener('keypress', this.handleKeyLatitude); this.refs.longitude.removeEventListener('keypress', this.handleKeyLongitude); } - checkExternalClick(e) { - if (!hasAncestor(e.target, this.refs.input)) { - this.commitValue(); - } + checkExternalClick() { + // timeout needed because activeElement is set after onBlur event is done + setTimeout(function() { + // check if activeElement is something else from input fields, + // to avoid commiting new value on every switch of focus beetween latitude and longitude fields + if ( + document.activeElement !== this.refs.latitude && + document.activeElement !== this.refs.longitude + ) { + this.commitValue(); + } + }.bind(this), 1); } handleKeyLatitude(e) { @@ -112,14 +119,16 @@ export default class GeoPointEditor extends React.Component { this.setState({ [target]: validateNumeric(value) ? value : this.state[target] }); }; return ( -
        +
        ); diff --git a/src/components/Popover/Popover.react.js b/src/components/Popover/Popover.react.js index 243aef3d1c..5b546e98f0 100644 --- a/src/components/Popover/Popover.react.js +++ b/src/components/Popover/Popover.react.js @@ -12,7 +12,7 @@ import ReactDOM from 'react-dom'; import styles from 'components/Popover/Popover.scss'; // We use this component to proxy the current tree's context (just the React Router history for now) to the new tree -class ContextProxy extends React.Component { +export class ContextProxy extends React.Component { getChildContext() { return this.props.cx; } @@ -24,7 +24,8 @@ class ContextProxy extends React.Component { ContextProxy.childContextTypes = { history: PropTypes.object, - router: PropTypes.object + router: PropTypes.object, + currentApp: PropTypes.object }; export default class Popover extends React.Component { @@ -33,8 +34,8 @@ export default class Popover extends React.Component { this._checkExternalClick = this._checkExternalClick.bind(this); } componentWillMount() { - let wrapperStyle = this.props.fixed ? - styles.fixed_wrapper : + let wrapperStyle = this.props.fixed ? + styles.fixed_wrapper : styles.popover_wrapper; this._popoverWrapper = document.getElementById(wrapperStyle); if (!this._popoverWrapper) { @@ -83,8 +84,16 @@ export default class Popover extends React.Component { } _checkExternalClick(e) { - if (!hasAncestor(e.target, this._popoverWrapper) && - this.props.onExternalClick) { + const { contentId } = this.props; + const popoverWrapper = contentId + ? document.getElementById(contentId) + : this._popoverWrapper; + const isChromeDropdown = e.target.parentNode.classList.contains("chromeDropdown"); + if ( + !hasAncestor(e.target, popoverWrapper) && + this.props.onExternalClick && + !isChromeDropdown + ) { this.props.onExternalClick(e); } } diff --git a/src/components/TextInput/TextInput.react.js b/src/components/TextInput/TextInput.react.js index 124976410e..702bd5d66f 100644 --- a/src/components/TextInput/TextInput.react.js +++ b/src/components/TextInput/TextInput.react.js @@ -10,8 +10,30 @@ import React from 'react'; import styles from 'components/TextInput/TextInput.scss'; export default class TextInput extends React.Component { + componentWillReceiveProps(props) { + if (props.multiline !== this.props.multiline) { + const previousInput = this.refs.input; + // wait a little while for component to re-render + setTimeout(function() { + const newInput = previousInput ? this.refs.textarea : this.refs.input; + newInput.focus(); + newInput.value = ""; + newInput.value = props.value; + }.bind(this), 1); + } + } + changeValue(e) { - this.props.onChange(e.nativeEvent.target.value); + const { onChange } = this.props; + if (onChange) { + onChange(e.nativeEvent.target.value); + } + } + updateValue(e) { + const { onBlur } = this.props; + if (onBlur) { + onBlur(e.nativeEvent.target.value); + } } render() { @@ -22,16 +44,21 @@ export default class TextInput extends React.Component { if (this.props.multiline) { return (