From 4707c46133c56030380398a677bd03c661460124 Mon Sep 17 00:00:00 2001 From: Chris Whong Date: Tue, 9 Jul 2019 17:42:13 -0400 Subject: [PATCH] feat(layout): add dataset view with draggable sidebar, datasets picker, etc --- .eslintrc | 19 + LICENSE | 22 + README.md | 2 +- app/actions/counter.ts | 24 + app/actions/helpers.ts | 36 ++ app/app.global.scss | 2 +- app/components/App.tsx | 15 +- app/components/DatasetSidebar.tsx | 55 ++ app/components/Resizable.tsx | 148 +++++ app/containers/AppContainer.tsx | 6 +- app/containers/DatasetContainer.tsx | 79 +++ app/index.tsx | 6 +- app/main.development.js | 487 +++++++-------- app/reducers/counter.ts | 14 + app/reducers/index.ts | 14 +- app/routes.tsx | 24 +- app/scss/_dataset-container.scss | 184 ++++++ app/scss/style.scss | 8 +- app/store/configureStore.development.ts | 55 +- app/store/configureStore.production.ts | 2 +- app/store/configureStore.ts | 6 +- package.json | 10 + .../__snapshots__/counter.spec.ts.snap | 13 + test/actions/counter.spec.ts | 41 ++ test/components/Counter.spec.tsx | 57 ++ test/containers/CounterPage.spec.tsx | 60 ++ test/reducers/counter.spec.ts | 22 + webpack.config.development.js | 12 +- yarn.lock | 579 +++++++++++++++++- 29 files changed, 1666 insertions(+), 336 deletions(-) create mode 100644 .eslintrc create mode 100644 LICENSE create mode 100644 app/actions/counter.ts create mode 100644 app/actions/helpers.ts create mode 100644 app/components/DatasetSidebar.tsx create mode 100644 app/components/Resizable.tsx create mode 100644 app/containers/DatasetContainer.tsx create mode 100644 app/reducers/counter.ts create mode 100644 app/scss/_dataset-container.scss create mode 100644 test/actions/__snapshots__/counter.spec.ts.snap create mode 100644 test/actions/counter.spec.ts create mode 100644 test/components/Counter.spec.tsx create mode 100644 test/containers/CounterPage.spec.tsx create mode 100644 test/reducers/counter.spec.ts diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..27c7e99b --- /dev/null +++ b/.eslintrc @@ -0,0 +1,19 @@ +{ + "extends": [ + "standard-with-typescript", + "plugin:react/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + }, + "project": "./tsconfig.json" + }, + "rules": { + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-member-accessibility": "off", + "react/prop-types": "off" + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8792bc4e --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015-present C. T. Lin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md index 6b789449..36591313 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ Welcome to the qri desktop repository -The Qri Desktop app helps you manage your datasets. \ No newline at end of file +The Qri Desktop app helps you manage your datasets. diff --git a/app/actions/counter.ts b/app/actions/counter.ts new file mode 100644 index 00000000..7652b458 --- /dev/null +++ b/app/actions/counter.ts @@ -0,0 +1,24 @@ +import { actionCreatorVoid } from './helpers' + +export const increment = actionCreatorVoid('INCREMENT_COUNTER') +export const decrement = actionCreatorVoid('DECREMENT_COUNTER') + +export function incrementIfOdd () { + return (dispatch: Function, getState: Function) => { + const { counter } = getState() + + if (counter % 2 === 0) { + return + } + + dispatch(increment()) + } +} + +export function incrementAsync (delay: number = 1000) { + return (dispatch: Function) => { + setTimeout(() => { + dispatch(increment()) + }, delay) + } +} diff --git a/app/actions/helpers.ts b/app/actions/helpers.ts new file mode 100644 index 00000000..bff71433 --- /dev/null +++ b/app/actions/helpers.ts @@ -0,0 +1,36 @@ +import { Action } from 'redux' + +export interface IAction extends Action {} // eslint-disable-line +export interface IActionWithPayload extends Action { + readonly payload: T +} + +interface IActionCreator { + readonly type: string + (payload: T): IActionWithPayload + + test(action: IAction): action is IActionWithPayload +} + +interface IActionCreatorVoid { + readonly type: string + (): IAction + + test(action: IAction): action is IAction +} + +export const actionCreator = (type: string): IActionCreator => + Object.assign((payload: T): any => ({ type, payload }), { // eslint-disable-line + type, + test (action: IAction): action is IActionWithPayload { + return action.type === type + } + }) + +export const actionCreatorVoid = (type: string): IActionCreatorVoid => + Object.assign((): any => ({ type }), { // eslint-disable-line + type, + test (action: IAction): action is IAction { + return action.type === type + } + }) diff --git a/app/app.global.scss b/app/app.global.scss index 4d978d1f..5d7ecc16 100644 --- a/app/app.global.scss +++ b/app/app.global.scss @@ -1 +1 @@ -@import "scss/style" \ No newline at end of file +@import "scss/style" diff --git a/app/components/App.tsx b/app/components/App.tsx index 196e4aa5..2081f702 100644 --- a/app/components/App.tsx +++ b/app/components/App.tsx @@ -1,11 +1,14 @@ import * as React from 'react' +import DatasetContainer from '../containers/DatasetContainer' // App is the main component and currently the only view // Everything must flow through here export default class App extends React.Component { - render() { - return ( -
Hello World
- ) - } -} \ No newline at end of file + render () { + return ( +
+ +
+ ) + } +} diff --git a/app/components/DatasetSidebar.tsx b/app/components/DatasetSidebar.tsx new file mode 100644 index 00000000..b83cce0b --- /dev/null +++ b/app/components/DatasetSidebar.tsx @@ -0,0 +1,55 @@ +import * as React from 'react' + +interface FileRowProps { + name: string +} + +const FileRow: React.SFC = (props) => { + return ( +
+
{props.name}
+
+ ) +} + +export default class DatasetSidebar extends React.Component<{}, { activeTab: string }> { + constructor (p: {}) { + super(p) + this.state = { + activeTab: 'status' + } + } + + handleTabClick (activeTab: string) { + this.setState({ activeTab }) + } + + render () { + const { activeTab } = this.state + return ( +
+
+
this.handleTabClick('status')}>Status
+
this.handleTabClick('history')}>History
+
+
+ + +
+
+ ) + } +} diff --git a/app/components/Resizable.tsx b/app/components/Resizable.tsx new file mode 100644 index 00000000..65c67505 --- /dev/null +++ b/app/components/Resizable.tsx @@ -0,0 +1,148 @@ +import * as React from 'react' + +/** + * Component abstracting a resizable panel. + * Borrowed from https://github.com/desktop/desktop/blob/development/app/src/ui/resizable/resizable.tsx + * + * Note: this component is pure, consumers must subscribe to the + * onResize and onReset event and update the width prop accordingly. + */ +export class Resizable extends React.Component { + public static defaultProps: IResizableProps = { + width: 250, + maximumWidth: 350, + minimumWidth: 200 + } + + private startWidth: number | null = null + private startX: number | null = null + + /** + * Returns the current width as determined by props. + * + * This value will be constrained by the maximum and minimum + * with props and might not be identical to that of props.width. + */ + private getCurrentWidth () { + return this.clampWidth(this.props.width) + } + + /** + * Constrains the provided width to lie within the minimum and + * maximum widths as determined by props + */ + private clampWidth (width: number) { + return Math.max( + this.props.minimumWidth!, // eslint-disable-line + Math.min(this.props.maximumWidth!, width) // eslint-disable-line + ) + } + + /** + * Handler for when the user presses the mouse button over the resize + * handle. + */ + private handleDragStart = (e: React.MouseEvent) => { + this.startX = e.clientX + this.startWidth = this.getCurrentWidth() || null + + document.addEventListener('mousemove', this.handleDragMove) + document.addEventListener('mouseup', this.handleDragStop) + + e.preventDefault() + } + + /** + * Handler for when the user moves the mouse while dragging + */ + private handleDragMove = (e: MouseEvent) => { + if (this.startWidth == null || this.startX == null) { + return + } + + const deltaX = e.clientX - this.startX + const newWidth = this.startWidth + deltaX + const newWidthClamped = this.clampWidth(newWidth) + + if (this.props.onResize) { + this.props.onResize(newWidthClamped) + } + + e.preventDefault() + } + + /** + * Handler for when the user lets go of the mouse button during + * a resize operation. + */ + private handleDragStop = (e: MouseEvent) => { + document.removeEventListener('mousemove', this.handleDragMove) + document.removeEventListener('mouseup', this.handleDragStop) + + e.preventDefault() + } + + /** + * Handler for when the resize handle is double clicked. + * + * Resets the panel width to its default value and clears + * any persisted value. + */ + private handleDoubleClick = () => { + if (this.props.onReset) { + this.props.onReset() + } + } + + public render () { + const style: React.CSSProperties = { + width: this.getCurrentWidth(), + maxWidth: this.props.maximumWidth, + minWidth: this.props.minimumWidth + } + + return ( +
+ {this.props.children} +
+
+ ) + } +} + +export interface IResizableProps { + readonly width: number + + /** The maximum width the panel can be resized to. + * + * @default 350 + */ + readonly maximumWidth?: number + + /** + * The minimum width the panel can be resized to. + * + * @default 150 + */ + readonly minimumWidth?: number + + /** The optional ID for the root element. */ + readonly id?: string + + /** + * Handler called when the width of the component has changed + * through an explicit resize event (dragging the handle). + */ + readonly onResize?: (newWidth: number) => void + + /** + * Handler called when the resizable component has been + * reset (ie restored to its original width by double clicking + * on the resize handle). + */ + readonly onReset?: () => void +} diff --git a/app/containers/AppContainer.tsx b/app/containers/AppContainer.tsx index 5633bb99..43755b21 100644 --- a/app/containers/AppContainer.tsx +++ b/app/containers/AppContainer.tsx @@ -1,9 +1,9 @@ import * as React from 'react' export default class AppComponent extends React.Component { - render() { + render () { return ( -
{this.props.children}
+
{this.props.children}
) } -} \ No newline at end of file +} diff --git a/app/containers/DatasetContainer.tsx b/app/containers/DatasetContainer.tsx new file mode 100644 index 00000000..37da72f0 --- /dev/null +++ b/app/containers/DatasetContainer.tsx @@ -0,0 +1,79 @@ +import * as React from 'react' +import { Resizable } from '../components/resizable' +import DatasetSidebar from '../components/DatasetSidebar' + +const defaultSidebarWidth = 250 + +export default class DatasetContainer extends React.Component<{}, { showDatasetList: boolean, sidebarWidth: number }> { + constructor (p: {}) { + super(p) + this.state = { + showDatasetList: false, + sidebarWidth: defaultSidebarWidth + } + } + + handleSidebarResize (width: number) { + this.setState({ sidebarWidth: width }) + } + + handleSidebarReset () { + this.setState({ sidebarWidth: defaultSidebarWidth }) + } + + toggleDatasetList () { + this.setState({ showDatasetList: !this.state.showDatasetList }) + } + + render () { + const { showDatasetList, sidebarWidth } = this.state + const expandedClass = showDatasetList ? 'expanded' : '' + + return ( +
+
+
this.toggleDatasetList()} + style={{ width: sidebarWidth }} + > +
Current Dataset
+
usgs_earthquakes
+ { + showDatasetList + ?
 
+ :
 
+ } + +
+
+
+ this.handleSidebarResize(width)} + onReset={() => this.handleSidebarReset()} + maximumWidth={495} + > + + +
+ {showDatasetList &&
} + Content goes here +
+ +
+ { + showDatasetList && ( +
+ Dataset List +
+ ) + } +
+ ) + } +} diff --git a/app/index.tsx b/app/index.tsx index 906a94a2..8a2f1892 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -5,8 +5,8 @@ import { BrowserRouter as Router } from 'react-router-dom' import { Provider } from 'react-redux' import './app.global.scss' -const { configureStore } = require('./store/configureStore'); -const store = configureStore(); +const { configureStore } = require('./store/configureStore') // eslint-disable-line +const store = configureStore() ReactDOM.render( @@ -15,4 +15,4 @@ ReactDOM.render( , document.getElementById('root') -) \ No newline at end of file +) diff --git a/app/main.development.js b/app/main.development.js index 157282e8..22e29546 100644 --- a/app/main.development.js +++ b/app/main.development.js @@ -1,275 +1,276 @@ -const { app, BrowserWindow, Menu, shell } = require('electron'); +const { app, BrowserWindow, Menu, shell } = require('electron') -let menu; -let template; -let mainWindow = null; +let menu +let template +let mainWindow = null if (process.env.NODE_ENV === 'production') { const sourceMapSupport = require('source-map-support'); // eslint-disable-line - sourceMapSupport.install(); + sourceMapSupport.install() } if (process.env.NODE_ENV === 'development') { - require('electron-debug')(); // eslint-disable-line global-require + require('electron-debug')() // eslint-disable-line global-require const path = require('path'); // eslint-disable-line const p = path.join(__dirname, '..', 'app', 'node_modules'); // eslint-disable-line require('module').globalPaths.push(p); // eslint-disable-line } app.on('window-all-closed', () => { - if (process.platform !== 'darwin') app.quit(); -}); - + if (process.platform !== 'darwin') app.quit() +}) const installExtensions = () => { if (process.env.NODE_ENV === 'development') { - const installer = require('electron-devtools-installer'); // eslint-disable-line global-require + const installer = require('electron-devtools-installer') // eslint-disable-line global-require const extensions = [ 'REACT_DEVELOPER_TOOLS', 'REDUX_DEVTOOLS' - ]; - const forceDownload = !!process.env.UPGRADE_EXTENSIONS; - return Promise.all(extensions.map(name => installer.default(installer[name], forceDownload))); + ] + const forceDownload = !!process.env.UPGRADE_EXTENSIONS + return Promise.all(extensions.map(name => installer.default(installer[name], forceDownload))) } - return Promise.resolve([]); -}; + return Promise.resolve([]) +} app.on('ready', () => installExtensions() - .then(() => { - mainWindow = new BrowserWindow({ - show: false, - width: 1024, - height: 728, - webPreferences: { - nodeIntegration: true - } - }); + .then(() => { + mainWindow = new BrowserWindow({ + show: false, + width: 1024, + height: 728, + minHeight: 640, + minWidth: 960, + webPreferences: { + nodeIntegration: true + } + }) - mainWindow.loadURL(`file://${__dirname}/app.html`); + mainWindow.loadURL(`file://${__dirname}/app.html`) - mainWindow.webContents.on('did-finish-load', () => { - mainWindow.show(); - mainWindow.focus(); - }); + mainWindow.webContents.on('did-finish-load', () => { + mainWindow.show() + mainWindow.focus() + }) - mainWindow.on('closed', () => { - mainWindow = null; - }); + mainWindow.on('closed', () => { + mainWindow = null + }) - if (process.env.NODE_ENV === 'development') { - mainWindow.openDevTools(); - mainWindow.webContents.on('context-menu', (e, props) => { - const { x, y } = props; + if (process.env.NODE_ENV === 'development') { + mainWindow.openDevTools() + mainWindow.webContents.on('context-menu', (e, props) => { + const { x, y } = props - Menu.buildFromTemplate([{ - label: 'Inspect element', - click() { - mainWindow.inspectElement(x, y); - } - }]).popup(mainWindow); - }); - } + Menu.buildFromTemplate([{ + label: 'Inspect element', + click () { + mainWindow.inspectElement(x, y) + } + }]).popup(mainWindow) + }) + } - if (process.platform === 'darwin') { - template = [{ - label: 'Electron', - submenu: [{ - label: 'About ElectronReact', - selector: 'orderFrontStandardAboutPanel:' - }, { - type: 'separator' - }, { - label: 'Services', - submenu: [] - }, { - type: 'separator' - }, { - label: 'Hide ElectronReact', - accelerator: 'Command+H', - selector: 'hide:' - }, { - label: 'Hide Others', - accelerator: 'Command+Shift+H', - selector: 'hideOtherApplications:' - }, { - label: 'Show All', - selector: 'unhideAllApplications:' - }, { - type: 'separator' - }, { - label: 'Quit', - accelerator: 'Command+Q', - click() { - app.quit(); - } - }] - }, { - label: 'Edit', - submenu: [{ - label: 'Undo', - accelerator: 'Command+Z', - selector: 'undo:' - }, { - label: 'Redo', - accelerator: 'Shift+Command+Z', - selector: 'redo:' - }, { - type: 'separator' - }, { - label: 'Cut', - accelerator: 'Command+X', - selector: 'cut:' - }, { - label: 'Copy', - accelerator: 'Command+C', - selector: 'copy:' - }, { - label: 'Paste', - accelerator: 'Command+V', - selector: 'paste:' - }, { - label: 'Select All', - accelerator: 'Command+A', - selector: 'selectAll:' - }] - }, { - label: 'View', - submenu: (process.env.NODE_ENV === 'development') ? [{ - label: 'Reload', - accelerator: 'Command+R', - click() { - mainWindow.webContents.reload(); - } - }, { - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click() { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }, { - label: 'Toggle Developer Tools', - accelerator: 'Alt+Command+I', - click() { - mainWindow.toggleDevTools(); - } - }] : [{ - label: 'Toggle Full Screen', - accelerator: 'Ctrl+Command+F', - click() { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }] - }, { - label: 'Window', - submenu: [{ - label: 'Minimize', - accelerator: 'Command+M', - selector: 'performMiniaturize:' - }, { - label: 'Close', - accelerator: 'Command+W', - selector: 'performClose:' - }, { - type: 'separator' - }, { - label: 'Bring All to Front', - selector: 'arrangeInFront:' - }] - }, { - label: 'Help', - submenu: [{ - label: 'Learn More', - click() { - shell.openExternal('http://electron.atom.io'); - } - }, { - label: 'Documentation', - click() { - shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); - } - }, { - label: 'Community Discussions', - click() { - shell.openExternal('https://discuss.atom.io/c/electron'); - } - }, { - label: 'Search Issues', - click() { - shell.openExternal('https://github.com/atom/electron/issues'); - } - }] - }]; + if (process.platform === 'darwin') { + template = [{ + label: 'Electron', + submenu: [{ + label: 'About ElectronReact', + selector: 'orderFrontStandardAboutPanel:' + }, { + type: 'separator' + }, { + label: 'Services', + submenu: [] + }, { + type: 'separator' + }, { + label: 'Hide ElectronReact', + accelerator: 'Command+H', + selector: 'hide:' + }, { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + selector: 'hideOtherApplications:' + }, { + label: 'Show All', + selector: 'unhideAllApplications:' + }, { + type: 'separator' + }, { + label: 'Quit', + accelerator: 'Command+Q', + click () { + app.quit() + } + }] + }, { + label: 'Edit', + submenu: [{ + label: 'Undo', + accelerator: 'Command+Z', + selector: 'undo:' + }, { + label: 'Redo', + accelerator: 'Shift+Command+Z', + selector: 'redo:' + }, { + type: 'separator' + }, { + label: 'Cut', + accelerator: 'Command+X', + selector: 'cut:' + }, { + label: 'Copy', + accelerator: 'Command+C', + selector: 'copy:' + }, { + label: 'Paste', + accelerator: 'Command+V', + selector: 'paste:' + }, { + label: 'Select All', + accelerator: 'Command+A', + selector: 'selectAll:' + }] + }, { + label: 'View', + submenu: (process.env.NODE_ENV === 'development') ? [{ + label: 'Reload', + accelerator: 'Command+R', + click () { + mainWindow.webContents.reload() + } + }, { + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click () { + mainWindow.setFullScreen(!mainWindow.isFullScreen()) + } + }, { + label: 'Toggle Developer Tools', + accelerator: 'Alt+Command+I', + click () { + mainWindow.toggleDevTools() + } + }] : [{ + label: 'Toggle Full Screen', + accelerator: 'Ctrl+Command+F', + click () { + mainWindow.setFullScreen(!mainWindow.isFullScreen()) + } + }] + }, { + label: 'Window', + submenu: [{ + label: 'Minimize', + accelerator: 'Command+M', + selector: 'performMiniaturize:' + }, { + label: 'Close', + accelerator: 'Command+W', + selector: 'performClose:' + }, { + type: 'separator' + }, { + label: 'Bring All to Front', + selector: 'arrangeInFront:' + }] + }, { + label: 'Help', + submenu: [{ + label: 'Learn More', + click () { + shell.openExternal('http://electron.atom.io') + } + }, { + label: 'Documentation', + click () { + shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme') + } + }, { + label: 'Community Discussions', + click () { + shell.openExternal('https://discuss.atom.io/c/electron') + } + }, { + label: 'Search Issues', + click () { + shell.openExternal('https://github.com/atom/electron/issues') + } + }] + }] - menu = Menu.buildFromTemplate(template); - Menu.setApplicationMenu(menu); - } else { - template = [{ - label: '&File', - submenu: [{ - label: '&Open', - accelerator: 'Ctrl+O' - }, { - label: '&Close', - accelerator: 'Ctrl+W', - click() { - mainWindow.close(); - } - }] - }, { - label: '&View', - submenu: (process.env.NODE_ENV === 'development') ? [{ - label: '&Reload', - accelerator: 'Ctrl+R', - click() { - mainWindow.webContents.reload(); - } - }, { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click() { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }, { - label: 'Toggle &Developer Tools', - accelerator: 'Alt+Ctrl+I', - click() { - mainWindow.toggleDevTools(); - } - }] : [{ - label: 'Toggle &Full Screen', - accelerator: 'F11', - click() { - mainWindow.setFullScreen(!mainWindow.isFullScreen()); - } - }] - }, { - label: 'Help', - submenu: [{ - label: 'Learn More', - click() { - shell.openExternal('http://electron.atom.io'); - } - }, { - label: 'Documentation', - click() { - shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); - } - }, { - label: 'Community Discussions', - click() { - shell.openExternal('https://discuss.atom.io/c/electron'); - } - }, { - label: 'Search Issues', - click() { - shell.openExternal('https://github.com/atom/electron/issues'); - } - }] - }]; - menu = Menu.buildFromTemplate(template); - mainWindow.setMenu(menu); - } -})); + menu = Menu.buildFromTemplate(template) + Menu.setApplicationMenu(menu) + } else { + template = [{ + label: '&File', + submenu: [{ + label: '&Open', + accelerator: 'Ctrl+O' + }, { + label: '&Close', + accelerator: 'Ctrl+W', + click () { + mainWindow.close() + } + }] + }, { + label: '&View', + submenu: (process.env.NODE_ENV === 'development') ? [{ + label: '&Reload', + accelerator: 'Ctrl+R', + click () { + mainWindow.webContents.reload() + } + }, { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click () { + mainWindow.setFullScreen(!mainWindow.isFullScreen()) + } + }, { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click () { + mainWindow.toggleDevTools() + } + }] : [{ + label: 'Toggle &Full Screen', + accelerator: 'F11', + click () { + mainWindow.setFullScreen(!mainWindow.isFullScreen()) + } + }] + }, { + label: 'Help', + submenu: [{ + label: 'Learn More', + click () { + shell.openExternal('http://electron.atom.io') + } + }, { + label: 'Documentation', + click () { + shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme') + } + }, { + label: 'Community Discussions', + click () { + shell.openExternal('https://discuss.atom.io/c/electron') + } + }, { + label: 'Search Issues', + click () { + shell.openExternal('https://github.com/atom/electron/issues') + } + }] + }] + menu = Menu.buildFromTemplate(template) + mainWindow.setMenu(menu) + } + })) diff --git a/app/reducers/counter.ts b/app/reducers/counter.ts new file mode 100644 index 00000000..56b4abb5 --- /dev/null +++ b/app/reducers/counter.ts @@ -0,0 +1,14 @@ +import { IAction } from '../actions/helpers' +import { increment, decrement } from '../actions/counter' + +export type TState = number; + +export default function counter (state: number = 0, action: IAction) { + if (increment.test(action)) { + return state + 1 + } else if (decrement.test(action)) { + return state - 1 + } + + return state +} diff --git a/app/reducers/index.ts b/app/reducers/index.ts index 3432cc65..c6a1f8ed 100644 --- a/app/reducers/index.ts +++ b/app/reducers/index.ts @@ -1,8 +1,14 @@ -import { combineReducers, Reducer } from 'redux'; -import { routerReducer as routing } from 'react-router-redux'; +import { combineReducers, Reducer } from 'redux' +import { routerReducer as routing } from 'react-router-redux' +import counter, { TState as TCounterState } from './counter' const rootReducer = combineReducers({ + counter, routing: routing as Reducer -}); +}) -export default rootReducer; \ No newline at end of file +export interface IState { + counter: TCounterState +} + +export default rootReducer diff --git a/app/routes.tsx b/app/routes.tsx index 9980d5f3..53a288b2 100644 --- a/app/routes.tsx +++ b/app/routes.tsx @@ -1,12 +1,16 @@ -import * as React from 'react'; -import { Switch, Route } from 'react-router'; -import AppContainer from './containers/AppContainer'; +import * as React from 'react' +import { Switch, Route } from 'react-router' +import AppContainer from './containers/AppContainer' import App from './components/App' -export default () => ( - - - - - -); +export default function Routes () { + return ( + + + + + + ) +} + +Routes.displayName = 'Routes' diff --git a/app/scss/_dataset-container.scss b/app/scss/_dataset-container.scss new file mode 100644 index 00000000..77c21ab8 --- /dev/null +++ b/app/scss/_dataset-container.scss @@ -0,0 +1,184 @@ +//////////////////////////// +// Dataset Container // +//////////////////////////// + +#dataset-container { + display: flex; + flex-direction: column; + flex-grow: 1; + height: 100%; + + .header { + height: 50px; + background-color: #315379; + color: #F8F2F2; + cursor: default; + flex-direction: row; + flex-grow: 0; + flex-shrink: 0; + } + + .header-column { + display: inline-block; + height: 100%; + border-right: 1px solid #484d65; + padding: 10px 10px 10px 36px; + + &:hover { + background-color: #416588; + } + + &.expanded { + border-right: none; + } + + &.expanded:hover { + background-color: transparent; + } + } + + .columns { + display: flex; + flex-direction: row; + flex: 1; + + #sidebar { + position: relative; + + .resize-handle { + position: absolute; + right: -5px; + top: 0px; + height: 100%; + width: 10px; + cursor: ew-resize; + } + } + + .content { + background-color: #d8d8d8; + flex: 1; + + .overlay { + position: absolute; + height: 100%; + width: 100%; + background-color: #000; + opacity: 0.4; + } + } + } + + .current-dataset { + width: 250px; + position: relative; + z-index:10; + + .label { + font-size: 0.75rem; + font-weight: 300; + line-height: 0.8rem; + } + + .name { + font-weight: 600; + line-height: 1.5rem; + } + + .arrow { + width: 0px; + height: 0px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + position: absolute; + + &.expand { + border-top: 5px solid #fff; + right: 15px; + top: 24px; + } + + &.collapse { + border-bottom: 5px solid #383838; + right: 15px; + top: 24px; + } + } + + &.expanded { + color: #383838; + } + } + + .dataset-list { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 250px; + background-color: #fff; + padding-top: 50px; + } +} + +//////////////////////////// +// Dataset Sidebar // +//////////////////////////// + +#dataset-sidebar { + height: 100%; + width: 100%; + + .sidebar-row { + width: 100%; + font-size: .9rem; + border-bottom: 1px solid #979797; + &:last-child { + border-right: 0; + } + } + + #tabs { + width: 100%; + height: 30px; + background-color: #FFF; + cursor: default; + + .tab { + width: 50%; + display: inline-block; + height: 100%; + padding: 6px; + text-align: center; + border-right: 1px solid #979797; + + &.active { + border-bottom: 3px solid #0666D6; + } + + &:hover { + background-color: #efefef; + } + } + } + + .changes { + height: 30px; + padding: 6px; + background-color: #F6F8FA; + } + + .file-row { + height: 60px; + padding: 10px; + + .label { + font-weight: 600; + font-size: 1.2rem; + } + + &:hover { + background-color: #efefef; + } + } +} diff --git a/app/scss/style.scss b/app/scss/style.scss index dbd9a9d6..711dc600 100755 --- a/app/scss/style.scss +++ b/app/scss/style.scss @@ -21,4 +21,10 @@ @import "item"; @import "profile"; @import "compare"; -@import "stylesheet"; \ No newline at end of file +@import "stylesheet"; + +@import "dataset-container"; + +#app, #app-container { + height: 100%; +} diff --git a/app/store/configureStore.development.ts b/app/store/configureStore.development.ts index 3a9d361e..70d25c14 100644 --- a/app/store/configureStore.development.ts +++ b/app/store/configureStore.development.ts @@ -1,56 +1,59 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; -import { createHashHistory } from 'history'; -import { routerMiddleware, push } from 'react-router-redux'; -import { createLogger } from 'redux-logger'; -import rootReducer from '../reducers'; +import { createStore, applyMiddleware, compose } from 'redux' +import thunk from 'redux-thunk' +import { createHashHistory } from 'history' +import { routerMiddleware, push } from 'react-router-redux' +import { createLogger } from 'redux-logger' +import rootReducer from '../reducers' + +import * as counterActions from '../actions/counter' declare const window: Window & { - __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?(a: any): void; -}; + __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?(a: any): void +} declare const module: NodeModule & { hot?: { - accept(...args: any[]): any; + accept(...args: any[]): any } -}; +} -const actionCreators = Object.assign({}, - {push} -); +const actionCreators = Object.assign({}, + counterActions, + { push } +) -const logger = (createLogger)({ +const logger = (createLogger as any)({ level: 'info', collapsed: true -}); +}) -const history = createHashHistory(); -const router = routerMiddleware(history); +const history = createHashHistory() +const router = routerMiddleware(history) // If Redux DevTools Extension is installed use it, otherwise use Redux compose /* eslint-disable no-underscore-dangle */ -const composeEnhancers: typeof compose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? - window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ +const composeEnhancers: typeof compose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ + ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html actionCreators - }) as any : - compose; + }) as any + : compose /* eslint-enable no-underscore-dangle */ const enhancer = composeEnhancers( applyMiddleware(thunk, router, logger) -); +) export = { history, - configureStore(initialState: Object | void) { - const store = createStore(rootReducer, initialState as any, enhancer); + configureStore (initialState: Object | void) { + const store = createStore(rootReducer, initialState as any, enhancer) if (module.hot) { module.hot.accept('../reducers', () => store.replaceReducer(require('../reducers')) // eslint-disable-line global-require - ); + ) } - return store; + return store } }; diff --git a/app/store/configureStore.production.ts b/app/store/configureStore.production.ts index 4f2397a3..5497f302 100644 --- a/app/store/configureStore.production.ts +++ b/app/store/configureStore.production.ts @@ -2,7 +2,7 @@ import { createStore, applyMiddleware } from 'redux'; import thunk from 'redux-thunk'; import { createBrowserHistory } from 'history'; import { routerMiddleware } from 'react-router-redux'; -import rootReducer from '../reducers' +import rootReducer from '../reducers'; const history = createBrowserHistory(); const router = routerMiddleware(history); diff --git a/app/store/configureStore.ts b/app/store/configureStore.ts index 81582dd7..e28baff4 100644 --- a/app/store/configureStore.ts +++ b/app/store/configureStore.ts @@ -1,9 +1,9 @@ -let configureStore: any; +let configureStore: any if (process.env.NODE_ENV === 'production') { - configureStore = require('./configureStore.production'); + configureStore = require('./configureStore.production') } else { - configureStore = require('./configureStore.development'); + configureStore = require('./configureStore.development') } export = configureStore; diff --git a/package.json b/package.json index 0626f776..25ff5bd9 100644 --- a/package.json +++ b/package.json @@ -123,6 +123,8 @@ "@types/react-router-redux": "5.0.18", "@types/redux-logger": "3.0.7", "@types/sinon": "7.0.13", + "@typescript-eslint/eslint-plugin": "1.11.0", + "@typescript-eslint/parser": "1.11.0", "asar": "2.0.1", "concurrently": "4.1.1", "cross-env": "5.2.0", @@ -135,6 +137,14 @@ "electron-devtools-installer": "2.2.4", "enzyme": "3.10.0", "enzyme-adapter-react-16": "1.14.0", + "eslint": "6.0.1", + "eslint-config-standard-with-typescript": "7.1.0", + "eslint-loader": "^2.2.1", + "eslint-plugin-import": "2.18.0", + "eslint-plugin-node": "9.1.0", + "eslint-plugin-promise": "4.2.1", + "eslint-plugin-react": "^7.14.2", + "eslint-plugin-standard": "4.0.0", "express": "4.17.1", "file-loader": "4.0.0", "html-webpack-plugin": "3.2.0", diff --git a/test/actions/__snapshots__/counter.spec.ts.snap b/test/actions/__snapshots__/counter.spec.ts.snap new file mode 100644 index 00000000..dc692275 --- /dev/null +++ b/test/actions/__snapshots__/counter.spec.ts.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`actions should decrement should create decrement action 1`] = ` +Object { + "type": "DECREMENT_COUNTER", +} +`; + +exports[`actions should increment should create increment action 1`] = ` +Object { + "type": "INCREMENT_COUNTER", +} +`; diff --git a/test/actions/counter.spec.ts b/test/actions/counter.spec.ts new file mode 100644 index 00000000..4c0010fe --- /dev/null +++ b/test/actions/counter.spec.ts @@ -0,0 +1,41 @@ +// import { spy } from 'sinon'; +// import * as actions from '../../app/actions/counter'; + +// describe('actions', () => { +// it('should increment should create increment action', () => { +// expect(actions.increment()).toMatchSnapshot(); +// }); + +// it('should decrement should create decrement action', () => { +// expect(actions.decrement()).toMatchSnapshot(); +// }); + +// it('should incrementIfOdd should create increment action', () => { +// const fn = actions.incrementIfOdd(); +// expect(fn).toBeInstanceOf(Function); +// const dispatch = spy(); +// const getState = () => ({ counter: 1 }); +// fn(dispatch, getState); +// expect(dispatch.calledWith({ type: actions.increment.type })).toBe(true); +// }); + +// it('should incrementIfOdd shouldnt create increment action if counter is even', () => { +// const fn = actions.incrementIfOdd(); +// const dispatch = spy(); +// const getState = () => ({ counter: 2 }); +// fn(dispatch, getState); +// expect(dispatch.called).toBe(false); +// }); + +// // There's no nice way to test this at the moment... +// it('should incrementAsync', done => { +// const fn = actions.incrementAsync(1); +// expect(fn).toBeInstanceOf(Function); +// const dispatch = spy(); +// fn(dispatch); +// setTimeout(() => { +// expect(dispatch.calledWith({ type: actions.increment.type })).toBe(true); +// done(); +// }, 5); +// }); +// }); diff --git a/test/components/Counter.spec.tsx b/test/components/Counter.spec.tsx new file mode 100644 index 00000000..eee91db0 --- /dev/null +++ b/test/components/Counter.spec.tsx @@ -0,0 +1,57 @@ +// import '../utils/enzymeConfig'; + +// import { spy } from 'sinon'; +// import * as React from 'react'; +// import { shallow } from 'enzyme'; +// import Counter from '../../app/components/Counter'; + +// const CounterAny = Counter as any; + +// function setup() { +// const actions = { +// increment: spy(), +// incrementIfOdd: spy(), +// incrementAsync: spy(), +// decrement: spy() +// }; +// const component = shallow(); +// return { +// component, +// actions, +// buttons: component.find('button'), +// p: component.find('.counter') +// }; +// } + +// describe('Counter component', () => { +// it('should should display count', () => { +// const { p } = setup(); +// expect(p.text()).toMatch(/^1$/); +// }); + +// it('should first button should call increment', () => { +// const { buttons, actions } = setup(); +// buttons.at(0).simulate('click'); +// expect(actions.increment.called).toBe(true); +// }); + +// it('should second button should call decrement', () => { +// const { buttons, actions } = setup(); +// buttons.at(1).simulate('click'); +// expect(actions.decrement.called).toBe(true); +// }); + +// it('should third button should call incrementIfOdd', () => { +// const { buttons, actions } = setup(); +// buttons.at(2).simulate('click'); +// expect(actions.incrementIfOdd.called).toBe(true); +// }); + +// it('should fourth button should call incrementAsync', () => { +// const { buttons, actions } = setup(); +// buttons.at(3).simulate('click'); +// expect(actions.incrementAsync.called).toBe(true); +// }); +// }); diff --git a/test/containers/CounterPage.spec.tsx b/test/containers/CounterPage.spec.tsx new file mode 100644 index 00000000..7dbd18e7 --- /dev/null +++ b/test/containers/CounterPage.spec.tsx @@ -0,0 +1,60 @@ +// import '../utils/enzymeConfig'; + +// import * as React from 'react'; +// import { mount } from 'enzyme'; +// import { Provider } from 'react-redux'; +// import { ConnectedRouter } from 'react-router-redux'; +// import CounterPage from '../../app/containers/CounterPage'; +// import { IState } from '../../app/reducers'; + +// const CounterPageAny = CounterPage as any; +// let { configureStore, history } = require('../../app/store/configureStore'); + +// function setup(initialState?: IState) { +// const store = configureStore(initialState); +// const app = mount( +// +// +// +// +// +// ); +// return { +// app, +// buttons: app.find('button'), +// p: app.find('.counter') +// }; +// } + +// describe('containers', () => { +// describe('App', () => { +// it('should display initial count', () => { +// const { p } = setup(); +// expect(p.text()).toMatch(/^0$/); +// }); + +// it('should display updated count after increment button click', () => { +// const { buttons, p } = setup(); +// buttons.at(0).simulate('click'); +// expect(p.text()).toMatch(/^1$/); +// }); + +// it('should display updated count after descrement button click', () => { +// const { buttons, p } = setup(); +// buttons.at(1).simulate('click'); +// expect(p.text()).toMatch(/^-1$/); +// }); + +// it('shouldnt change if even and if odd button clicked', () => { +// const { buttons, p } = setup(); +// buttons.at(2).simulate('click'); +// expect(p.text()).toMatch(/^0$/); +// }); + +// it('should change if odd and if odd button clicked', () => { +// const { buttons, p } = setup({ counter: 1 }); +// buttons.at(2).simulate('click'); +// expect(p.text()).toMatch(/^2$/); +// }); +// }); +// }); diff --git a/test/reducers/counter.spec.ts b/test/reducers/counter.spec.ts new file mode 100644 index 00000000..9ac46055 --- /dev/null +++ b/test/reducers/counter.spec.ts @@ -0,0 +1,22 @@ +import counter from '../../app/reducers/counter'; +import { increment, decrement } from '../../app/actions/counter'; + +describe('reducers', () => { + describe('counter', () => { + it('should handle initial state', () => { + expect(counter(undefined, { type: 'unknown' })).toBe(0); + }); + + it('should handle INCREMENT_COUNTER', () => { + expect(counter(1, increment())).toBe(2); + }); + + it('should handle DECREMENT_COUNTER', () => { + expect(counter(1, decrement())).toBe(0); + }); + + it('should handle unknown action type', () => { + expect(counter(1, { type: 'unknown' })).toBe(1); + }); + }); +}); diff --git a/webpack.config.development.js b/webpack.config.development.js index df4e0afc..97f0796e 100644 --- a/webpack.config.development.js +++ b/webpack.config.development.js @@ -35,6 +35,14 @@ module.exports = merge(baseConfig, { // } // ], rules: [ + { + test: /\.(js|ts|tsx)$/, + exclude: /node_modules/, + loader: 'eslint-loader', + options: { + // eslint options (if necessary) + } + }, { test: /\.global\.css$/, loaders: [ @@ -51,9 +59,9 @@ module.exports = merge(baseConfig, { ] }, - // Add SASS support - compile all .global.scss files and pipe it to style.css + // Add SASS support - compile all .scss files and pipe it to style.css { - test: /\.global\.scss$/, + test: /.scss$/, use: [ { loader: 'style-loader' diff --git a/yarn.lock b/yarn.lock index 86aad160..ca42a58e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,13 +20,13 @@ "@babel/highlight" "^7.0.0" "@babel/core@^7.1.0": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.4.tgz#4c32df7ad5a58e9ea27ad025c11276324e0b4ddd" - integrity sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.0.tgz#6ed6a2881ad48a732c5433096d96d1b0ee5eb734" + integrity sha512-6Isr4X98pwXqHvtigw71CKgmhL1etZjPs5A67jL/w0TkLM9eqmFR40YrnJvEc1WnMZFsskjsmid8bHZyxKEAnw== dependencies: "@babel/code-frame" "^7.0.0" "@babel/generator" "^7.5.0" - "@babel/helpers" "^7.5.4" + "@babel/helpers" "^7.5.0" "@babel/parser" "^7.5.0" "@babel/template" "^7.4.4" "@babel/traverse" "^7.5.0" @@ -78,10 +78,10 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helpers@^7.5.4": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.4.tgz#2f00608aa10d460bde0ccf665d6dcf8477357cf0" - integrity sha512-6LJ6xwUEJP51w0sIgKyfvFMJvIb9mWAfohJp0+m6eHJigkFdcH8duZ1sfhn0ltJRzwUIT/yqqhdSfRpCpL7oow== +"@babel/helpers@^7.5.0": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.3.tgz#7f8bbcd60d9ce4d591b5a34781244437052b5d0c" + integrity sha512-WsQGlraYva5sNtGYgnQWx/kRQNZulxOs5Yc2K260J/4Z5klXIx5HlJgCdv5h9U9apdldeoI/5A7JYylrxNMZoQ== dependencies: "@babel/template" "^7.4.4" "@babel/traverse" "^7.5.0" @@ -109,9 +109,9 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5": - version "7.5.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.4.tgz#cb7d1ad7c6d65676e66b47186577930465b5271b" - integrity sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q== + version "7.5.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.3.tgz#ad06e9d28539426fc20869f0b3d9ed6c21bed909" + integrity sha512-09kHrO2Y0JWybW20qnt+UMlNTj7NUQByP6ubyq50Yj1QCDhbHfEmWk/uso+SaEi5XKNEWYVKbBgdiZisIaBPmw== dependencies: regenerator-runtime "^0.13.2" @@ -396,6 +396,11 @@ "@types/cheerio" "*" "@types/react" "*" +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/history@*", "@types/history@4.7.2": version "4.7.2" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.2.tgz#0e670ea254d559241b6eeb3894f8754991e73220" @@ -543,6 +548,43 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== +"@typescript-eslint/eslint-plugin@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.11.0.tgz#870f752c520db04db6d3668af7479026a6f2fb9a" + integrity sha512-mXv9ccCou89C8/4avKHuPB2WkSZyY/XcTQUXd5LFZAcLw1I3mWYVjUu6eS9Ja0QkP/ClolbcW9tb3Ov/pMdcqw== + dependencies: + "@typescript-eslint/experimental-utils" "1.11.0" + eslint-utils "^1.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^2.0.1" + tsutils "^3.7.0" + +"@typescript-eslint/experimental-utils@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.11.0.tgz#594abe47091cbeabac1d6f9cfed06d0ad99eb7e3" + integrity sha512-7LbfaqF6B8oa8cp/315zxKk8FFzosRzzhF8Kn/ZRsRsnpm7Qcu25cR/9RnAQo5utZ2KIWVgaALr+ZmcbG47ruw== + dependencies: + "@typescript-eslint/typescript-estree" "1.11.0" + eslint-scope "^4.0.0" + +"@typescript-eslint/parser@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.11.0.tgz#2f6d4f7e64eeb1e7c25b422f8df14d0c9e508e36" + integrity sha512-5xBExyXaxVyczrZvbRKEXvaTUFFq7gIM9BynXukXZE0zF3IQP/FxF4mPmmh3gJ9egafZFqByCpPTFm3dk4SY7Q== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "1.11.0" + "@typescript-eslint/typescript-estree" "1.11.0" + eslint-visitor-keys "^1.0.0" + +"@typescript-eslint/typescript-estree@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.11.0.tgz#b7b5782aab22e4b3b6d84633652c9f41e62d37d5" + integrity sha512-fquUHF5tAx1sM2OeRCC7wVxFd1iMELWMGCzOSmJ3pLzArj9+kRixdlC4d5MncuzXpjEqc6045p3KwM0o/3FuUA== + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -730,6 +772,11 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + acorn-walk@^6.0.1: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" @@ -740,7 +787,7 @@ acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.1, acorn@^6.2.0: +acorn@^6.0.1, acorn@^6.0.7, acorn@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" integrity sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw== @@ -771,7 +818,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.2: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.5.5, ajv@^6.9.1, ajv@^6.9.2: version "6.10.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.1.tgz#ebf8d3af22552df9dd049bfbe50cc2390e823593" integrity sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ== @@ -798,7 +845,7 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^3.0.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -969,6 +1016,14 @@ array-from@^2.1.1: resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -1559,7 +1614,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1584,6 +1639,11 @@ chardet@^0.4.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + cheerio@^1.0.0-rc.2: version "1.0.0-rc.3" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" @@ -1864,6 +1924,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -2181,7 +2246,7 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: +debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2195,7 +2260,7 @@ debug@^3.0.0, debug@^3.0.1, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -2373,6 +2438,28 @@ dmg-builder@6.7.2: parse-color "^1.0.0" sanitize-filename "^1.6.1" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-converter@^0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -2732,7 +2819,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.0, es-abstract@^1.5.1: +es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -2775,7 +2862,108 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-scope@^4.0.0: +eslint-config-standard-with-typescript@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-7.1.0.tgz#8cf66d6abdad595c82b009e19150f66cad9412d0" + integrity sha512-tEHhBMnq9XxuyuyqJfTn6IJUHIqIkIYW6faQzjNy5mAOZz59pLSSJk8gxuieaAMGnhQXwjCzaY0fKcSXshyOTQ== + dependencies: + eslint-config-standard "^12.0.0" + +eslint-config-standard@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" + integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== + +eslint-import-resolver-node@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-loader@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.2.1.tgz#28b9c12da54057af0845e2a6112701a2f6bf8337" + integrity sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg== + dependencies: + loader-fs-cache "^1.0.0" + loader-utils "^1.0.2" + object-assign "^4.0.1" + object-hash "^1.1.4" + rimraf "^2.6.1" + +eslint-module-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz#8b93499e9b00eab80ccb6614e69f03678e84e09a" + integrity sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw== + dependencies: + debug "^2.6.8" + pkg-dir "^2.0.0" + +eslint-plugin-es@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz#475f65bb20c993fc10e8c8fe77d1d60068072da6" + integrity sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw== + dependencies: + eslint-utils "^1.3.0" + regexpp "^2.0.1" + +eslint-plugin-import@2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" + integrity sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig== + dependencies: + array-includes "^3.0.3" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.0" + has "^1.0.3" + lodash "^4.17.11" + minimatch "^3.0.4" + read-pkg-up "^2.0.0" + resolve "^1.11.0" + +eslint-plugin-node@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz#f2fd88509a31ec69db6e9606d76dabc5adc1b91a" + integrity sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw== + dependencies: + eslint-plugin-es "^1.4.0" + eslint-utils "^1.3.1" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + +eslint-plugin-react@^7.14.2: + version "7.14.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.2.tgz#94c193cc77a899ac0ecbb2766fbef88685b7ecc1" + integrity sha512-jZdnKe3ip7FQOdjxks9XPN0pjUKZYq48OggNMd16Sk+8VXx6JOvXmlElxROCgp7tiUsTsze3jd78s/9AFJP2mA== + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.1.0" + object.entries "^1.1.0" + object.fromentries "^2.0.0" + object.values "^1.1.0" + prop-types "^15.7.2" + resolve "^1.10.1" + +eslint-plugin-standard@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.0.tgz#f845b45109c99cd90e77796940a344546c8f6b5c" + integrity sha512-OwxJkR6TQiYMmt1EsNRMe5qG3GsbjlcOhbGUBY4LtavF9DsLaTcoR+j2Tdjqi23oUwKNUqX7qcn5fPStafMdlA== + +eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -2783,6 +2971,67 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.0, eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.1.tgz#4a32181d72cb999d6f54151df7d337131f81cda7" + integrity sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^6.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^3.1.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" + integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -2793,6 +3042,13 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" @@ -2800,7 +3056,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -2961,6 +3217,15 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -3041,6 +3306,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + file-loader@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.0.0.tgz#c3570783fefb6e1bc0978a856f4bf5825b966c2a" @@ -3079,6 +3351,15 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -3096,6 +3377,13 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3113,6 +3401,20 @@ findup-sync@3.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -3301,6 +3603,11 @@ function.prototype.name@^1.1.0: function-bind "^1.1.1" is-callable "^1.1.3" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3451,7 +3758,7 @@ global@^4.3.0: min-document "^2.19.0" process "^0.11.10" -globals@^11.1.0: +globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -3825,6 +4132,24 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" + integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -3888,6 +4213,25 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +inquirer@^6.2.2: + version "6.4.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.4.1.tgz#7bd9e5ab0567cd23b41b0180b68e0cfa82fc3c0b" + integrity sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + inquirer@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" @@ -4719,6 +5063,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4760,6 +5109,14 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz#4d4973ebf8b9d2837ee91a8208cc66f3a2776cfb" + integrity sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ== + dependencies: + array-includes "^3.0.3" + object.assign "^4.1.0" + just-extend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" @@ -4854,7 +5211,7 @@ leven@^2.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= @@ -4873,6 +5230,16 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4883,6 +5250,14 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +loader-fs-cache@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086" + integrity sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw== + dependencies: + find-cache-dir "^0.1.1" + mkdirp "0.5.1" + loader-runner@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -4907,6 +5282,14 @@ loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -4945,6 +5328,11 @@ lodash.tail@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -5664,6 +6052,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-hash@^1.1.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + object-inspect@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" @@ -5775,7 +6168,7 @@ optimist@^0.6.1, optimist@~0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -5853,6 +6246,13 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" @@ -5860,6 +6260,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -5872,6 +6279,11 @@ p-reduce@^1.0.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -5908,6 +6320,13 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.4" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" @@ -6032,6 +6451,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -6099,6 +6525,20 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -6289,6 +6729,11 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -6628,6 +7073,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -6645,6 +7098,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -6740,9 +7202,9 @@ redux@4.0.1: symbol-observable "^1.2.0" "redux@>= 3.7.2", redux@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.3.tgz#0ca18be085e6cf6ed50e445a125f85e8b26b266b" - integrity sha512-v/Iaw67Pe+na+cZvcKvPxAKT1ww5kM+M09fmaCndCQC4Lo434AYb5975HJgJlp0D7dJxfYaLxMD4VwfpLOZ1Rw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.2.tgz#597cc660a99f91412e31c96c3da10ed8ace0715d" + integrity sha512-oAiFLWYQhbpSvzjcVfgQ90MlZ0u6uDIHFK41Q0/BnCfjEg96SACzwUFwDVUKz/LP/SwJORGaFY8AM5wOB/zf0A== dependencies: loose-envify "^1.4.0" symbol-observable "^1.2.0" @@ -6785,6 +7247,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -6936,6 +7403,11 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-pathname@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" @@ -6951,7 +7423,7 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.5.0: version "1.11.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== @@ -6983,7 +7455,7 @@ rgb2hex@^0.1.9: resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.9.tgz#5d3e0e14b0177b568e6f0d5b43e34fbfdb670346" integrity sha512-32iuQzhOjyT+cv9aAFRBJ19JgHwzQwbjUhH3Fj2sWW2EEGAW8fpFrDFP5ndoKDxJaLO06x1hE3kyuIFrUQtybQ== -rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2, rimraf@2.6.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -7037,7 +7509,7 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -rxjs@^6.3.3: +rxjs@^6.3.3, rxjs@^6.4.0: version "6.5.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== @@ -7152,12 +7624,17 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== -semver@^6.0.0, semver@^6.1.1: +semver@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1: version "6.2.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== @@ -7300,6 +7777,15 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -7655,7 +8141,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -7718,6 +8204,16 @@ symbol-tree@^3.2.2: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +table@^5.2.3: + version "5.4.1" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" + integrity sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w== + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tapable@^1.0.0, tapable@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" @@ -7808,6 +8304,11 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -8050,6 +8551,13 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" +tsutils@^3.7.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.14.0.tgz#bf8d5a7bae5369331fa0f2b0a5a10bd7f7396c77" + integrity sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -8605,6 +9113,13 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"