diff --git a/.cspell.json b/.cspell.json new file mode 100644 index 0000000..a06f95e --- /dev/null +++ b/.cspell.json @@ -0,0 +1,8 @@ +{ + "language": "en", + "words": [ + "subheader", + "basepath", + "webdriverio" + ] +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..dd87e2d --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..85aaba8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.formatOnSave": true, + "files.exclude": { + "**/node_modules": true + } +} diff --git a/app/package.json b/app/package.json index bcc2209..932eea6 100644 --- a/app/package.json +++ b/app/package.json @@ -76,5 +76,8 @@ "webpack-bundle-analyzer": "^3.0.3", "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.14" + }, + "peerDependencies": { + "electron": "^5.0.4" } } diff --git a/app/src/actions/Connection.ts b/app/src/actions/Connection.ts index a245b31..4c4a266 100644 --- a/app/src/actions/Connection.ts +++ b/app/src/actions/Connection.ts @@ -9,20 +9,18 @@ import { globalActions } from '.' import { resetStore as resetTreeStore, showTree } from './Tree' import { showError } from './Global' import { TopicViewModel } from '../model/TopicViewModel' -import { - addMqttConnectionEvent, - makeConnectionStateEvent, - removeConnection, - rendererEvents, -} from '../../../events' +import { addMqttConnectionEvent, makeConnectionStateEvent, removeConnection, rendererEvents } from '../../../events' -export const connect = (options: MqttOptions, connectionId: string) => (dispatch: Dispatch, getState: () => AppState) => { +export const connect = (options: MqttOptions, connectionId: string) => ( + dispatch: Dispatch, + getState: () => AppState +) => { dispatch(connecting(connectionId)) rendererEvents.emit(addMqttConnectionEvent, { options, id: connectionId }) const event = makeConnectionStateEvent(connectionId) const host = url.parse(options.url).hostname - rendererEvents.subscribe(event, (dataSourceState) => { + rendererEvents.subscribe(event, dataSourceState => { console.log(dataSourceState) if (dataSourceState.connected) { const didReconnect = Boolean(getState().connection.tree) @@ -59,7 +57,10 @@ const updateHealth = (dataSourceState: DataSourceState) => (dispatch: Dispatch, host: string) => Action = (tree: q.Tree, host: string) => ({ +export const connected: (tree: q.Tree, host: string) => Action = ( + tree: q.Tree, + host: string +) => ({ tree, host, type: ActionTypes.CONNECTION_SET_CONNECTED, diff --git a/app/src/actions/ConnectionManager.ts b/app/src/actions/ConnectionManager.ts index 23b6a7e..b6b4c3a 100644 --- a/app/src/actions/ConnectionManager.ts +++ b/app/src/actions/ConnectionManager.ts @@ -1,6 +1,11 @@ import { AppState } from '../reducers' import { clearLegacyConnectionOptions, loadLegacyConnectionOptions } from '../model/LegacyConnectionSettings' -import { ConnectionOptions, createEmptyConnection, makeDefaultConnections, CertificateParameters } from '../model/ConnectionOptions' +import { + ConnectionOptions, + createEmptyConnection, + makeDefaultConnections, + CertificateParameters, +} from '../model/ConnectionOptions' import { default as persistentStorage, StorageIdentifier } from '../utils/PersistentStorage' import { Dispatch } from 'redux' import { showError } from './Global' @@ -8,12 +13,11 @@ import { remote } from 'electron' import * as fs from 'fs' import * as path from 'path' -import { - ActionTypes, - Action, -} from '../reducers/ConnectionManager' +import { ActionTypes, Action } from '../reducers/ConnectionManager' -const storedConnectionsIdentifier: StorageIdentifier<{[s: string]: ConnectionOptions}> = { +const storedConnectionsIdentifier: StorageIdentifier<{ + [s: string]: ConnectionOptions +}> = { id: 'ConnectionManager_connections', } @@ -37,13 +41,18 @@ export const loadConnectionSettings = () => async (dispatch: Dispatch, getS } } -export const selectCertificate = (connectionId: string) => async (dispatch: Dispatch, getState: () => AppState) => { +export const selectCertificate = (connectionId: string) => async ( + dispatch: Dispatch, + getState: () => AppState +) => { try { const certificate = await openCertificate() console.log(certificate) - dispatch(updateConnection(connectionId, { - selfSignedCertificate: certificate, - })) + dispatch( + updateConnection(connectionId, { + selfSignedCertificate: certificate, + }) + ) } catch (error) { console.log(error) dispatch(showError(error)) @@ -57,30 +66,33 @@ async function openCertificate(): Promise { } return new Promise((resolve, reject) => { - remote.dialog.showOpenDialog({ properties: ['openFile'], securityScopedBookmarks: true }, (filePaths?: Array) => { - const selectedFile = filePaths && filePaths[0] - if (!selectedFile) { - reject(rejectReasons.noCertificateSelected) - return - } - - fs.readFile(selectedFile, (error, data) => { - if (error) { - reject(error) + remote.dialog.showOpenDialog( + { properties: ['openFile'], securityScopedBookmarks: true }, + (filePaths?: Array) => { + const selectedFile = filePaths && filePaths[0] + if (!selectedFile) { + reject(rejectReasons.noCertificateSelected) return } - if (data.length > 16_384 || data.length < 128) { - reject(rejectReasons.certificateSizeDoesNotMatch) - return - } + fs.readFile(selectedFile, (error, data) => { + if (error) { + reject(error) + return + } - resolve({ - data: data.toString('base64'), - name: path.basename(selectedFile), + if (data.length > 16_384 || data.length < 128) { + reject(rejectReasons.certificateSizeDoesNotMatch) + return + } + + resolve({ + data: data.toString('base64'), + name: path.basename(selectedFile), + }) }) - }) - }) + } + ) }) } @@ -117,7 +129,7 @@ export const createConnection = () => (dispatch: Dispatch) => { dispatch(selectConnection(newConnection.id)) } -export const setConnections = (connections: {[s: string]: ConnectionOptions}): Action => ({ +export const setConnections = (connections: { [s: string]: ConnectionOptions }): Action => ({ connections, type: ActionTypes.CONNECTION_MANAGER_SET_CONNECTIONS, }) @@ -132,7 +144,7 @@ export const addConnection = (connection: ConnectionOptions): Action => ({ type: ActionTypes.CONNECTION_MANAGER_ADD_CONNECTION, }) -export const toggleAdvancedSettings = (): Action => ({ +export const toggleAdvancedSettings = (): Action => ({ type: ActionTypes.CONNECTION_MANAGER_TOGGLE_ADVANCED_SETTINGS, }) diff --git a/app/src/actions/Publish.ts b/app/src/actions/Publish.ts index b432e62..47c6c99 100644 --- a/app/src/actions/Publish.ts +++ b/app/src/actions/Publish.ts @@ -32,7 +32,7 @@ export const setEditorMode = (editorMode: string): Action => { } } -export const publish = (connectionId: string) => (dispatch: Dispatch, getState: () => AppState) => { +export const publish = (connectionId: string) => (dispatch: Dispatch, getState: () => AppState) => { const state = getState() const topic = state.publish.topic diff --git a/app/src/actions/Settings.ts b/app/src/actions/Settings.ts index e1e7a99..915ef1f 100644 --- a/app/src/actions/Settings.ts +++ b/app/src/actions/Settings.ts @@ -7,11 +7,7 @@ import { Dispatch } from 'redux' import { showError } from './Global' import { showTree } from './Tree' import { TopicViewModel } from '../model/TopicViewModel' -import { - ActionTypes, - SettingsState, - TopicOrder, -} from '../reducers/Settings' +import { ActionTypes, SettingsState, TopicOrder } from '../reducers/Settings' import { Base64Message } from '../../../backend/src/Model/Base64Message' import { globalActions } from '.' @@ -21,7 +17,7 @@ const settingsIdentifier: StorageIdentifier> = { export const loadSettings = () => async (dispatch: Dispatch, getState: () => AppState) => { try { - const settings = await persistentStorage.load(settingsIdentifier) || {} + const settings = (await persistentStorage.load(settingsIdentifier)) || {} dispatch({ settings: getState().settings.merge(settings), type: ActionTypes.SETTINGS_DID_LOAD_SETTINGS, @@ -102,26 +98,34 @@ export const filterTopics = (filterStr: string) => (dispatch: Dispatch, get }) if (!filterStr || !tree) { - dispatch(batchActions([setAutoExpandLimit(0), (showTree(tree) as any)])) + dispatch(batchActions([setAutoExpandLimit(0), showTree(tree) as any])) return } const topicFilter = filterStr.toLowerCase() const nodeFilter = (node: q.TreeNode): boolean => { - const topicMatches = node.path().toLowerCase().indexOf(topicFilter) !== -1 + const topicMatches = + node + .path() + .toLowerCase() + .indexOf(topicFilter) !== -1 if (topicMatches) { return true } - const messageMatches = node.message - && node.message.value - && Base64Message.toUnicodeString(node.message.value).toLowerCase().indexOf(filterStr) !== -1 + const messageMatches = + node.message && + node.message.value && + Base64Message.toUnicodeString(node.message.value) + .toLowerCase() + .indexOf(filterStr) !== -1 return Boolean(messageMatches) } - const resultTree = tree.childTopics() + const resultTree = tree + .childTopics() .filter(nodeFilter) .map((node: q.TreeNode) => { const clone = node.unconnectedClone() @@ -138,7 +142,7 @@ export const filterTopics = (filterStr: string) => (dispatch: Dispatch, get nextTree.updateWithConnection(tree.updateSource, tree.connectionId, nodeFilter) } - dispatch(batchActions([setAutoExpandLimit(autoExpandLimitForTree(nextTree)), (showTree(nextTree) as any)])) + dispatch(batchActions([setAutoExpandLimit(autoExpandLimitForTree(nextTree)), showTree(nextTree) as any])) } function autoExpandLimitForTree(tree: q.Tree) { @@ -158,7 +162,10 @@ function autoExpandLimitForTree(tree: q.Tree) { export const toggleTheme = () => (dispatch: Dispatch, getState: () => AppState) => { dispatch({ - type: getState().settings.get('theme') === 'light' ? ActionTypes.SETTINGS_SET_THEME_DARK : ActionTypes.SETTINGS_SET_THEME_LIGHT, + type: + getState().settings.get('theme') === 'light' + ? ActionTypes.SETTINGS_SET_THEME_DARK + : ActionTypes.SETTINGS_SET_THEME_LIGHT, }) dispatch(storeSettings()) } diff --git a/app/src/actions/Sidebar.ts b/app/src/actions/Sidebar.ts index c790876..5bf0332 100644 --- a/app/src/actions/Sidebar.ts +++ b/app/src/actions/Sidebar.ts @@ -20,7 +20,10 @@ export const setCompareMessage = (message?: q.Message) => (dispatch: Dispatch, recursive: boolean, subtopicClearLimit = 50) => (dispatch: Dispatch, getState: () => AppState) => { +export const clearTopic = (topic: q.TreeNode, recursive: boolean, subtopicClearLimit = 50) => ( + dispatch: Dispatch, + getState: () => AppState +) => { const { connectionId } = getState().connection if (!connectionId) { return @@ -36,10 +39,11 @@ export const clearTopic = (topic: q.TreeNode, recursive: boolean, subtopicC rendererEvents.emit(publishEvent, mqttMessage) if (recursive) { - topic.childTopics() + topic + .childTopics() .filter(topic => Boolean(topic.message && topic.message.value)) .slice(0, subtopicClearLimit) - .forEach((topic) => { + .forEach(topic => { console.log('deleting', topic.path()) const mqttMessage = { topic: topic.path(), diff --git a/app/src/actions/Tree.ts b/app/src/actions/Tree.ts index 687f474..99072f3 100644 --- a/app/src/actions/Tree.ts +++ b/app/src/actions/Tree.ts @@ -9,49 +9,55 @@ import { TopicViewModel } from '../model/TopicViewModel' import { globalActions } from '.' const debounce = require('lodash.debounce') -export const selectTopic = (topic: q.TreeNode) => (dispatch: Dispatch, getState: () => AppState) => { +export const selectTopic = (topic: q.TreeNode) => ( + dispatch: Dispatch, + getState: () => AppState +) => { debouncedSelectTopic(topic, dispatch, getState) } -const debouncedSelectTopic = debounce((topic: q.TreeNode, dispatch: Dispatch, getState: () => AppState) => { - const previouslySelectedTopic = getState().tree.get('selectedTopic') +const debouncedSelectTopic = debounce( + (topic: q.TreeNode, dispatch: Dispatch, getState: () => AppState) => { + const previouslySelectedTopic = getState().tree.get('selectedTopic') - if (previouslySelectedTopic === topic) { - return - } + if (previouslySelectedTopic === topic) { + return + } - // Update publish topic - let setTopicDispatch: any | undefined - if (!getState().publish.topic) { - setTopicDispatch = setTopic(topic.path()) - } else if (previouslySelectedTopic && (previouslySelectedTopic.path() === getState().publish.topic)) { - setTopicDispatch = setTopic(topic.path()) - } + // Update publish topic + let setTopicDispatch: any | undefined + if (!getState().publish.topic) { + setTopicDispatch = setTopic(topic.path()) + } else if (previouslySelectedTopic && previouslySelectedTopic.path() === getState().publish.topic) { + setTopicDispatch = setTopic(topic.path()) + } - if (previouslySelectedTopic && previouslySelectedTopic.viewModel) { - previouslySelectedTopic.viewModel.setSelected(false) - } + if (previouslySelectedTopic && previouslySelectedTopic.viewModel) { + previouslySelectedTopic.viewModel.setSelected(false) + } - if (topic.viewModel) { - topic.viewModel.setSelected(true) - } + if (topic.viewModel) { + topic.viewModel.setSelected(true) + } - const selectTreeTopicDispatch = { - selectedTopic: topic, - type: ActionTypes.TREE_SELECT_TOPIC, - } + const selectTreeTopicDispatch = { + selectedTopic: topic, + type: ActionTypes.TREE_SELECT_TOPIC, + } - dispatch({ - type: SidebarActionTypes.SIDEBAR_SET_COMPARE_MESSAGE, - message: undefined, - }) + dispatch({ + type: SidebarActionTypes.SIDEBAR_SET_COMPARE_MESSAGE, + message: undefined, + }) - if (setTopicDispatch) { - dispatch(batchActions([selectTreeTopicDispatch, setTopicDispatch])) - } else { - dispatch(selectTreeTopicDispatch) - } -}, 70) + if (setTopicDispatch) { + dispatch(batchActions([selectTreeTopicDispatch, setTopicDispatch])) + } else { + dispatch(selectTreeTopicDispatch) + } + }, + 70 +) function destroyUnreferencedTree(state: AppState) { const visibleTree = state.tree.get('tree') @@ -73,7 +79,10 @@ export const resetStore = () => (dispatch: Dispatch, getState: () => AppSta }) } -export const showTree = (tree: q.Tree | undefined) => (dispatch: Dispatch, getState: () => AppState): AnyAction => { +export const showTree = (tree: q.Tree | undefined) => ( + dispatch: Dispatch, + getState: () => AppState +): AnyAction => { destroyUnreferencedTree(getState()) return dispatch({ diff --git a/app/src/actions/index.ts b/app/src/actions/index.ts index ef2c55b..8e9aef5 100644 --- a/app/src/actions/index.ts +++ b/app/src/actions/index.ts @@ -7,4 +7,13 @@ import * as sidebarActions from './Sidebar' import * as treeActions from './Tree' import * as updateNotifierActions from './UpdateNotifier' -export { settingsActions, treeActions, publishActions, updateNotifierActions, connectionActions, sidebarActions, connectionManagerActions, globalActions } +export { + settingsActions, + treeActions, + publishActions, + updateNotifierActions, + connectionActions, + sidebarActions, + connectionManagerActions, + globalActions, +} diff --git a/app/src/components/App.tsx b/app/src/components/App.tsx index 0cde894..09a0954 100644 --- a/app/src/components/App.tsx +++ b/app/src/components/App.tsx @@ -28,7 +28,7 @@ interface Props { class App extends React.PureComponent { constructor(props: any) { super(props) - this.state = { } + this.state = {} } private renderNotification() { @@ -41,7 +41,9 @@ class App extends React.PureComponent { { isError ? this.props.actions.showError(undefined) : this.props.actions.showNotification(undefined) }} + onClose={() => { + isError ? this.props.actions.showError(undefined) : this.props.actions.showNotification(undefined) + }} /> ) } @@ -65,7 +67,7 @@ class App extends React.PureComponent {
- {this.renderNotification()} + {this.renderNotification()}
}> @@ -75,7 +77,11 @@ class App extends React.PureComponent {
}> - + @@ -149,4 +155,9 @@ const mapStateToProps = (state: AppState) => { } } -export default withStyles(styles)(connect(mapStateToProps, mapDispatchToProps)(App)) +export default withStyles(styles)( + connect( + mapStateToProps, + mapDispatchToProps + )(App) +) diff --git a/app/src/components/ConnectionSetup/AddButton.tsx b/app/src/components/ConnectionSetup/AddButton.tsx index 7d6e18a..b9eb588 100644 --- a/app/src/components/ConnectionSetup/AddButton.tsx +++ b/app/src/components/ConnectionSetup/AddButton.tsx @@ -14,18 +14,9 @@ const styles = (theme: Theme) => ({ }, }) -export const AddButton = withStyles(styles)((props: { - classes: any, - action: any, -}) => { +export const AddButton = withStyles(styles)((props: { classes: any; action: any }) => { return ( - + ) diff --git a/app/src/components/ConnectionSetup/AdvancedConnectionSettings.tsx b/app/src/components/ConnectionSetup/AdvancedConnectionSettings.tsx index 8f0e812..cd451a1 100644 --- a/app/src/components/ConnectionSetup/AdvancedConnectionSettings.tsx +++ b/app/src/components/ConnectionSetup/AdvancedConnectionSettings.tsx @@ -56,8 +56,8 @@ class ConnectionSettings extends React.Component { {this.props.connection.selfSignedCertificate.name} - - + + ) } @@ -89,27 +89,26 @@ class ConnectionSettings extends React.Component { className={classes.fullWidth} label="Subscription" margin="normal" - onChange={(event: React.ChangeEvent) => this.setState({ subscription: event.target.value })} + onChange={(event: React.ChangeEvent) => + this.setState({ subscription: event.target.value }) + } /> - -
- {this.renderSubscriptions()} -
+ +
{this.renderSubscriptions()}
@@ -151,17 +150,15 @@ class ConnectionSettings extends React.Component { } } -const Subscription = (props: { - subscription: string, - deleteAction: any, -}) => { +const Subscription = (props: { subscription: string; deleteAction: any }) => { return ( - {props.subscription} + {props.subscription} + ) } @@ -199,4 +196,7 @@ const styles = (theme: Theme) => ({ }, }) -export default connect(undefined, mapDispatchToProps)(withStyles(styles)(ConnectionSettings)) +export default connect( + undefined, + mapDispatchToProps +)(withStyles(styles)(ConnectionSettings)) diff --git a/app/src/components/ConnectionSetup/ConnectionSettings.tsx b/app/src/components/ConnectionSetup/ConnectionSettings.tsx index 233e28f..e6d09c1 100644 --- a/app/src/components/ConnectionSetup/ConnectionSettings.tsx +++ b/app/src/components/ConnectionSetup/ConnectionSettings.tsx @@ -29,17 +29,14 @@ import ConnectionHealthIndicator from '../helper/ConnectionHealthIndicator' interface Props { connection: ConnectionOptions - classes: {[s: string]: string} - actions: typeof connectionActions, + classes: { [s: string]: string } + actions: typeof connectionActions managerActions: typeof connectionManagerActions connected: boolean connecting: boolean } -const protocols = [ - 'mqtt', - 'ws', -] +const protocols = ['mqtt', 'ws'] interface State { showPassword: boolean @@ -127,20 +124,12 @@ class ConnectionSettings extends React.Component { const { classes, connection } = this.props const certSwitch = ( - + ) return (
- +
) } @@ -154,21 +143,11 @@ class ConnectionSettings extends React.Component { private renderTlsSwitch() { const { classes, connection } = this.props - const tlsSwitch = ( - - ) + const tlsSwitch = return (
- +
) } @@ -185,12 +164,13 @@ class ConnectionSettings extends React.Component { if (this.props.connecting) { return ( ) } return ( - ) @@ -212,10 +192,7 @@ class ConnectionSettings extends React.Component { const passwordVisibilityButton = ( - + {this.state.showPassword ? : } @@ -287,15 +264,28 @@ class ConnectionSettings extends React.Component {
- -
-
- {this.renderConnectButton()} @@ -336,4 +326,7 @@ const styles = (theme: Theme) => ({ }, }) -export default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(ConnectionSettings)) +export default connect( + mapStateToProps, + mapDispatchToProps +)(withStyles(styles)(ConnectionSettings)) diff --git a/app/src/components/ConnectionSetup/ConnectionSetup.tsx b/app/src/components/ConnectionSetup/ConnectionSetup.tsx index 2d9eefe..77b88d1 100644 --- a/app/src/components/ConnectionSetup/ConnectionSetup.tsx +++ b/app/src/components/ConnectionSetup/ConnectionSetup.tsx @@ -7,13 +7,7 @@ import { connect } from 'react-redux' import { connectionManagerActions } from '../../actions' import { ConnectionOptions, toMqttConnection } from '../../model/ConnectionOptions' import { Theme, withStyles } from '@material-ui/core/styles' -import { - Modal, - Paper, - Toolbar, - Typography, - Collapse, -} from '@material-ui/core' +import { Modal, Paper, Toolbar, Typography, Collapse } from '@material-ui/core' import AdvancedConnectionSettings from './AdvancedConnectionSettings' interface Props { @@ -37,8 +31,12 @@ class ConnectionSetup extends React.Component { return (
- - + + + + + +
) } @@ -54,13 +52,15 @@ class ConnectionSetup extends React.Component {
-
+
+ +
- MQTT Connection - - {mqttConnection && mqttConnection.url} + + MQTT Connection + {mqttConnection && mqttConnection.url} {this.renderSettings()}
@@ -115,7 +115,9 @@ const mapStateToProps = (state: AppState) => { return { visible: !state.connection.connected, showAdvancedSettings: state.connectionManager.showAdvancedSettings, - connection: state.connectionManager.selected ? state.connectionManager.connections[state.connectionManager.selected] : undefined, + connection: state.connectionManager.selected + ? state.connectionManager.connections[state.connectionManager.selected] + : undefined, } } @@ -125,4 +127,7 @@ const mapDispatchToProps = (dispatch: any) => { } } -export default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(ConnectionSetup)) +export default connect( + mapStateToProps, + mapDispatchToProps +)(withStyles(styles)(ConnectionSetup)) diff --git a/app/src/components/ConnectionSetup/ProfileList.tsx b/app/src/components/ConnectionSetup/ProfileList.tsx index 422e861..5b2926a 100644 --- a/app/src/components/ConnectionSetup/ProfileList.tsx +++ b/app/src/components/ConnectionSetup/ProfileList.tsx @@ -6,17 +6,12 @@ import { connect } from 'react-redux' import { connectionManagerActions } from '../../actions' import { ConnectionOptions, toMqttConnection } from '../../model/ConnectionOptions' import { Theme, withStyles } from '@material-ui/core/styles' -import { - List, - ListItem, - ListSubheader, - Typography, -} from '@material-ui/core' +import { List, ListItem, ListSubheader, Typography } from '@material-ui/core' interface Props { classes: any selected?: string - connections: {[s: string]: ConnectionOptions} + connections: { [s: string]: ConnectionOptions } actions: any } @@ -26,7 +21,11 @@ class ProfileList extends React.Component { } private addConnectionButton() { - return + return ( + + + + ) } public render() { @@ -37,7 +36,13 @@ class ProfileList extends React.Component { subheader={{this.addConnectionButton()}Connections} >
- {Object.values(this.props.connections).map(connection => )} + {Object.values(this.props.connections).map(connection => ( + + ))}
) @@ -59,9 +64,9 @@ const mapDispatchToProps = (dispatch: any) => { } interface ConnectionItemProps { - connection: ConnectionOptions, - actions: any, - selected: boolean, + connection: ConnectionOptions + actions: any + selected: boolean classes: any } @@ -91,17 +96,16 @@ const connectionItemRenderer = withStyles(connectionItemStyle)((props: Connectio style={{ display: 'block' }} onClick={() => props.actions.selectConnection(props.connection.id)} > - - {props.connection.name || 'mqtt broker'} - - - {connection && connection.url} - + {props.connection.name || 'mqtt broker'} + {connection && connection.url} ) }) -const ConnectionItem = connect(null, mapDispatchToProps)(connectionItemRenderer) +const ConnectionItem = connect( + null, + mapDispatchToProps +)(connectionItemRenderer) const mapStateToProps = (state: AppState) => { return { @@ -110,4 +114,7 @@ const mapStateToProps = (state: AppState) => { } } -export default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(ProfileList)) +export default connect( + mapStateToProps, + mapDispatchToProps +)(withStyles(styles)(ProfileList)) diff --git a/app/src/components/Demo/Key.tsx b/app/src/components/Demo/Key.tsx index c484dc0..8fbd2c8 100644 --- a/app/src/components/Demo/Key.tsx +++ b/app/src/components/Demo/Key.tsx @@ -13,7 +13,6 @@ class Key extends React.Component { } public render() { - return (
{this.props.keyboardKey}
diff --git a/app/src/components/Demo/Mouse.tsx b/app/src/components/Demo/Mouse.tsx index 0e5ba04..6cbc2ec 100644 --- a/app/src/components/Demo/Mouse.tsx +++ b/app/src/components/Demo/Mouse.tsx @@ -4,13 +4,13 @@ const cursor = require('./cursor.png') interface State { enabled: boolean - target: {x: number, y: number} - position: {x: number, y: number} - stepSizeX: number, - stepSizeY: number, + target: { x: number; y: number } + position: { x: number; y: number } + stepSizeX: number + stepSizeY: number } -class Demo extends React.Component<{classes: any}, State> { +class Demo extends React.Component<{ classes: any }, State> { private timer: any private frameInterval = 20 @@ -32,8 +32,8 @@ class Demo extends React.Component<{classes: any}, State> { this.setState({ position: { - x: this.state.position.x + (dirX * steSizeX), - y: this.state.position.y + (dirY * steSizeY), + x: this.state.position.x + dirX * steSizeX, + y: this.state.position.y + dirY * steSizeY, }, }) @@ -43,10 +43,10 @@ class Demo extends React.Component<{classes: any}, State> { } public componentDidMount() { - (window as any).demo.enableMouse = () => { + ;(window as any).demo.enableMouse = () => { this.setState({ enabled: true }) } - (window as any).demo.moveMouse = (x: number, y: number, animationTime: number) => { + ;(window as any).demo.moveMouse = (x: number, y: number, animationTime: number) => { const stepSizeX = Math.abs(this.state.position.x - x) / (animationTime / this.frameInterval) const stepSizeY = Math.abs(this.state.position.y - y) / (animationTime / this.frameInterval) this.setState({ stepSizeX, stepSizeY, enabled: true, target: { x, y } }) @@ -64,9 +64,7 @@ class Demo extends React.Component<{classes: any}, State> { top: this.state.position.y + 2, } - return ( - - ) + return } } diff --git a/app/src/components/Demo/ShowText.tsx b/app/src/components/Demo/ShowText.tsx index 1f66281..c6d212e 100644 --- a/app/src/components/Demo/ShowText.tsx +++ b/app/src/components/Demo/ShowText.tsx @@ -8,7 +8,7 @@ interface State { location: string } -class Demo extends React.Component<{classes: any}, State> { +class Demo extends React.Component<{ classes: any }, State> { private timer: any constructor(props: any) { super(props) @@ -20,20 +20,24 @@ class Demo extends React.Component<{classes: any}, State> { } public componentDidMount() { - (window as any).demo.showMessage = (message: string, location: string, duration: number, keys: Array = []) => { + ;(window as any).demo.showMessage = ( + message: string, + location: string, + duration: number, + keys: Array = [] + ) => { this.clearTimer() this.setState({ message, location, keys }) this.timer = setTimeout(() => this.setState({ message: undefined }), duration) } - - (window as any).demo.hideMessage = () => { + ;(window as any).demo.hideMessage = () => { this.clearTimer() this.setState({ message: undefined }) } } public render() { - const positions: {[s: string]: number} = { + const positions: { [s: string]: number } = { top: 0, bottom: -65, middle: -32, @@ -52,7 +56,6 @@ class Demo extends React.Component<{classes: any}, State> { color: 'white', backgroundColor: 'rgba(0, 0, 0, 0.8)', borderRadius: '16px', - } if (!this.state.message) { @@ -61,7 +64,8 @@ class Demo extends React.Component<{classes: any}, State> { let keys: Array = [] if (this.state.keys.length > 0) { - keys = this.state.keys.map(key => []) + keys = this.state.keys + .map(key => []) .reduce((prev, current) => { return [prev, '+' as any, current] }) diff --git a/app/src/components/Demo/index.tsx b/app/src/components/Demo/index.tsx index 1a964f2..0032b5f 100644 --- a/app/src/components/Demo/index.tsx +++ b/app/src/components/Demo/index.tsx @@ -12,7 +12,7 @@ function writeHeapdump(path?: string) { return path } -(window as any).demo = { +;(window as any).demo = { writeHeapdump, } diff --git a/app/src/components/ErrorBoundary.tsx b/app/src/components/ErrorBoundary.tsx index f235aa6..dfb1591 100644 --- a/app/src/components/ErrorBoundary.tsx +++ b/app/src/components/ErrorBoundary.tsx @@ -4,13 +4,7 @@ import SentimentDissatisfied from '@material-ui/icons/SentimentDissatisfied' import Warning from '@material-ui/icons/Warning' import { electronRendererTelementry } from 'electron-telemetry' import { Theme, withStyles } from '@material-ui/core/styles' -import { - Button, - Modal, - Paper, - Toolbar, - Typography, -} from '@material-ui/core' +import { Button, Modal, Paper, Toolbar, Typography } from '@material-ui/core' interface State { error?: Error @@ -21,7 +15,6 @@ interface Props { } class ErrorBoundary extends React.Component { - public static getDerivedStateFromError(error: Error) { return { error } } @@ -54,23 +47,36 @@ class ErrorBoundary extends React.Component { - Oooooops! + + Oooooops! + - I hoped that you would never see this window, but MQTT-Explorer had an unexpected error. - + + I hoped that you would never see this window, but MQTT-Explorer had an unexpected error. + + + +
-            
-              {this.state.error.stack}
-            
+            {this.state.error.stack}
           
Please report this issue with a short description of what happened to -
https://github.com/thomasnordquist/MQTT-Explorer/issues + + {' '} + + https://github.com/thomasnordquist/MQTT-Explorer/issues + +
- - + +
diff --git a/app/src/components/Layout/ContentView.tsx b/app/src/components/Layout/ContentView.tsx index 85ecc88..03afed4 100644 --- a/app/src/components/Layout/ContentView.tsx +++ b/app/src/components/Layout/ContentView.tsx @@ -3,7 +3,7 @@ import ReactSplitPane from 'react-split-pane' import { Sidebar } from '../Sidebar' import Tree from '../Tree/Tree' -export default function ContentView(props: {heightProperty: any, paneDefaults: any, connectionId: any}) { +export default function ContentView(props: { heightProperty: any; paneDefaults: any; connectionId: any }) { return ( ({ interface Props { classes: any actions: { - tree: typeof treeActions, + tree: typeof treeActions } paused: boolean tree?: q.Tree } -class PauseButton extends React.Component { +class PauseButton extends React.Component { private timer?: any constructor(props: Props) { super(props) @@ -42,7 +42,8 @@ class PauseButton extends React.Component { return ( - {this.state.changes} changes
+ {this.state.changes} changes +
buffer at {Math.round(this.props.tree.unmergedChanges().fillState() * 10000) / 100}%
) @@ -66,12 +67,18 @@ class PauseButton extends React.Component { } public render() { - const message = this.props.paused ? 'Resumes updating the tree, after applying all recorded changes' : 'Stops all updates, records changes until the buffer is full.' + const message = this.props.paused + ? 'Resumes updating the tree, after applying all recorded changes' + : 'Stops all updates, records changes until the buffer is full.' return (
- {this.props.paused ? : } + {this.props.paused ? ( + + ) : ( + + )} {this.props.paused ? this.renderBufferStats() : null} @@ -95,4 +102,7 @@ const mapDispatchToProps = (dispatch: any) => { } } -export default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(PauseButton)) +export default connect( + mapStateToProps, + mapDispatchToProps +)(withStyles(styles)(PauseButton)) diff --git a/app/src/components/Layout/TitleBar.tsx b/app/src/components/Layout/TitleBar.tsx index 9762bad..ca7d758 100644 --- a/app/src/components/Layout/TitleBar.tsx +++ b/app/src/components/Layout/TitleBar.tsx @@ -11,14 +11,7 @@ import { connect } from 'react-redux' import { connectionActions, globalActions, settingsActions } from '../../actions' import { fade } from '@material-ui/core/styles/colorManipulator' import { Theme, withStyles } from '@material-ui/core/styles' -import { - AppBar, - Button, - IconButton, - InputBase, - Toolbar, - Typography, -} from '@material-ui/core' +import { AppBar, Button, IconButton, InputBase, Toolbar, Typography } from '@material-ui/core' const styles = (theme: Theme) => ({ title: { @@ -92,9 +85,9 @@ const styles = (theme: Theme) => ({ interface Props { classes: any actions: { - settings: typeof settingsActions, - connection: typeof connectionActions, - global: typeof globalActions, + settings: typeof settingsActions + connection: typeof connectionActions + global: typeof globalActions } topicFilter?: string } @@ -102,7 +95,7 @@ interface Props { class TitleBar extends React.Component { constructor(props: any) { super(props) - this.state = { } + this.state = {} } private renderSearch() { @@ -117,7 +110,11 @@ class TitleBar extends React.Component { value={topicFilter} onChange={this.onFilterChange} placeholder="Search…" - endAdornment={
} + endAdornment={ +
+ +
+ } classes={{ root: classes.inputRoot, input: classes.inputInput }} />
@@ -138,10 +135,17 @@ class TitleBar extends React.Component { return ( - + - MQTT Explorer + + MQTT Explorer + {this.renderSearch()}
+ ) } - private onChangeSorting = (e: React.ChangeEvent<{value: unknown}>) => { + private onChangeSorting = (e: React.ChangeEvent<{ value: unknown }>) => { this.props.actions.settings.setTopicOrder(e.target.value as TopicOrder) } public render() { const { classes, actions, visible } = this.props return ( - -
+ +
@@ -225,4 +255,9 @@ const mapDispatchToProps = (dispatch: any) => { } } -export default withStyles(styles)(connect(mapStateToProps, mapDispatchToProps)(Settings)) +export default withStyles(styles)( + connect( + mapStateToProps, + mapDispatchToProps + )(Settings) +) diff --git a/app/src/components/SettingsDrawer/TimeLocale.tsx b/app/src/components/SettingsDrawer/TimeLocale.tsx index c835ae2..c8087ba 100644 --- a/app/src/components/SettingsDrawer/TimeLocale.tsx +++ b/app/src/components/SettingsDrawer/TimeLocale.tsx @@ -3,14 +3,7 @@ import DateFormatter from '../helper/DateFormatter' import { AppState } from '../../reducers' import { bindActionCreators } from 'redux' import { connect } from 'react-redux' -import { - Input, - InputLabel, - MenuItem, - Select, - StyleRulesCallback, - Theme - } from '@material-ui/core' +import { Input, InputLabel, MenuItem, Select, StyleRulesCallback, Theme } from '@material-ui/core' import { settingsActions } from '../../actions' import { withStyles } from '@material-ui/styles' const moment = require('moment/min/moment-with-locales') @@ -18,7 +11,7 @@ const moment = require('moment/min/moment-with-locales') interface Props { actions: { settings: typeof settingsActions - }, + } timeLocale: string classes: any } @@ -29,26 +22,33 @@ function TimeLocaleSettings(props: Props) { const date = new Date() const localeMenuItems = locales.map((l: string) => ( -
Locale: {l}, Format:
+
+ Locale: {l}, Format:{' '} + + + +
)) - function updateLocale(e: React.ChangeEvent<{value: unknown}>) { + function updateLocale(e: React.ChangeEvent<{ value: unknown }>) { const locale = e.target.value ? String(e.target.value) : '' actions.settings.setTimeLocale(locale) } return (
- Time Locale + + Time Locale + } + name="time-locale" + className={classes.input} + renderValue={v => {String(v)}} + style={{ flex: '1' }} > {localeMenuItems} @@ -82,4 +82,9 @@ const styles = (theme: Theme) => ({ }, }) -export default withStyles(styles)(connect(mapStateToProps, mapDispatchToProps)(TimeLocaleSettings)) +export default withStyles(styles)( + connect( + mapStateToProps, + mapDispatchToProps + )(TimeLocaleSettings) +) diff --git a/app/src/components/Sidebar/CodeDiff/DiffCount.tsx b/app/src/components/Sidebar/CodeDiff/DiffCount.tsx index f15860f..0deb7f1 100644 --- a/app/src/components/Sidebar/CodeDiff/DiffCount.tsx +++ b/app/src/components/Sidebar/CodeDiff/DiffCount.tsx @@ -1,16 +1,18 @@ import * as React from 'react' -import { Theme } from '@material-ui/core'; +import { Theme } from '@material-ui/core' import { withStyles } from '@material-ui/styles' interface Props { changes: Array - classes: {[s: string]: any} + classes: { [s: string]: any } nameOfCompareMessage: string } function changeAmount(props: Props) { - const additions = props.changes.map(change => (change.added === true) ? (change.count || 0) : 0).reduce((a, b) => a + b) - const deletions = props.changes.map(change => (change.removed === true) ? (change.count || 0) : 0).reduce((a, b) => a + b) + const additions = props.changes.map(change => (change.added === true ? change.count || 0 : 0)).reduce((a, b) => a + b) + const deletions = props.changes + .map(change => (change.removed === true ? change.count || 0 : 0)) + .reduce((a, b) => a + b) if (additions === 0 && deletions === 0) { return null } @@ -19,9 +21,13 @@ function changeAmount(props: Props) { Comparing with {props.nameOfCompareMessage} message:  - - + {additions} line{additions === 1 ? '' : 's'} - , - {deletions} line{deletions === 1 ? '' : 's'} + + + {additions} line{additions === 1 ? '' : 's'} + + ,{' '} + + - {deletions} line{deletions === 1 ? '' : 's'} + ) diff --git a/app/src/components/Sidebar/CodeDiff/Gutters.tsx b/app/src/components/Sidebar/CodeDiff/Gutters.tsx index 5112e0f..e74ff6e 100644 --- a/app/src/components/Sidebar/CodeDiff/Gutters.tsx +++ b/app/src/components/Sidebar/CodeDiff/Gutters.tsx @@ -5,19 +5,13 @@ import Add from '@material-ui/icons/Add' import Remove from '@material-ui/icons/Remove' import ShowChart from '@material-ui/icons/ShowChart' import TopicPlot from '../TopicPlot' -import { - Fade, - Paper, - Popper, - Theme, - Tooltip - } from '@material-ui/core' +import { Fade, Paper, Popper, Theme, Tooltip } from '@material-ui/core' import { JsonPropertyLocation } from '../../../../../backend/src/JsonAstParser' import { lineChangeStyle, trimNewlineRight } from './util' import { withStyles } from '@material-ui/styles' interface Props { - changes: Array, + changes: Array literalPositions: Array classes: any className: string @@ -58,32 +52,32 @@ const style = (theme: Theme) => { } } -function ChartIcon(props: { messageHistory: q.MessageHistory, classes: any, literal: JsonPropertyLocation }) { +function ChartIcon(props: { messageHistory: q.MessageHistory; classes: any; literal: JsonPropertyLocation }) { const chartIconRef = React.useRef(null) const [open, setOpen] = React.useState(false) - const mouseOver = React.useCallback((event: React.MouseEvent) => { - setOpen(true) - }, [props.literal.path]) + const mouseOver = React.useCallback( + (event: React.MouseEvent) => { + setOpen(true) + }, + [props.literal.path] + ) const mouseOut = React.useCallback(() => { setOpen(false) }, []) - return ( - - - - - {open ? : } - - - - + return ( + + + + + + {open ? : } + + + + ) } @@ -95,9 +89,19 @@ function tokensForLine(change: diff.Change, line: number, props: Props) { let chartIcon = null if (literal) { if (hasEnoughDataToDisplayDiagrams) { - chartIcon = + chartIcon = ( + + ) } else { - chartIcon = + chartIcon = ( + + + + ) } } @@ -106,28 +110,39 @@ function tokensForLine(change: diff.Change, line: number, props: Props) { } else if (change.removed) { return [] } else { - return [chartIcon,
] + return [ + chartIcon, +
, + ] } } function Gutters(props: Props) { let currentLine = -1 - const gutters = props.changes.map((change, key) => { - return trimNewlineRight(change.value) - .split('\n') - .map((_, idx) => { - currentLine = !change.removed ? currentLine + 1 : currentLine - return ( -
- {tokensForLine(change, currentLine, props)} -
- ) + const gutters = props.changes + .map((change, key) => { + return trimNewlineRight(change.value) + .split('\n') + .map((_, idx) => { + currentLine = !change.removed ? currentLine + 1 : currentLine + return ( +
+ {tokensForLine(change, currentLine, props)} +
+ ) + }) }) - }).reduce((a, b) => a.concat(b), []) + .reduce((a, b) => a.concat(b), []) - return -
{gutters}
-
+ return ( + +
{gutters}
+
+ ) } export default withStyles(style)(Gutters) diff --git a/app/src/components/Sidebar/CodeDiff/index.tsx b/app/src/components/Sidebar/CodeDiff/index.tsx index fd44c0a..1899df3 100644 --- a/app/src/components/Sidebar/CodeDiff/index.tsx +++ b/app/src/components/Sidebar/CodeDiff/index.tsx @@ -40,35 +40,46 @@ class CodeDiff extends React.Component { } private plottableLiteralsIndexedWithLineNumbers() { - const allLiterals = this.isValidJson(this.props.current) ? (literalsMappedByLines(this.props.current) || []) : [] + const allLiterals = this.isValidJson(this.props.current) ? literalsMappedByLines(this.props.current) || [] : [] - return allLiterals - .map((l: JsonPropertyLocation) => isPlottable(l.value) ? l : undefined) as Array + return allLiterals.map((l: JsonPropertyLocation) => (isPlottable(l.value) ? l : undefined)) as Array< + JsonPropertyLocation + > } private renderStyledCodeLines(changes: Array) { const styledLines = Prism.highlight(this.props.current, Prism.languages.json, 'json').split('\n') let lineNumber = 0 - return changes.map((change, key) => { - const hasStyledCode = change.removed !== true - const changedLines = change.count || 0 - if (hasStyledCode && this.props.language === 'json') { - const currentLines = styledLines.slice(lineNumber, lineNumber + changedLines) - const lines = currentLines.map((html: string, idx: number) => { - return
- }) - lineNumber += changedLines + return changes + .map((change, key) => { + const hasStyledCode = change.removed !== true + const changedLines = change.count || 0 + if (hasStyledCode && this.props.language === 'json') { + const currentLines = styledLines.slice(lineNumber, lineNumber + changedLines) + const lines = currentLines.map((html: string, idx: number) => { + return ( +
+ +
+ ) + }) + lineNumber += changedLines - return [
{lines}
] - } + return [
{lines}
] + } - return trimNewlineRight(change.value) - .split('\n') - .map((line, idx) => { - return
{line}
- }) - }).reduce((a, b) => a.concat(b), []) + return trimNewlineRight(change.value) + .split('\n') + .map((line, idx) => { + return ( +
+ {line} +
+ ) + }) + }) + .reduce((a, b) => a.concat(b), []) } public render() { @@ -83,7 +94,8 @@ class CodeDiff extends React.Component { className={this.props.classes.gutters} changes={changes} messageHistory={this.props.messageHistory} - literalPositions={literalPositions} /> + literalPositions={literalPositions} + />
{code}
diff --git a/app/src/components/Sidebar/HistoryDrawer.tsx b/app/src/components/Sidebar/HistoryDrawer.tsx index 64b0e6c..ccbb474 100644 --- a/app/src/components/Sidebar/HistoryDrawer.tsx +++ b/app/src/components/Sidebar/HistoryDrawer.tsx @@ -38,7 +38,9 @@ class HistoryDrawer extends React.Component { public renderHistory() { const style = (element: HistoryItem) => ({ - backgroundColor: element.selected ? this.props.theme.palette.action.selected : this.props.theme.palette.action.hover, + backgroundColor: element.selected + ? this.props.theme.palette.action.selected + : this.props.theme.palette.action.hover, margin: '8px', padding: '8px 8px 0 8px', cursor: this.props.onClick ? 'pointer' : 'inherit', @@ -50,11 +52,16 @@ class HistoryDrawer extends React.Component { key={element.key} style={style(element)} onClick={(event: React.MouseEvent) => this.props.onClick && this.props.onClick(index, event.target)} - tabIndex={0} onKeyDown={this.handleCtrlA} + tabIndex={0} + onKeyDown={this.handleCtrlA} > -
{element.title}
+
+ {element.title} +
-
{element.value}
+ +
{element.value}
+
)) @@ -63,11 +70,7 @@ class HistoryDrawer extends React.Component { return (
- + {
{this.state.collapsed ? this.props.contentTypeIndicator : null}
-
+
{this.state.collapsed ? null : this.props.children} {this.state.collapsed ? null : elements}
@@ -87,13 +90,7 @@ class HistoryDrawer extends React.Component { } public render() { - return ( -
- {this.renderHistory()} -
- ) + return
{this.renderHistory()}
} } diff --git a/app/src/components/Sidebar/PlotHistory.tsx b/app/src/components/Sidebar/PlotHistory.tsx index 8ef3306..3428f33 100644 --- a/app/src/components/Sidebar/PlotHistory.tsx +++ b/app/src/components/Sidebar/PlotHistory.tsx @@ -7,7 +7,7 @@ const { XYPlot, LineMarkSeries, Hint, XAxis, YAxis, HorizontalGridLines } = requ const abbreviate = require('number-abbreviate') interface Props { - data: Array<{x: number, y: number}> + data: Array<{ x: number; y: number }> } // const configuredCurve = d3Shape.curveBundle.beta(1) @@ -51,10 +51,7 @@ class PlotHistory extends React.Component { - abbreviate(num)} - /> + abbreviate(num)} /> { - private editorOptions = { showLineNumbers: false, tabSize: 2, @@ -108,18 +107,18 @@ class Publish extends React.Component { return (
- Topic - } - endAdornment={} - onBlur={this.onTopicBlur} - onChange={this.updateTopic} - multiline={true} - placeholder="example/topic" - /> - + Topic + } + endAdornment={} + onBlur={this.onTopicBlur} + onChange={this.updateTopic} + multiline={true} + placeholder="example/topic" + /> +
) } @@ -132,13 +131,7 @@ class Publish extends React.Component { private publishButton() { return ( - ) @@ -162,7 +155,11 @@ class Publish extends React.Component { return ( - + @@ -175,9 +172,7 @@ class Publish extends React.Component {
{this.renderEditorModeSelection()} {this.renderFormatJson()} -
- {this.publishButton()} -
+
{this.publishButton()}
) @@ -239,30 +234,36 @@ class Publish extends React.Component { onChange={this.onChangeQoS} > -
0
+ +
0
+
-
1
+ +
1
+
-
2
+ +
2
+
) return (
- - + + } + control={ + + } label="retain" labelPlacement="end" /> @@ -343,4 +344,7 @@ const mapStateToProps = (state: AppState) => { } } -export default connect(mapStateToProps, mapDispatchToProps)(withTheme(Publish)) +export default connect( + mapStateToProps, + mapDispatchToProps +)(withTheme(Publish)) diff --git a/app/src/components/Sidebar/Sidebar.tsx b/app/src/components/Sidebar/Sidebar.tsx index 5b0da3e..0f87c75 100644 --- a/app/src/components/Sidebar/Sidebar.tsx +++ b/app/src/components/Sidebar/Sidebar.tsx @@ -14,13 +14,7 @@ import { settingsActions, sidebarActions } from '../../actions' import { Theme, withStyles } from '@material-ui/core/styles' import { TopicViewModel } from '../../model/TopicViewModel' -import { - ExpansionPanel, - ExpansionPanelDetails, - ExpansionPanelSummary, - Typography, - Badge, -} from '@material-ui/core' +import { ExpansionPanel, ExpansionPanelDetails, ExpansionPanelSummary, Typography, Badge } from '@material-ui/core' const throttle = require('lodash.throttle') @@ -76,7 +70,7 @@ class Sidebar extends React.Component { private renderRecursiveTopicDeleteButton() { const deleteLimit = 50 const topicCount = this.props.node ? this.props.node.childTopicCount() : 0 - if ((!this.props.node || topicCount === 0) || (this.props.node.message && topicCount === 1)) { + if (!this.props.node || topicCount === 0 || (this.props.node.message && topicCount === 1)) { return null } @@ -86,7 +80,10 @@ class Sidebar extends React.Component { badgeContent={{topicCount >= deleteLimit ? '50+' : topicCount}} color="secondary" > - this.deleteTopic(this.props.node, true, deleteLimit)} tooltip={`Deletes up to ${deleteLimit} sub-topics with a single click`}> + this.deleteTopic(this.props.node, true, deleteLimit)} + tooltip={`Deletes up to ${deleteLimit} sub-topics with a single click`} + > @@ -112,7 +109,9 @@ class Sidebar extends React.Component {
} style={summaryStyle}> - Topic {copyTopic} {deleteTopic} {deleteRecursiveTopic} + + Topic {copyTopic} {deleteTopic} {deleteRecursiveTopic} + @@ -204,4 +203,9 @@ const styles = (theme: Theme) => ({ }, }) -export default withStyles(styles)(connect(mapStateToProps, mapDispatchToProps)(Sidebar)) +export default withStyles(styles)( + connect( + mapStateToProps, + mapDispatchToProps + )(Sidebar) +) diff --git a/app/src/components/Sidebar/Topic.tsx b/app/src/components/Sidebar/Topic.tsx index a73399d..1b26a8c 100644 --- a/app/src/components/Sidebar/Topic.tsx +++ b/app/src/components/Sidebar/Topic.tsx @@ -32,30 +32,29 @@ class Topic extends React.Component { } let key = 0 - const breadCrumps = node.branch() + const breadCrumps = node + .branch() .map(node => node.sourceEdge) .filter(edge => Boolean(edge)) - .map(edge => - [( - - )] - ) + .map(edge => [ + , + ]) if (breadCrumps.length === 0) { return null } const joinedBreadCrumps = breadCrumps.reduce((prev, current) => - prev.concat([ / ]).concat(current) + prev.concat([ / ]).concat(current) ) return {joinedBreadCrumps} @@ -68,4 +67,7 @@ const mapDispatchToProps = (dispatch: any) => { } } -export default connect(null, mapDispatchToProps)(withStyles(styles, { withTheme: true })(Topic)) +export default connect( + null, + mapDispatchToProps +)(withStyles(styles, { withTheme: true })(Topic)) diff --git a/app/src/components/Sidebar/TopicPlot.tsx b/app/src/components/Sidebar/TopicPlot.tsx index 47b8c86..21b4d11 100644 --- a/app/src/components/Sidebar/TopicPlot.tsx +++ b/app/src/components/Sidebar/TopicPlot.tsx @@ -16,7 +16,8 @@ function nodeToHistory(history: q.MessageHistory) { .map((message: q.Message) => { const value = message.value ? toPlottableValue(Base64Message.toUnicodeString(message.value)) : NaN return { x: message.received.getTime(), y: toPlottableValue(value) } - }).filter(data => !isNaN(data.y as any)) as any + }) + .filter(data => !isNaN(data.y as any)) as any } function nodeDotPathToHistory(history: q.MessageHistory, dotPath: string) { @@ -31,7 +32,8 @@ function nodeDotPathToHistory(history: q.MessageHistory, dotPath: string) { let value = dotProp.get(json, dotPath) return { x: message.received.getTime(), y: toPlottableValue(value) } - }).filter(data => !isNaN(data.y as any)) as any + }) + .filter(data => !isNaN(data.y as any)) as any } function render(props: Props) { diff --git a/app/src/components/Sidebar/ValueRenderer/MessageHistory.tsx b/app/src/components/Sidebar/ValueRenderer/MessageHistory.tsx index 551f189..799d5bb 100644 --- a/app/src/components/Sidebar/ValueRenderer/MessageHistory.tsx +++ b/app/src/components/Sidebar/ValueRenderer/MessageHistory.tsx @@ -18,7 +18,7 @@ interface Props { } interface State { - displayMessage?: q.Message, + displayMessage?: q.Message anchorEl?: HTMLElement } @@ -65,18 +65,28 @@ class MessageHistory extends React.Component { const element = { value, key: `${message.messageNumber}-${message.received}`, - title: ( - - {previousMessage ? (-) : null} -
-
), + title: ( + + + {previousMessage ? ( + + (- + ) + + ) : null} +
+ +
+
+ ), selected: message && message === this.props.selected, } previousMessage = message return element }) - const isMessagePlottable = node.message && node.message.value && isPlottable(Base64Message.toUnicodeString(node.message.value)) + const isMessagePlottable = + node.message && node.message.value && isPlottable(Base64Message.toUnicodeString(node.message.value)) return (
{ constructor(props: Props) { super(props) - this.state = { } + this.state = {} } private renderValue() { @@ -84,9 +84,7 @@ class ValuePanel extends React.Component { return (
{this.renderActionButtons()} -
- {this.props.node.mqttMessage.retain ? retainedButton : null} -
+
{this.props.node.mqttMessage.retain ? retainedButton : null}
{this.messageMetaInfo()}
) @@ -100,7 +98,11 @@ class ValuePanel extends React.Component { return ( QoS: {this.props.node.mqttMessage.qos} - + + + + + ) } @@ -114,15 +116,24 @@ class ValuePanel extends React.Component { } return ( - + - + + + - + + + @@ -148,7 +159,10 @@ class ValuePanel extends React.Component { const { node, classes } = this.props const { detailsStyle, summaryStyle } = this.panelStyle() - const copyValue = (node && node.message && node.message.value) ? : null + const copyValue = + node && node.message && node.message.value ? ( + + ) : null return ( @@ -158,11 +172,15 @@ class ValuePanel extends React.Component { {this.renderViewOptions()}
- Loading...
}> - {this.renderValue()} - + Loading...
}>{this.renderValue()} +
+
+
-
) @@ -197,4 +215,7 @@ const styles = (theme: Theme) => ({ }, }) -export default connect(mapStateToProps, mapDispatchToProps)(withStyles(styles)(ValuePanel)) +export default connect( + mapStateToProps, + mapDispatchToProps +)(withStyles(styles)(ValuePanel)) diff --git a/app/src/components/Tree/Tree.tsx b/app/src/components/Tree/Tree.tsx index 509b726..0878a16 100644 --- a/app/src/components/Tree/Tree.tsx +++ b/app/src/components/Tree/Tree.tsx @@ -77,18 +77,24 @@ class TreeComponent extends React.PureComponent { const timeUntilNextUpdate = updateInterval - (performance.now() - this.renderTime) this.updateTimer = setTimeout(() => { - window.requestIdleCallback(() => { - this.updateTimer && clearTimeout(this.updateTimer) - this.updateTimer = undefined - this.renderTime = performance.now() + window.requestIdleCallback( + () => { + this.updateTimer && clearTimeout(this.updateTimer) + this.updateTimer = undefined + this.renderTime = performance.now() - if (!this.props.paused) { - this.props.tree && this.props.tree.applyUnmergedChanges() - } - window.requestIdleCallback(() => { - this.setState({ lastUpdate: this.renderTime }) - }, { timeout: 100 }) - }, { timeout: 500 }) + if (!this.props.paused) { + this.props.tree && this.props.tree.applyUnmergedChanges() + } + window.requestIdleCallback( + () => { + this.setState({ lastUpdate: this.renderTime }) + }, + { timeout: 100 } + ) + }, + { timeout: 500 } + ) }, Math.max(0, timeUntilNextUpdate)) } @@ -137,4 +143,7 @@ const mapDispatchToProps = (dispatch: any) => { } } -export default connect(mapStateToProps, mapDispatchToProps)(TreeComponent) +export default connect( + mapStateToProps, + mapDispatchToProps +)(TreeComponent) diff --git a/app/src/components/Tree/TreeNode.tsx b/app/src/components/Tree/TreeNode.tsx index 6ca1952..ae0ab47 100644 --- a/app/src/components/Tree/TreeNode.tsx +++ b/app/src/components/Tree/TreeNode.tsx @@ -107,9 +107,11 @@ class TreeNodeComponent extends React.Component { } private stateHasChanged(newState: State) { - return this.state.collapsedOverride !== newState.collapsedOverride - || this.state.mouseOver !== newState.mouseOver - || this.state.selected !== newState.selected + return ( + this.state.collapsedOverride !== newState.collapsedOverride || + this.state.mouseOver !== newState.mouseOver || + this.state.selected !== newState.selected + ) } private toggle() { @@ -137,7 +139,12 @@ class TreeNodeComponent extends React.Component { private mouseOver = (event: React.MouseEvent) => { event.stopPropagation() this.setHover(true) - if (this.props.settings.get('selectTopicWithMouseOver') && this.props.treeNode && this.props.treeNode.message && this.props.treeNode.message.value) { + if ( + this.props.settings.get('selectTopicWithMouseOver') && + this.props.treeNode && + this.props.treeNode.message && + this.props.treeNode.message.value + ) { this.props.didSelectTopic(this.props.treeNode) } } @@ -181,11 +188,13 @@ class TreeNodeComponent extends React.Component { public shouldComponentUpdate(nextProps: Props, nextState: State) { const shouldRenderToRemoveCssAnimation = this.cssAnimationWasSetAt !== undefined - return this.stateHasChanged(nextState) - || this.props.settings !== nextProps.settings - || (this.props.lastUpdate !== nextProps.lastUpdate) - || this.animationDirty - || shouldRenderToRemoveCssAnimation + return ( + this.stateHasChanged(nextState) || + this.props.settings !== nextProps.settings || + this.props.lastUpdate !== nextProps.lastUpdate || + this.animationDirty || + shouldRenderToRemoveCssAnimation + ) } public componentDidUpdate() { @@ -204,12 +213,19 @@ class TreeNodeComponent extends React.Component { public render() { const { classes } = this.props - const shouldStartAnimation = (!this.animationDirty) && !this.props.isRoot && this.props.settings.get('highlightTopicUpdates') + const shouldStartAnimation = + !this.animationDirty && !this.props.isRoot && this.props.settings.get('highlightTopicUpdates') const animationName = this.props.theme.palette.type === 'light' ? 'updateLight' : 'updateDark' - const animation = shouldStartAnimation ? { willChange: 'auto', translateZ: 0, animation: `${animationName} 0.5s` } : {} + const animation = shouldStartAnimation + ? { willChange: 'auto', translateZ: 0, animation: `${animationName} 0.5s` } + : {} this.animationDirty = shouldStartAnimation - const highlightClass = this.state.selected ? this.props.classes.selected : (this.state.mouseOver ? this.props.classes.hover : '') + const highlightClass = this.state.selected + ? this.props.classes.selected + : this.state.mouseOver + ? this.props.classes.hover + : '' return (
diff --git a/app/src/components/Tree/TreeNodeSubnodes.tsx b/app/src/components/Tree/TreeNodeSubnodes.tsx index aa03524..ccbf86d 100644 --- a/app/src/components/Tree/TreeNodeSubnodes.tsx +++ b/app/src/components/Tree/TreeNodeSubnodes.tsx @@ -49,13 +49,16 @@ class TreeNodeSubnodes extends React.Component { } private renderMore() { - this.renderMoreAnimationFrame = (window as any).requestIdleCallback(() => { - this.setState({ ...this.state, alreadyAdded: this.state.alreadyAdded * 1.5 }) - }, { timeout: 500 }) + this.renderMoreAnimationFrame = (window as any).requestIdleCallback( + () => { + this.setState({ ...this.state, alreadyAdded: this.state.alreadyAdded * 1.5 }) + }, + { timeout: 500 } + ) } public componentWillUnmount() { - (window as any).cancelIdleCallback(this.renderMoreAnimationFrame) + ;(window as any).cancelIdleCallback(this.renderMoreAnimationFrame) } public render() { @@ -69,7 +72,7 @@ class TreeNodeSubnodes extends React.Component { } const nodes = this.sortedNodes().slice(0, this.state.alreadyAdded) - const listItems = nodes.map((node) => { + const listItems = nodes.map(node => { return ( { ) }) - return ( - - {listItems} - - ) + return {listItems} } } diff --git a/app/src/components/Tree/TreeNodeTitle.tsx b/app/src/components/Tree/TreeNodeTitle.tsx index 16a38fd..04114a1 100644 --- a/app/src/components/Tree/TreeNodeTitle.tsx +++ b/app/src/components/Tree/TreeNodeTitle.tsx @@ -14,17 +14,25 @@ export interface TreeNodeProps extends React.HTMLAttributes { } class TreeNodeTitle extends React.Component { - private renderSourceEdge() { const name = this.props.name || (this.props.treeNode.sourceEdge && this.props.treeNode.sourceEdge.name) - return {name} + return ( + + {name} + + ) } private renderValue() { - return this.props.treeNode.message && this.props.treeNode.message.value && this.props.treeNode.message.length > 0 - ? = {Base64Message.toUnicodeString(this.props.treeNode.message.value).slice(0, 120)} - : null + return this.props.treeNode.message && + this.props.treeNode.message.value && + this.props.treeNode.message.length > 0 ? ( + + {' '} + = {Base64Message.toUnicodeString(this.props.treeNode.message.value).slice(0, 120)} + + ) : null } private renderExpander() { @@ -32,7 +40,11 @@ class TreeNodeTitle extends React.Component { return null } - return {this.props.collapsed ? '▶' : '▼'} + return ( + + {this.props.collapsed ? '▶' : '▼'} + + ) } private renderMetadata() { @@ -41,16 +53,16 @@ class TreeNodeTitle extends React.Component { } const messages = this.props.treeNode.leafMessageCount() - return {`(${this.props.treeNode.childTopicCount()} topics, ${messages} messages)`} + return ( + {`(${this.props.treeNode.childTopicCount()} topics, ${messages} messages)`} + ) } public render() { - return ([ - this.renderExpander(), - this.renderSourceEdge(), - this.renderMetadata(), - this.renderValue(), - ]) + return [this.renderExpander(), this.renderSourceEdge(), this.renderMetadata(), this.renderValue()] } } diff --git a/app/src/components/UpdateNotifier.tsx b/app/src/components/UpdateNotifier.tsx index dfcac34..481c879 100644 --- a/app/src/components/UpdateNotifier.tsx +++ b/app/src/components/UpdateNotifier.tsx @@ -12,15 +12,7 @@ import { green } from '@material-ui/core/colors' import { Theme, withStyles } from '@material-ui/core/styles' import { updateNotifierActions } from '../actions' -import { - Button, - IconButton, - Modal, - Paper, - Snackbar, - SnackbarContent, - Typography, -} from '@material-ui/core' +import { Button, IconButton, Modal, Paper, Snackbar, SnackbarContent, Typography } from '@material-ui/core' interface Props { showUpdateNotification: boolean @@ -30,7 +22,7 @@ interface Props { } interface GithubRelease { - url: string, + url: string assets?: Array published_at: string // "2019-01-25T20:14:39Z" body_html: string @@ -59,7 +51,7 @@ class UpdateNotifier extends React.Component { this.state = { newerVersions: [] } const ownVersion = electron.remote.app.getVersion() - this.fetchReleases().then((releases) => { + this.fetchReleases().then(releases => { const newerVersions = releases .filter(release => this.allowPrereleaseIfOwnVersionIsBeta(release, ownVersion)) .filter(release => compareVersions(release.tag_name, ownVersion) > 0) @@ -131,21 +123,19 @@ class UpdateNotifier extends React.Component { } private notificationActions() { - return [( - - ), ( - - - - ), + return [ + , + + + , ] } @@ -159,23 +149,20 @@ class UpdateNotifier extends React.Component { .join('
') return ( - + - Version {latestUpdate.tag_name} + + Version {latestUpdate.tag_name} + Changelog
{this.renderDownloads()} - - + ) @@ -208,18 +195,14 @@ class UpdateNotifier extends React.Component { return null } - return latestUpdate.assets - .filter(this.assetForCurrentPlatform) - .map(asset => ( -
- -
- )) + return latestUpdate.assets.filter(this.assetForCurrentPlatform).map(asset => ( +
+ +
+ )) } public render() { @@ -283,4 +266,9 @@ const mapDispatchToProps = (dispatch: any) => { } } -export default withStyles(styles)(connect(mapStateToProps, mapDispatchToProps)(UpdateNotifier)) +export default withStyles(styles)( + connect( + mapStateToProps, + mapDispatchToProps + )(UpdateNotifier) +) diff --git a/app/src/components/helper/ConnectionHealthIndicator.tsx b/app/src/components/helper/ConnectionHealthIndicator.tsx index 96b6263..6ba0972 100644 --- a/app/src/components/helper/ConnectionHealthIndicator.tsx +++ b/app/src/components/helper/ConnectionHealthIndicator.tsx @@ -18,7 +18,10 @@ const styles = (theme: Theme) => ({ color: orange[600], }, icon: { - boxShadow: theme.shadows[2].split('),').map(s => `inset ${s}`).join('),'), + boxShadow: theme.shadows[2] + .split('),') + .map(s => `inset ${s}`) + .join('),'), padding: '6px', borderRadius: '50%', backgroundColor: '#eee', diff --git a/app/src/components/helper/Copy.tsx b/app/src/components/helper/Copy.tsx index f29b3ff..260dae0 100644 --- a/app/src/components/helper/Copy.tsx +++ b/app/src/components/helper/Copy.tsx @@ -37,9 +37,11 @@ class Copy extends React.Component { } public render() { - const icon = !this.state.didCopy - ? - : + const icon = !this.state.didCopy ? ( + + ) : ( + + ) return ( @@ -61,4 +63,7 @@ const mapDispatchToProps = (dispatch: any) => { } } -export default connect(undefined, mapDispatchToProps)(Copy) +export default connect( + undefined, + mapDispatchToProps +)(Copy) diff --git a/app/src/components/helper/DateFormatter.tsx b/app/src/components/helper/DateFormatter.tsx index a0c29f8..fb9629d 100644 --- a/app/src/components/helper/DateFormatter.tsx +++ b/app/src/components/helper/DateFormatter.tsx @@ -28,7 +28,9 @@ class DateFormatter extends React.Component { } private localizedDate(locale: string) { - return moment(this.props.date).locale(locale).format('L LTS') + return moment(this.props.date) + .locale(locale) + .format('L LTS') } private unitForInterval(milliseconds: number) { diff --git a/app/src/components/helper/isElementInViewport.ts b/app/src/components/helper/isElementInViewport.ts index 598d6c6..92d18f7 100644 --- a/app/src/components/helper/isElementInViewport.ts +++ b/app/src/components/helper/isElementInViewport.ts @@ -6,7 +6,7 @@ export function isElementInViewport(el: any) { return ( rect.top >= 0 && rect.left >= 0 && - rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */ + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) /*or $(window).height() */ && rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */ ) } diff --git a/app/src/index.tsx b/app/src/index.tsx index 9772a28..ffe6a47 100644 --- a/app/src/index.tsx +++ b/app/src/index.tsx @@ -12,17 +12,9 @@ import './utils/tracking' import { themes } from './theme' const composeEnhancers = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose -const store = createStore( - reducers, - composeEnhancers( - applyMiddleware( - reduxThunk, - batchDispatchMiddleware - ) - ) -) +const store = createStore(reducers, composeEnhancers(applyMiddleware(reduxThunk, batchDispatchMiddleware))) -function ApplicationRenderer(props: {theme: 'light' | 'dark'}) { +function ApplicationRenderer(props: { theme: 'light' | 'dark' }) { return ( diff --git a/app/src/model/LegacyConnectionSettings.ts b/app/src/model/LegacyConnectionSettings.ts index ad2b376..8804388 100644 --- a/app/src/model/LegacyConnectionSettings.ts +++ b/app/src/model/LegacyConnectionSettings.ts @@ -17,7 +17,7 @@ export function clearLegacyConnectionOptions() { window.localStorage.setItem('connectionSettings', '') } -export function loadLegacyConnectionOptions(): {[s: string]: ConnectionOptions} | {} { +export function loadLegacyConnectionOptions(): { [s: string]: ConnectionOptions } | {} { const legacySettingsString = window.localStorage.getItem('connectionSettings') if (!legacySettingsString) { return {} @@ -30,7 +30,7 @@ export function loadLegacyConnectionOptions(): {[s: string]: ConnectionOptions} return {} } - const protocolMap: {[s: string]: string} = { + const protocolMap: { [s: string]: string } = { 'tcp://': 'mqtt', 'ws://': 'ws', 'mqtt://': 'mqtt', diff --git a/app/src/reducers/Connection.ts b/app/src/reducers/Connection.ts index 721ba35..f90ac7d 100644 --- a/app/src/reducers/Connection.ts +++ b/app/src/reducers/Connection.ts @@ -27,7 +27,7 @@ export enum ActionTypes { } export interface SetConnecting { - type: ActionTypes.CONNECTION_SET_CONNECTING, + type: ActionTypes.CONNECTION_SET_CONNECTING connectionId: string } diff --git a/app/src/reducers/ConnectionManager.ts b/app/src/reducers/ConnectionManager.ts index 82cf597..10c93af 100644 --- a/app/src/reducers/ConnectionManager.ts +++ b/app/src/reducers/ConnectionManager.ts @@ -3,7 +3,7 @@ import { ConnectionOptions } from '../model/ConnectionOptions' import { createReducer } from './lib' export interface ConnectionManagerState { - connections: {[s: string]: ConnectionOptions}, + connections: { [s: string]: ConnectionOptions } selected?: string showAdvancedSettings: boolean } @@ -14,7 +14,15 @@ const initialState: ConnectionManagerState = { showAdvancedSettings: false, } -export type Action = SetConnections | SelectConnection | UpdateConnection | AddConnection | DeleteConnection | ToggleAdvancedSettings | DeleteSubscription | AddSubscription +export type Action = + | SetConnections + | SelectConnection + | UpdateConnection + | AddConnection + | DeleteConnection + | ToggleAdvancedSettings + | DeleteSubscription + | AddSubscription export enum ActionTypes { CONNECTION_MANAGER_SET_CONNECTIONS = 'CONNECTION_MANAGER_SET_CONNECTIONS', @@ -29,7 +37,7 @@ export enum ActionTypes { export interface SetConnections { type: ActionTypes.CONNECTION_MANAGER_SET_CONNECTIONS - connections: {[s: string]: ConnectionOptions} + connections: { [s: string]: ConnectionOptions } } export interface SelectConnection { diff --git a/app/src/reducers/Global.ts b/app/src/reducers/Global.ts index 9be153b..3c2ef6e 100644 --- a/app/src/reducers/Global.ts +++ b/app/src/reducers/Global.ts @@ -12,7 +12,7 @@ export enum ActionTypes { } export interface GlobalAction extends Action { - type: ActionTypes, + type: ActionTypes showUpdateNotification?: boolean showUpdateDetails?: boolean error?: string @@ -39,33 +39,36 @@ const initialStateFactory = Record({ settingsVisible: false, }) -export const globalState: Reducer, GlobalAction> = (state = initialStateFactory(), action): GlobalState => { +export const globalState: Reducer, GlobalAction> = ( + state = initialStateFactory(), + action +): GlobalState => { trackEvent(action.type) console.log(action.type) switch (action.type) { - case ActionTypes.showUpdateNotification: - return state.set('showUpdateNotification', action.showUpdateNotification) + case ActionTypes.showUpdateNotification: + return state.set('showUpdateNotification', action.showUpdateNotification) - case ActionTypes.toggleSettingsVisibility: - return state.set('settingsVisible', !state.get('settingsVisible')) + case ActionTypes.toggleSettingsVisibility: + return state.set('settingsVisible', !state.get('settingsVisible')) - case ActionTypes.showError: - return state.set('error', action.error) + case ActionTypes.showError: + return state.set('error', action.error) - case ActionTypes.showNotification: - return state.set('notification', action.notification) + case ActionTypes.showNotification: + return state.set('notification', action.notification) - case ActionTypes.didLaunch: - return state.set('launching', false) + case ActionTypes.didLaunch: + return state.set('launching', false) - case ActionTypes.showUpdateDetails: - if (action.showUpdateDetails === undefined) { + case ActionTypes.showUpdateDetails: + if (action.showUpdateDetails === undefined) { + return state + } + return state.set('showUpdateDetails', action.showUpdateDetails) + + default: return state - } - return state.set('showUpdateDetails', action.showUpdateDetails) - - default: - return state } } diff --git a/app/src/reducers/Settings.ts b/app/src/reducers/Settings.ts index c278d73..340881c 100644 --- a/app/src/reducers/Settings.ts +++ b/app/src/reducers/Settings.ts @@ -22,15 +22,15 @@ export interface SettingsState { theme: 'light' | 'dark' } -export type Actions = SetAutoExpandLimitAction - & DidLoadSettingsAction - & SetTopicOrderAction - & FilterTopicsAction - & ToggleHighlightTopicUpdatesAction - & SetValueRendererDisplayModeAction - & SetTheme - & SetSelectTopicWithMouseOverAction - & SetTimeLocale +export type Actions = SetAutoExpandLimitAction & + DidLoadSettingsAction & + SetTopicOrderAction & + FilterTopicsAction & + ToggleHighlightTopicUpdatesAction & + SetValueRendererDisplayModeAction & + SetTheme & + SetSelectTopicWithMouseOverAction & + SetTimeLocale export enum ActionTypes { SETTINGS_SET_AUTO_EXPAND_LIMIT = 'SETTINGS_SET_AUTO_EXPAND_LIMIT', @@ -60,7 +60,9 @@ const setTheme = (theme: 'light' | 'dark') => (state: Record) => return state.set('theme', theme) } -const reducerActions: {[s: string]: (state: Record, action: Actions) => Record} = { +const reducerActions: { + [s: string]: (state: Record, action: Actions) => Record +} = { SETTINGS_SET_AUTO_EXPAND_LIMIT: setAutoExpandLimit, SETTINGS_SET_TOPIC_ORDER: setTopicOrder, SETTINGS_FILTER_TOPICS: filterTopics, diff --git a/app/src/reducers/Sidebar.ts b/app/src/reducers/Sidebar.ts index c72871d..f431c8f 100644 --- a/app/src/reducers/Sidebar.ts +++ b/app/src/reducers/Sidebar.ts @@ -19,7 +19,9 @@ export enum ActionTypes { export type SidebarState = Record -const actions: {[s: string]: (state: SidebarState, action: Action) => SidebarState} = { +const actions: { + [s: string]: (state: SidebarState, action: Action) => SidebarState +} = { SIDEBAR_SET_COMPARE_MESSAGE: setCompareMessage, SIDEBAR_RESET_STORE: resetStore, } diff --git a/app/src/reducers/Tree.ts b/app/src/reducers/Tree.ts index 27fe854..02b65ed 100644 --- a/app/src/reducers/Tree.ts +++ b/app/src/reducers/Tree.ts @@ -49,7 +49,9 @@ const setPaused = (pause: boolean) => (state: TreeState, action: ShowTree): Tree return state.set('paused', pause) } -const actions: {[s: string]: (state: TreeState, action: Action) => TreeState} = { +const actions: { + [s: string]: (state: TreeState, action: Action) => TreeState +} = { TREE_SHOW_TREE: showTree, TREE_SELECT_TOPIC: selectTopic, TREE_PAUSE_UPDATES: setPaused(true), diff --git a/app/src/reducers/index.ts b/app/src/reducers/index.ts index da29eeb..2e58933 100644 --- a/app/src/reducers/index.ts +++ b/app/src/reducers/index.ts @@ -11,9 +11,9 @@ import { treeReducer, TreeState } from './Tree' export interface AppState { globalState: GlobalState tree: TreeState - settings: Record, + settings: Record publish: PublishState - sidebar: SidebarState, + sidebar: SidebarState connection: ConnectionState connectionManager: ConnectionManagerState } diff --git a/app/src/utils/PersistentStorage.ts b/app/src/utils/PersistentStorage.ts index 616e1c7..c704594 100644 --- a/app/src/utils/PersistentStorage.ts +++ b/app/src/utils/PersistentStorage.ts @@ -46,7 +46,11 @@ class RemoteStorage implements PersistentStorage { public store(identifier: StorageIdentifier, data: Model): Promise { const transactionId = v4() const expectation = this.expectAck(transactionId) - rendererEvents.emit(storageStoreEvent, { data, transactionId, store: identifier.id }) + rendererEvents.emit(storageStoreEvent, { + data, + transactionId, + store: identifier.id, + }) return expectation } diff --git a/app/src/utils/handleTextSelectWithCtrlA.ts b/app/src/utils/handleTextSelectWithCtrlA.ts index 8e29cd8..01db170 100644 --- a/app/src/utils/handleTextSelectWithCtrlA.ts +++ b/app/src/utils/handleTextSelectWithCtrlA.ts @@ -1,4 +1,6 @@ -export const selectTextWithCtrlA = (options?: {targetSelector: string}) => (e: React.KeyboardEvent) => { +export const selectTextWithCtrlA = (options?: { targetSelector: string }) => ( + e: React.KeyboardEvent +) => { const isCtrlA = (e.metaKey || e.ctrlKey) && e.key === 'a' if (isCtrlA && window.getSelection) { @@ -7,8 +9,8 @@ export const selectTextWithCtrlA = (options?: {targetSelector: string}) => (e: R e.stopPropagation() const selection = window.getSelection() const range = document.createRange() - const eventTarget = (e.target as HTMLElement) - const target: HTMLElement | null = (options) ? eventTarget.querySelector(options.targetSelector) : eventTarget + const eventTarget = e.target as HTMLElement + const target: HTMLElement | null = options ? eventTarget.querySelector(options.targetSelector) : eventTarget if (!target) { console.error('Could not find matching target for Ctrl+A Event') diff --git a/app/src/utils/tracking.ts b/app/src/utils/tracking.ts index b882b75..49a4985 100644 --- a/app/src/utils/tracking.ts +++ b/app/src/utils/tracking.ts @@ -4,9 +4,18 @@ import { electronRendererTelementry } from 'electron-telemetry' function trackProcessStatistics() { setInterval(() => { try { - electronRendererTelementry.trackCustomEvent({ name: 'heapStatistics', payload: process.getHeapStatistics() }) - electronRendererTelementry.trackCustomEvent({ name: 'cpuUsage', payload: process.getCPUUsage() }) - electronRendererTelementry.trackCustomEvent({ name: 'runningSince', payload: performance.now() }) + electronRendererTelementry.trackCustomEvent({ + name: 'heapStatistics', + payload: process.getHeapStatistics(), + }) + electronRendererTelementry.trackCustomEvent({ + name: 'cpuUsage', + payload: process.getCPUUsage(), + }) + electronRendererTelementry.trackCustomEvent({ + name: 'runningSince', + payload: performance.now(), + }) } catch (error) { console.error(error) } diff --git a/backend/package.json b/backend/package.json index d5fa1fc..7a60fd2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -34,5 +34,11 @@ ], "sourceMap": true, "instrument": true + }, + "peerDependencies": { + "fs-extra": "^8.0.1", + "js-base64": "^2.5.1", + "lowdb": "^1.0.0", + "mqtt": "^3.0.0" } } diff --git a/backend/src/ConfigStorage.ts b/backend/src/ConfigStorage.ts index 1e48cad..5e2e2ac 100644 --- a/backend/src/ConfigStorage.ts +++ b/backend/src/ConfigStorage.ts @@ -8,8 +8,8 @@ import { makeStorageResponseEvent, storageClearEvent, storageLoadEvent, - storageStoreEvent - } from '../../events/StorageEvents' + storageStoreEvent, +} from '../../events/StorageEvents' export default class ConfigStorage { private file: string @@ -32,31 +32,43 @@ export default class ConfigStorage { } public async init() { - backendEvents.subscribe(storageStoreEvent, async (event) => { + backendEvents.subscribe(storageStoreEvent, async event => { const ack = makeStorageAcknowledgementEvent(event.transactionId) try { const db = await this.getDb() await db.set(event.store, event.data).write() backendEvents.emit(ack, undefined) } catch (error) { - backendEvents.emit(ack, { error, transactionId: event.transactionId, store: event.store }) + backendEvents.emit(ack, { + error, + transactionId: event.transactionId, + store: event.store, + }) throw error } }) - backendEvents.subscribe(storageLoadEvent, async (event) => { + backendEvents.subscribe(storageLoadEvent, async event => { const responseEvent = makeStorageResponseEvent(event.transactionId) try { const db = await this.getDb() const data = await db.get(event.store).value() - backendEvents.emit(responseEvent, { data, transactionId: event.transactionId, store: event.store }) + backendEvents.emit(responseEvent, { + data, + transactionId: event.transactionId, + store: event.store, + }) } catch (error) { - backendEvents.emit(responseEvent, { error, transactionId: event.transactionId, store: event.store }) + backendEvents.emit(responseEvent, { + error, + transactionId: event.transactionId, + store: event.store, + }) throw error } }) - backendEvents.subscribe(storageClearEvent, async (event) => { + backendEvents.subscribe(storageClearEvent, async event => { try { const db = await this.getDb() const keys = await db.keys().value() @@ -65,7 +77,10 @@ export default class ConfigStorage { } backendEvents.emit(makeStorageAcknowledgementEvent(event.transactionId), undefined) } catch (error) { - backendEvents.emit(makeStorageAcknowledgementEvent(event.transactionId), { error, transactionId: event.transactionId }) + backendEvents.emit(makeStorageAcknowledgementEvent(event.transactionId), { + error, + transactionId: event.transactionId, + }) throw error } }) diff --git a/backend/src/DataSource/MqttSource.ts b/backend/src/DataSource/MqttSource.ts index 2d71922..3a7a4cb 100644 --- a/backend/src/DataSource/MqttSource.ts +++ b/backend/src/DataSource/MqttSource.ts @@ -68,7 +68,7 @@ export class MqttSource implements DataSource { client.on('connect', () => { this.stateMachine.setConnected(true) - options.subscriptions.forEach((subscription) => { + options.subscriptions.forEach(subscription => { client.subscribe(subscription, (err: Error) => { if (err) { this.stateMachine.setError(err) @@ -86,10 +86,10 @@ export class MqttSource implements DataSource { public publish(msg: MqttMessage) { if (this.client) { - this.client.publish( - msg.topic, - msg.payload ? Base64Message.toUnicodeString(msg.payload) : '', - { qos: msg.qos, retain: msg.retain }) + this.client.publish(msg.topic, msg.payload ? Base64Message.toUnicodeString(msg.payload) : '', { + qos: msg.qos, + retain: msg.retain, + }) } } diff --git a/backend/src/JsonAstParser.ts b/backend/src/JsonAstParser.ts index 730137a..0979bdd 100644 --- a/backend/src/JsonAstParser.ts +++ b/backend/src/JsonAstParser.ts @@ -59,16 +59,20 @@ interface JsonAstArray { function jsonToPropertyPaths(ast: JsonAst, previousPath: Array = []): Array { let children: Array> = [] if (ast.type === 'Literal') { - return [{ - value: ast.value, - path: previousPath.join('.'), - line: ast.loc.start.line, - column: ast.loc.start.column, - }] + return [ + { + value: ast.value, + path: previousPath.join('.'), + line: ast.loc.start.line, + column: ast.loc.start.column, + }, + ] } else if (ast.type === 'Array') { children = ast.children.map((value, idx) => jsonToPropertyPaths(value, previousPath.slice().concat([String(idx)]))) } else if (ast.type === 'Object') { - children = ast.children.map(property => jsonToPropertyPaths(property.value, previousPath.slice().concat([property.key.value]))) + children = ast.children.map(property => + jsonToPropertyPaths(property.value, previousPath.slice().concat([property.key.value])) + ) } return children.reduce((a, b) => a.concat(b), []) diff --git a/backend/src/Model/RingBuffer.ts b/backend/src/Model/RingBuffer.ts index 519b854..9c78707 100644 --- a/backend/src/Model/RingBuffer.ts +++ b/backend/src/Model/RingBuffer.ts @@ -26,7 +26,7 @@ export class RingBuffer { if (remainingSize < 0) { this.freeSomeSpace(Math.abs(remainingSize)) } - while ((this.end - this.start) >= this.maxItems) { + while (this.end - this.start >= this.maxItems) { this.dropFirst() } } diff --git a/backend/src/Model/Tree.ts b/backend/src/Model/Tree.ts index 77e43a2..c49762e 100644 --- a/backend/src/Model/Tree.ts +++ b/backend/src/Model/Tree.ts @@ -1,11 +1,6 @@ import { ChangeBuffer } from './ChangeBuffer' import { Destroyable } from './Destroyable' -import { - EventBusInterface, - EventDispatcher, - makeConnectionMessageEvent, - MqttMessage -} from '../../../events' +import { EventBusInterface, EventDispatcher, makeConnectionMessageEvent, MqttMessage } from '../../../events' import { TreeNode } from './' import { TreeNodeFactory } from './TreeNodeFactory' @@ -35,7 +30,11 @@ export class Tree extends TreeNode { this.didReceive.removeAllListeners() } - public updateWithConnection(emitter: EventBusInterface, connectionId: string, nodeFilter?: (node: TreeNode) => boolean) { + public updateWithConnection( + emitter: EventBusInterface, + connectionId: string, + nodeFilter?: (node: TreeNode) => boolean + ) { this.updateSource = emitter this.connectionId = connectionId this.nodeFilter = nodeFilter @@ -49,7 +48,7 @@ export class Tree extends TreeNode { } public applyUnmergedChanges() { - this.unmergedMessages.popAll().forEach((msg) => { + this.unmergedMessages.popAll().forEach(msg => { const edges = msg.topic.split('/') const node = TreeNodeFactory.fromEdgesAndValue(edges, msg.payload) node.mqttMessage = msg diff --git a/backend/src/Model/TreeNode.ts b/backend/src/Model/TreeNode.ts index e557eb2..458cc36 100644 --- a/backend/src/Model/TreeNode.ts +++ b/backend/src/Model/TreeNode.ts @@ -8,7 +8,7 @@ export class TreeNode { public mqttMessage?: MqttMessage public messageHistory: MessageHistory = new RingBuffer(20000, 100) public viewModel?: ViewModel - public edges: {[s: string]: Edge} = {} + public edges: { [s: string]: Edge } = {} public edgeArray: Array> = [] public collapsed = false public messages: number = 0 @@ -52,7 +52,7 @@ export class TreeNode { } private isTopicEmptyLeaf() { - const hasNoMessage = (!this.message || !this.message.value || this.message.value.length === 0) + const hasNoMessage = !this.message || !this.message.value || this.message.value.length === 0 return hasNoMessage && this.isLeaf() } @@ -135,7 +135,7 @@ export class TreeNode { } public hash(): string { - return `N${(this.sourceEdge ? this.sourceEdge.hash() : '')}` + return `N${this.sourceEdge ? this.sourceEdge.hash() : ''}` } public firstNode(): TreeNode { @@ -145,7 +145,7 @@ export class TreeNode { public path(): string { if (!this.cachedPath) { return this.branch() - .map(node => (node.sourceEdge && node.sourceEdge.name)) + .map(node => node.sourceEdge && node.sourceEdge.name) .filter(name => name !== undefined) .join('/') } @@ -199,9 +199,8 @@ export class TreeNode { public leafMessageCount(): number { if (this.cachedLeafMessageCount === undefined) { - this.cachedLeafMessageCount = this.edgeArray - .map(edge => edge.target.leafMessageCount()) - .reduce((a, b) => a + b, 0) + this.messages + this.cachedLeafMessageCount = + this.edgeArray.map(edge => edge.target.leafMessageCount()).reduce((a, b) => a + b, 0) + this.messages } return this.cachedLeafMessageCount as number diff --git a/backend/src/Model/TreeNodeFactory.ts b/backend/src/Model/TreeNodeFactory.ts index 50bc4dd..53b6987 100644 --- a/backend/src/Model/TreeNodeFactory.ts +++ b/backend/src/Model/TreeNodeFactory.ts @@ -4,7 +4,10 @@ import { Edge, Tree, TreeNode } from './' export abstract class TreeNodeFactory { private static messageCounter = 0 - public static insertNodeAtPosition(edgeNames: Array, node: TreeNode) { + public static insertNodeAtPosition( + edgeNames: Array, + node: TreeNode + ) { let currentNode: TreeNode = new Tree() let edge for (const edgeName of edgeNames) { @@ -17,7 +20,10 @@ export abstract class TreeNodeFactory { node.sourceEdge!.target = node } - public static fromEdgesAndValue(edgeNames: Array, value?: Base64Message | null): TreeNode { + public static fromEdgesAndValue( + edgeNames: Array, + value?: Base64Message | null + ): TreeNode { const node = new TreeNode() node.setMessage({ value: value || undefined, diff --git a/backend/src/Model/spec/Edge.spec.ts b/backend/src/Model/spec/Edge.spec.ts index 75a1cfc..c72ae54 100644 --- a/backend/src/Model/spec/Edge.spec.ts +++ b/backend/src/Model/spec/Edge.spec.ts @@ -42,7 +42,7 @@ describe('Edge', () => { const topics2 = 'foo/foo/baz'.split('/') const bazEdge2 = TreeNodeFactory.fromEdgesAndValue(topics2, undefined).sourceEdge - if (!bazEdge1 || !bazEdge2) { + if (!bazEdge1 || !bazEdge2) { throw Error('should not happen') } diff --git a/backend/src/Model/spec/EventDispatcher.spec.ts b/backend/src/Model/spec/EventDispatcher.spec.ts index 92a99f5..c0c6571 100644 --- a/backend/src/Model/spec/EventDispatcher.spec.ts +++ b/backend/src/Model/spec/EventDispatcher.spec.ts @@ -8,8 +8,8 @@ describe('EventDispatcher', async () => { this.timeout(300) setTimeout(() => dispatcher.dispatch('hello'), 5) - const response = await new Promise((resolve) => { - dispatcher.subscribe((msg) => { + const response = await new Promise(resolve => { + dispatcher.subscribe(msg => { resolve(msg) }) }) diff --git a/backend/src/Model/spec/TreeNode.spec.ts b/backend/src/Model/spec/TreeNode.spec.ts index 7534e58..2cd8495 100644 --- a/backend/src/Model/spec/TreeNode.spec.ts +++ b/backend/src/Model/spec/TreeNode.spec.ts @@ -1,12 +1,12 @@ import 'mocha' -import { TreeNodeFactory } from '../' +import { TreeNodeFactory } from '../' import { expect } from 'chai' -import { Base64Message } from '../Base64Message'; +import { Base64Message } from '../Base64Message' describe('TreeNode', () => { - const number3 = Base64Message.fromString("3") - const number5 = Base64Message.fromString("5") + const number3 = Base64Message.fromString('3') + const number5 = Base64Message.fromString('5') it('firstNode should retrieve first node', () => { const topics = 'foo/bar'.split('/') const leaf = TreeNodeFactory.fromEdgesAndValue(topics, undefined) diff --git a/backend/src/Model/spec/TreeNodeFactory.spec.ts b/backend/src/Model/spec/TreeNodeFactory.spec.ts index 2055bba..7d31000 100644 --- a/backend/src/Model/spec/TreeNodeFactory.spec.ts +++ b/backend/src/Model/spec/TreeNodeFactory.spec.ts @@ -2,7 +2,7 @@ import 'mocha' import { TreeNodeFactory } from '../' import { expect } from 'chai' -import { Base64Message } from '../Base64Message'; +import { Base64Message } from '../Base64Message' describe('TreeNodeFactory', () => { it('root node must not have a sourceEdge', () => { @@ -45,7 +45,7 @@ describe('TreeNodeFactory', () => { expect(node.sourceEdge.name).to.eq('baz') const barNode = node.sourceEdge.source - if (!barNode || !barNode.sourceEdge) { + if (!barNode || !barNode.sourceEdge) { expect.fail('should not fail') return } diff --git a/backend/src/index.ts b/backend/src/index.ts index 93ec108..bf5dc92 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -12,7 +12,7 @@ import { } from '../../events' export class ConnectionManager { - private connections: {[s: string]: DataSource} = {} + private connections: { [s: string]: DataSource } = {} private handleConnectionRequest = (event: AddMqttConnection) => { const connectionId = event.id @@ -27,7 +27,7 @@ export class ConnectionManager { this.connections[connectionId] = connection const connectionStateEvent = makeConnectionStateEvent(connectionId) - connection.stateMachine.onUpdate.subscribe((state) => { + connection.stateMachine.onUpdate.subscribe(state => { backendEvents.emit(connectionStateEvent, state) }) @@ -46,7 +46,12 @@ export class ConnectionManager { buffer = buffer.slice(0, 20000) } - backendEvents.emit(messageEvent, { topic, payload: Base64Message.fromBuffer(buffer), qos: packet.qos, retain: packet.retain }) + backendEvents.emit(messageEvent, { + topic, + payload: Base64Message.fromBuffer(buffer), + qos: packet.qos, + retain: packet.retain, + }) }) } @@ -68,7 +73,6 @@ export class ConnectionManager { } public closeAllConnections() { - Object.keys(this.connections) - .forEach(conenctionId => this.removeConnection(conenctionId)) + Object.keys(this.connections).forEach(conenctionId => this.removeConnection(conenctionId)) } } diff --git a/backend/src/spec/JsonAstParser.spec.ts b/backend/src/spec/JsonAstParser.spec.ts index 35131de..971416d 100644 --- a/backend/src/spec/JsonAstParser.spec.ts +++ b/backend/src/spec/JsonAstParser.spec.ts @@ -26,16 +26,11 @@ describe('access JSON values via dot property paths', () => { expect(result[0].path).to.eq('foo.bar') expect(result[0].line).to.eq(3) expect(dotProp.get(data, result[0].path)).to.eq(4) - }) it('array path', () => { const data = { - foo: [ - 1, - 2, - 3, - ], + foo: [1, 2, 3], } const result = parseJson(JSON.stringify(data, undefined, 2)) @@ -48,7 +43,7 @@ describe('access JSON values via dot property paths', () => { it('should fail parsing invalid json', () => { expect(() => { - const result = parseJson("BLE2MQTT-8C48") + const result = parseJson('BLE2MQTT-8C48') }).to.throw() }) }) diff --git a/backend/yarn.lock b/backend/yarn.lock new file mode 100644 index 0000000..3314a84 --- /dev/null +++ b/backend/yarn.lock @@ -0,0 +1,538 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +bl@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +callback-stream@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/callback-stream/-/callback-stream-1.1.0.tgz#4701a51266f06e06eaa71fc17233822d875f4908" + integrity sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg= + dependencies: + inherits "^2.0.1" + readable-stream "> 1.0.0 < 3.0.0" + +commist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/commist/-/commist-1.1.0.tgz#17811ec6978f6c15ee4de80c45c9beb77cee35d5" + integrity sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg== + dependencies: + leven "^2.1.0" + minimist "^1.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +d@1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +duplexify@^3.5.1, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14: + version "0.10.50" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" + integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + +es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= + dependencies: + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" + +glob@^7.1.1: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +help-me@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-1.1.0.tgz#8f2d508d0600b4a456da2f086556e7e5c056a3c6" + integrity sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y= + dependencies: + callback-stream "^1.0.2" + glob-stream "^6.1.0" + through2 "^2.0.1" + xtend "^4.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +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= + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.0, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +mqtt-packet@^6.0.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/mqtt-packet/-/mqtt-packet-6.1.2.tgz#239493d185c9209011a5a22ebce30e098c731f81" + integrity sha512-yVG5PoS3wJ8TLzfS8pQMsDVLAf/EipnBAG5XQE9X/9L0EMxuduI9J2WnlRvJT497K1CUT4VJWjoP08+CKiKt1Q== + dependencies: + bl "^1.2.2" + inherits "^2.0.3" + process-nextick-args "^2.0.0" + safe-buffer "^5.1.2" + +mqtt@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mqtt/-/mqtt-3.0.0.tgz#7961e5f61efba3eec37d5aa9c4cbcdeb6f841380" + integrity sha512-0nKV6MAc1ibKZwaZQUTb3iIdT4NVpj541BsYrqrGBcQdQ7Jd0MnZD1/6/nj1UFdGTboK9ZEUXvkCu2nPCugHFA== + dependencies: + base64-js "^1.3.0" + commist "^1.0.0" + concat-stream "^1.6.2" + end-of-stream "^1.4.1" + es6-map "^0.1.5" + help-me "^1.0.1" + inherits "^2.0.3" + minimist "^1.2.0" + mqtt-packet "^6.0.0" + pump "^3.0.0" + readable-stream "^2.3.6" + reinterval "^1.1.0" + split2 "^3.1.0" + websocket-stream "^5.1.2" + xtend "^4.0.1" + +next-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + dependencies: + readable-stream "^2.0.1" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +reinterval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7" + integrity sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +split2@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.1.1.tgz#c51f18f3e06a8c4469aaab487687d8d956160bb6" + integrity sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q== + dependencies: + readable-stream "^3.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.1, through2@~2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" + +type@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/type/-/type-1.0.1.tgz#084c9a17fcc9151a2cdb1459905c2e45e4bb7d61" + integrity sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +websocket-stream@^5.1.2: + version "5.5.0" + resolved "https://registry.yarnpkg.com/websocket-stream/-/websocket-stream-5.5.0.tgz#9827f2846fc0d2b4dca7aab8f92980b2548b868e" + integrity sha512-EXy/zXb9kNHI07TIMz1oIUIrPZxQRA8aeJ5XYg5ihV8K4kD1DuA+FY6R96HfdIHzlSzS8HiISAfrm+vVQkZBug== + dependencies: + duplexify "^3.5.1" + inherits "^2.0.1" + readable-stream "^2.3.3" + safe-buffer "^5.1.2" + ws "^3.2.0" + xtend "^4.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= diff --git a/events/EventBus.ts b/events/EventBus.ts index 2a6c0b2..8a95df9 100644 --- a/events/EventBus.ts +++ b/events/EventBus.ts @@ -1,6 +1,7 @@ -import { IpcMain, IpcRenderer, ipcMain, ipcRenderer } from 'electron' +import { IpcMain, ipcMain, ipcRenderer } from 'electron' import { Event } from './Events' +import { IpcRendererEventBus } from './IpcRendererEventBus' export interface EventBusInterface { subscribe(event: Event, callback: (msg: MessageType) => void): void @@ -9,7 +10,7 @@ export interface EventBusInterface { unsubscribe(event: Event, callback: any): void } -interface CallbackStore { +export interface CallbackStore { wrappedCallback: any callback: any } @@ -45,45 +46,5 @@ class IpcMainEventBus implements EventBusInterface { } } -class IpcRendererEventBus implements EventBusInterface { - private ipc: IpcRenderer - private callbacks: Array = [] - - constructor(ipc: IpcRenderer) { - this.ipc = ipc - } - - public subscribe(event: Event, callback: (msg: MessageType) => void) { - const wrappedCallback = (_event: any, arg: any) => { - callback(arg) - } - - this.ipc.on(event.topic, wrappedCallback) - - this.callbacks.push({ - callback, - wrappedCallback, - }) - } - - public unsubscribeAll(event: Event) { - this.ipc.removeAllListeners(event.topic) - } - - public unsubscribe(event: Event, callback: any) { - const item = this.callbacks.find(store => store.callback === callback) - if (!item) { - return - } - - this.ipc.removeListener(event.topic, item.wrappedCallback) - this.callbacks = this.callbacks.filter(a => a !== item) - } - - public emit(event: Event, msg: MessageType) { - this.ipc.send(event.topic, msg) - } -} - export const rendererEvents = new IpcRendererEventBus(ipcRenderer) export const backendEvents = new IpcMainEventBus(ipcMain) diff --git a/events/Events.ts b/events/Events.ts index 5ad47a4..0c0d756 100644 --- a/events/Events.ts +++ b/events/Events.ts @@ -1,16 +1,13 @@ -import { DataSourceState, MqttOptions } from '../backend/src/DataSource' - -import { UpdateInfo } from 'builder-util-runtime' import { Base64Message } from '../backend/src/Model/Base64Message' - -export { UpdateInfo } from 'builder-util-runtime' +import { DataSourceState, MqttOptions } from '../backend/src/DataSource' +import { UpdateInfo } from 'builder-util-runtime' export interface Event { topic: string } export interface AddMqttConnection { - id: string, + id: string options: MqttOptions } @@ -33,9 +30,9 @@ export const updateAvailable: Event = { } export interface MqttMessage { - topic: string, - payload: Base64Message | null, - qos: 0 | 1 | 2, + topic: string + payload: Base64Message | null + qos: 0 | 1 | 2 retain: boolean } diff --git a/events/IpcRendererEventBus.ts b/events/IpcRendererEventBus.ts new file mode 100644 index 0000000..2d34293 --- /dev/null +++ b/events/IpcRendererEventBus.ts @@ -0,0 +1,35 @@ +import { CallbackStore, EventBusInterface } from './EventBus' +import { Event } from './Events' +import { IpcRenderer } from 'electron' + +export class IpcRendererEventBus implements EventBusInterface { + private ipc: IpcRenderer + private callbacks: Array = [] + constructor(ipc: IpcRenderer) { + this.ipc = ipc + } + public subscribe(event: Event, callback: (msg: MessageType) => void) { + const wrappedCallback = (_: any, arg: any) => { + callback(arg) + } + this.ipc.on(event.topic, wrappedCallback) + this.callbacks.push({ + callback, + wrappedCallback, + }) + } + public unsubscribeAll(event: Event) { + this.ipc.removeAllListeners(event.topic) + } + public unsubscribe(event: Event, callback: any) { + const item = this.callbacks.find(store => store.callback === callback) + if (!item) { + return + } + this.ipc.removeListener(event.topic, item.wrappedCallback) + this.callbacks = this.callbacks.filter(a => a !== item) + } + public emit(event: Event, msg: MessageType) { + this.ipc.send(event.topic, msg) + } +} diff --git a/events/StorageEvents.ts b/events/StorageEvents.ts index d31762b..4c0bd7d 100644 --- a/events/StorageEvents.ts +++ b/events/StorageEvents.ts @@ -5,13 +5,13 @@ interface StorageEvent { } export interface StoreCommand extends StorageEvent { - store?: string, + store?: string data?: any error?: any } export interface LoadCommand extends StorageEvent { - store: string, + store: string } export const storageStoreEvent: Event = { diff --git a/package.json b/package.json index 90ee329..384cc28 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "dev": "npm-run-all --parallel dev:*", "dev:app": "cd app && npm run dev", "dev:electron": "tsc && electron . --development", + "lint": "yarn run lint:prettier; yarn run lint:tslint", + "lint:prettier": "prettier --check \"**/*.ts{x,}\"", + "lint:tslint": "node_modules/.bin/tslint -p ./", "build": "tsc && cd app && yarn run build && cd ..", "test-backend": "cd backend && yarn run test && cd ..", "prepare-release": "ts-node scripts/prepare-release.ts", @@ -68,7 +71,9 @@ "@types/semver": "^6.0.0", "@types/sha1": "^1.1.1", "axios": "^0.19.0", + "builder-util-runtime": "^8.2.5", "chai": "^4.2.0", + "cspell": "^4.0.23", "electron": "5", "electron-builder": "^20.38.5", "fs-extra": "^8.0.1", @@ -76,6 +81,7 @@ "mocha": "^6.1.4", "mustache": "^3.0.1", "nyc": "^14.1.1", + "prettier": "1.18.2", "redux-thunk": "^2.3.0", "source-map-support": "^0.5.9", "spectron": "^5.0.0", @@ -86,7 +92,7 @@ "tslint-react-recommended": "^1.0.15", "tslint-strict-null-checks": "^1.0.1", "typescript": "^3.2.2", - "webdriverio": "~5.9.6" + "webdriverio": "5.5" }, "dependencies": { "about-window": "^1.12.1", @@ -100,5 +106,8 @@ "mqtt": "^3.0.0", "sha1": "^1.1.1", "yarn-run-all": "^3.1.1" + }, + "optionalDependencies": { + "ffmpeg-concat": "^1.0.13" } } diff --git a/package.ts b/package.ts index daa43a1..0c6daf9 100644 --- a/package.ts +++ b/package.ts @@ -59,24 +59,24 @@ const mac: builder.CliOptions = { async function executeBuild() { switch (process.argv[2]) { - case 'win': - await buildWithOptions(winPortable, { platform: 'win', package: 'portable' }) - await buildWithOptions(winNsis, { platform: 'win', package: 'nsis' }) - break - case 'appx': - await buildWithOptions(winAppx, { platform: 'win', package: 'appx' }) - break - case 'linux': - await buildWithOptions(linuxAppImage, { platform: 'linux', package: 'AppImage' }) - await buildWithOptions(linuxSnap, { platform: 'linux', package: 'snap' }) - break - case 'mac': - await buildWithOptions(mac, { platform: 'mac', package: 'mas' }) - await buildWithOptions(mac, { platform: 'mac', package: 'dmg' }) - await buildWithOptions(mac, { platform: 'mac', package: 'zip' }) - break - default: - await buildWithOptions({ ...mac, projectDir: '' }, { platform: 'mac', package: 'mas-dev' }) + case 'win': + await buildWithOptions(winPortable, { platform: 'win', package: 'portable' }) + await buildWithOptions(winNsis, { platform: 'win', package: 'nsis' }) + break + case 'appx': + await buildWithOptions(winAppx, { platform: 'win', package: 'appx' }) + break + case 'linux': + await buildWithOptions(linuxAppImage, { platform: 'linux', package: 'AppImage' }) + await buildWithOptions(linuxSnap, { platform: 'linux', package: 'snap' }) + break + case 'mac': + await buildWithOptions(mac, { platform: 'mac', package: 'mas' }) + await buildWithOptions(mac, { platform: 'mac', package: 'dmg' }) + await buildWithOptions(mac, { platform: 'mac', package: 'zip' }) + break + default: + await buildWithOptions({ ...mac, projectDir: '' }, { platform: 'mac', package: 'mas-dev' }) } } @@ -90,7 +90,7 @@ type Packages = 'portable' | 'nsis' | 'appx' | 'AppImage' | 'snap' | 'dmg' | 'zi async function buildWithOptions(options: builder.CliOptions, buildInfo: BuildInfo) { fs.writeFileSync(path.join(options.projectDir!, 'buildOptions.json'), JSON.stringify(buildInfo)) - const jsonLocation = path.join((options.projectDir as string), 'package.json') + const jsonLocation = path.join(options.projectDir as string, 'package.json') const packageJsonStr = fs.readFileSync(jsonLocation).toString() const packageJson = JSON.parse(fs.readFileSync(jsonLocation).toString()) @@ -102,7 +102,10 @@ async function buildWithOptions(options: builder.CliOptions, buildInfo: BuildInf if (buildInfo.platform === 'mac') { console.log(buildInfo.package) - const provisioningProfile = (buildInfo.package === 'mas') ? 'res/MQTT_Explorer_Store_Distribution_Profile.provisionprofile' : 'res/MQTTExplorerdmg.provisionprofile' + const provisioningProfile = + buildInfo.package === 'mas' + ? 'res/MQTT_Explorer_Store_Distribution_Profile.provisionprofile' + : 'res/MQTTExplorerdmg.provisionprofile' dotProp.set(packageJson, 'build.mac.provisioningProfile', provisioningProfile) } diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..0b7ab7d --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,7 @@ +module.exports = { + trailingComma: 'es5', + tabWidth: 2, + semi: false, + singleQuote: true, + printWidth: 120, +}; diff --git a/scripts/afterPack.ts b/scripts/afterPack.ts index dda0ed5..5790855 100644 --- a/scripts/afterPack.ts +++ b/scripts/afterPack.ts @@ -3,7 +3,6 @@ import * as path from 'path' import { chdir } from 'process' import { exec } from './util' - interface Target { name: 'appImage' | string } diff --git a/scripts/cutScenes.ts b/scripts/cutScenes.ts index 11f3525..1c81f3a 100755 --- a/scripts/cutScenes.ts +++ b/scripts/cutScenes.ts @@ -12,7 +12,10 @@ async function cutScenes(scenes: Array) { fs.unlinkSync(outputFile) } - await exec('ffmpeg', `-i app2.mp4 -ss ${scene.start / 1000} -t ${scene.duration / 1000} ${scene.name}.mp4`.split(' ')) + await exec( + 'ffmpeg', + `-i app2.mp4 -ss ${scene.start / 1000} -t ${scene.duration / 1000} ${scene.name}.mp4`.split(' ') + ) } } @@ -37,7 +40,7 @@ class TransitionBuilder { return { output: outputFile, videos: this.scenes.map(s => `${s}.mp4`), - transistions: this.transitions.map(name => ({ + transitions: this.transitions.map(name => ({ name: name !== 'none' ? name : 'fade', duration: name !== 'none' ? 1000 : 10, })), @@ -47,7 +50,7 @@ class TransitionBuilder { // const scenes: Array = JSON.parse(fs.readFileSync('./scenes.json').toString()) // cutScenes(scenes) -let builder = new TransitionBuilder() +const builder = new TransitionBuilder() .startWith('connect') .transitionTo('numeric_plots', 'cube') .transitionTo('diffs', 'pixelize') diff --git a/scripts/uploadVideoAsset.ts b/scripts/uploadVideoAsset.ts index 3a649fb..86cf223 100755 --- a/scripts/uploadVideoAsset.ts +++ b/scripts/uploadVideoAsset.ts @@ -7,7 +7,9 @@ import * as mime from 'mime' const githubToken = process.env.GH_TOKEN async function tagUrl(tag: string): Promise { - const response = await axios.get(`https://api.github.com/repos/thomasnordquist/mqtt-explorer/releases?access_token=${githubToken}`) + const response = await axios.get( + `https://api.github.com/repos/thomasnordquist/mqtt-explorer/releases?access_token=${githubToken}` + ) const tagRelease = response.data.find((release: any) => release.tag_name === tag) return tagRelease ? cleanUploadUrl(tagRelease.upload_url) : undefined @@ -29,8 +31,9 @@ async function createDraft(tag: string) { return cleanUploadUrl(response.data.upload_url) } -function cleanUploadUrl(url: string) { - return url.match(/(.*){/)![1] +function cleanUploadUrl(url: string): string | undefined { + const match = url.match(/(.*){/) + return match ? match[1] : undefined } async function uploadAsset() { diff --git a/scripts/util.ts b/scripts/util.ts index 8d47767..17cfc4f 100644 --- a/scripts/util.ts +++ b/scripts/util.ts @@ -1,6 +1,6 @@ import { spawn, ChildProcess } from 'child_process' -export async function exec(cmd: string, args: string[] = []) { +export async function exec(cmd: string, args: Array = []) { const child = spawn(cmd, args, { shell: true }) redirectOutputFor(child) await waitFor(child) @@ -23,7 +23,7 @@ function redirectOutputFor(child: ChildProcess) { } async function waitFor(child: ChildProcess) { - return new Promise((resolve) => { + return new Promise(resolve => { child.once('close', () => resolve()) }) } diff --git a/src/MenuTemplate.ts b/src/MenuTemplate.ts index 113be59..38ddb4b 100644 --- a/src/MenuTemplate.ts +++ b/src/MenuTemplate.ts @@ -112,10 +112,6 @@ const viewMenu: MenuItemConstructorOptions = { ], } -const template: any = [ - applicationMenu, - editMenu, - viewMenu, -] +const template: any = [applicationMenu, editMenu, viewMenu] export const menuTemplate = Menu.buildFromTemplate(template) diff --git a/src/autoUpdater.ts b/src/autoUpdater.ts index 838d6fa..22f0c9c 100644 --- a/src/autoUpdater.ts +++ b/src/autoUpdater.ts @@ -1,9 +1,14 @@ -import { autoUpdater } from 'electron-updater' +import { autoUpdater, UpdateInfo } from 'electron-updater' import { BuildInfo } from 'electron-telemetry/build/Model' -import { UpdateInfo } from '../events' export function shouldAutoUpdate(build: BuildInfo) { - return build.package !== 'portable' && build.package !== 'appx' && build.package !== 'snap' && build.package !== 'mas' && build.platform !== 'mac' + return ( + build.package !== 'portable' && + build.package !== 'appx' && + build.package !== 'snap' && + build.package !== 'mas' && + build.platform !== 'mac' + ) } export function handleAutoUpdate() { @@ -11,7 +16,7 @@ export function handleAutoUpdate() { console.log('There is an update available') }) - autoUpdater.on('error', (error) => { + autoUpdater.on('error', error => { console.error('could not update due to error', error) }) diff --git a/src/buildOptions.ts b/src/buildOptions.ts index 1af164b..151502f 100644 --- a/src/buildOptions.ts +++ b/src/buildOptions.ts @@ -2,12 +2,17 @@ import * as fs from 'fs' import * as path from 'path' import { BuildInfo } from 'electron-telemetry/build/Model' -let buildOptions: BuildInfo = ({ platform: process.platform, package: 'unpacked' } as any) +let buildOptions: BuildInfo = { + platform: process.platform, + package: 'unpacked', +} as any try { const options = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'buildOptions.json')).toString()) if (typeof options.platform === 'string' && typeof options.package === 'string') { buildOptions = options } -} catch (loadingBuildOptionsMayFail) {} +} catch (loadingBuildOptionsMayFail) { + // ignore +} -export default buildOptions \ No newline at end of file +export default buildOptions diff --git a/src/electron.ts b/src/electron.ts index e8ee291..762c6f2 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -8,7 +8,7 @@ import { electronTelemetryFactory } from 'electron-telemetry' import { menuTemplate } from './MenuTemplate' import buildOptions from './buildOptions' import { waitForDevServer, isDev, runningUiTestOnCi, loadDevTools } from './development' -import { shouldAutoUpdate as shouldAutoUpdate, handleAutoUpdate } from './autoUpdater' +import { shouldAutoUpdate, handleAutoUpdate } from './autoUpdater' if (!isDev() && !runningUiTestOnCi()) { const electronTelemetry = electronTelemetryFactory('9b0c8ca04a361eb8160d98c5', buildOptions) diff --git a/src/spec/SceneBuilder.ts b/src/spec/SceneBuilder.ts index 0a7c4b3..d987cc5 100644 --- a/src/spec/SceneBuilder.ts +++ b/src/spec/SceneBuilder.ts @@ -1,11 +1,12 @@ export interface Scene { - name: SceneNames, + name: SceneNames start: number stop: number duration: number } -export type SceneNames = 'connect' +export type SceneNames = + | 'connect' | 'topic_updates' | 'numeric_plots' | 'json-formatting' diff --git a/src/spec/demoVideo.ts b/src/spec/demoVideo.ts index 5dc04fa..153ea6a 100644 --- a/src/spec/demoVideo.ts +++ b/src/spec/demoVideo.ts @@ -1,30 +1,23 @@ +import * as fs from 'fs' import * as os from 'os' import * as webdriverio from 'webdriverio' import mockMqtt, { stop as stopMqtt } from './mock-mqtt' import { clearOldTopics } from './scenarios/clearOldTopics' import { clearSearch, searchTree } from './scenarios/searchTree' +import { clickOnHistory, createFakeMousePointer, hideText, showText, sleep } from './util' import { connectTo } from './scenarios/connect' import { copyTopicToClipboard } from './scenarios/copyTopicToClipboard' import { copyValueToClipboard } from './scenarios/copyValueToClipboard' import { disconnect } from './scenarios/disconnect' import { publishTopic } from './scenarios/publishTopic' +import { SceneBuilder } from './SceneBuilder' +import { showAdvancedConnectionSettings } from './scenarios/showAdvancedConnectionSettings' import { showJsonFormatting } from './scenarios/showJsonFormatting' import { showJsonPreview } from './scenarios/showJsonPreview' import { showMenu } from './scenarios/showMenu' import { showNumericPlot } from './scenarios/showNumericPlot' import { showOffDiffCapability } from './scenarios/showOffDiffCapability' import { showZoomLevel } from './scenarios/showZoomLevel' -import { showAdvancedConnectionSettings } from './scenarios/showAdvancedConnectionSettings' -import { SceneBuilder } from './SceneBuilder' -import * as fs from 'fs' - -import { - clickOnHistory, - createFakeMousePointer, - hideText, - showText, - sleep, -} from './util' process.on('unhandledRejection', (error: Error | any) => { console.error('unhandledRejection', error.message, error.stack) @@ -41,7 +34,13 @@ const options = { browserName: 'electron', chromeOptions: { binary: `${__dirname}/../../../node_modules/.bin/electron`, - args: [`--app=${__dirname}/../../..`, '--force-device-scale-factor=1', '--no-sandbox', '--disable-dev-shm-usage', '--disable-extensions'].concat(runningUiTestOnCi), + args: [ + `--app=${__dirname}/../../..`, + '--force-device-scale-factor=1', + '--no-sandbox', + '--disable-dev-shm-usage', + '--disable-extensions', + ].concat(runningUiTestOnCi), }, windowTypes: ['app', 'webview'], }, @@ -55,7 +54,6 @@ async function doStuff() { const browser = await webdriverio.remote(options) await createFakeMousePointer(browser) - // Wait for Username input to be visible await browser.$('//label[contains(text(), "Username")]/..//input') const scenes = new SceneBuilder() diff --git a/src/spec/leakTest.ts b/src/spec/leakTest.ts index 18145a2..ccdd2dd 100644 --- a/src/spec/leakTest.ts +++ b/src/spec/leakTest.ts @@ -1,15 +1,6 @@ -import * as fs from 'fs' import * as os from 'os' -import * as webdriverio from 'webdriverio' import mockMqtt, { stopUpdates as stopMqttUpdates } from './mock-mqtt' -import { - ClassNameMapping, - countInstancesOf, - createFakeMousePointer, - getHeapDump, - setFast, - sleep - } from './util' +import { ClassNameMapping, countInstancesOf, createFakeMousePointer, getHeapDump, setFast, sleep } from './util' import { clearSearch, searchTree } from './scenarios/searchTree' import { connectTo } from './scenarios/connect' import { reconnect } from './scenarios/reconnect' @@ -29,7 +20,13 @@ const options = { browserName: 'electron', chromeOptions: { binary: `${__dirname}/../../../node_modules/.bin/electron`, - args: [`--app=${__dirname}/../../..`, '--force-device-scale-factor=1', '--no-sandbox', '--disable-dev-shm-usage', '--disable-extensions'].concat(runningUiTestOnCi), + args: [ + `--app=${__dirname}/../../..`, + '--force-device-scale-factor=1', + '--no-sandbox', + '--disable-dev-shm-usage', + '--disable-extensions', + ].concat(runningUiTestOnCi), }, windowTypes: ['app', 'webview'], }, @@ -40,7 +37,7 @@ async function doStuff() { await mockMqtt() console.log('start webdriver') - const browser = await webdriverio.remote(options) + const browser = await WebdriverIO.remote(options) setFast() await createFakeMousePointer(browser) @@ -50,10 +47,10 @@ async function doStuff() { stopMqttUpdates() await sleep(1000, true) - let heapDump = await getHeapDump(browser) - const initialTreeOccurrances = await countInstancesOf(heapDump, ClassNameMapping.Tree) - const initialNodeOccurrances = await countInstancesOf(heapDump, ClassNameMapping.TreeNode) - console.log(initialTreeOccurrances, initialNodeOccurrances) + const heapDump = await getHeapDump(browser) + const initialTreeOccurrences = await countInstancesOf(heapDump, ClassNameMapping.Tree) + const initialNodeOccurrences = await countInstancesOf(heapDump, ClassNameMapping.TreeNode) + console.log(initialTreeOccurrences, initialNodeOccurrences) await doX(3, async () => { await reconnect(browser) @@ -74,36 +71,49 @@ async function doStuff() { await sleep(1000, true) - await waitForGarbageCollectorToDetermineLeak(browser, initialTreeOccurrances, initialNodeOccurrances) + await waitForGarbageCollectorToDetermineLeak(browser, initialTreeOccurrences, initialNodeOccurrences) } -async function waitForGarbageCollectorToDetermineLeak(browser: any, initialTreeOccurrances: number, initialNodeOccurrances: number) { +async function waitForGarbageCollectorToDetermineLeak( + browser: any, + initialTreeOccurrences: number, + initialNodeOccurrences: number +) { let delta = -1 - let lastTreeOccurances = -1 - let lastNodeOccurances = -1 + let lastTreeOccurrences = -1 + let lastNodeOccurrences = -1 let leak = false while (delta < 0) { - if (lastTreeOccurances !== -1) { + if (lastTreeOccurrences !== -1) { await sleep(10000, true) } const heapDump = await getHeapDump(browser) - const currentTreeOccurrances = await countInstancesOf(heapDump, ClassNameMapping.Tree) - const currentNodeOccurrances = await countInstancesOf(heapDump, ClassNameMapping.TreeNode) + const currentTreeOccurrences = await countInstancesOf(heapDump, ClassNameMapping.Tree) + const currentNodeOccurrences = await countInstancesOf(heapDump, ClassNameMapping.TreeNode) // Temporary "leaks" are expected due to React Fibers memoization - if (Math.abs(initialTreeOccurrances - currentTreeOccurrances) > 1 || Math.abs(currentNodeOccurrances - initialNodeOccurrances) > 8) { - console.error('Possible leak detected', initialTreeOccurrances, currentTreeOccurrances, initialNodeOccurrances, currentNodeOccurrances) + if ( + Math.abs(initialTreeOccurrences - currentTreeOccurrences) > 1 || + Math.abs(currentNodeOccurrences - initialNodeOccurrences) > 8 + ) { + console.error( + 'Possible leak detected', + initialTreeOccurrences, + currentTreeOccurrences, + initialNodeOccurrences, + currentNodeOccurrences + ) leak = true } else { leak = false } - const treeDelta = lastTreeOccurances >= 0 ? currentTreeOccurrances - lastTreeOccurances : -1 - const nodeDelta = lastTreeOccurances >= 0 ? currentNodeOccurrances - lastNodeOccurances : -1 + const treeDelta = lastTreeOccurrences >= 0 ? currentTreeOccurrences - lastTreeOccurrences : -1 + const nodeDelta = lastTreeOccurrences >= 0 ? currentNodeOccurrences - lastNodeOccurrences : -1 delta = treeDelta + nodeDelta - lastTreeOccurances = currentTreeOccurrances - lastNodeOccurances = currentNodeOccurrances + lastTreeOccurrences = currentTreeOccurrences + lastNodeOccurrences = currentNodeOccurrences } if (leak) { diff --git a/src/spec/mock-mqtt.ts b/src/spec/mock-mqtt.ts index abfe19b..6eba71a 100644 --- a/src/spec/mock-mqtt.ts +++ b/src/spec/mock-mqtt.ts @@ -1,23 +1,20 @@ import * as mqtt from 'mqtt' -const settings = { - port: 1883, -} - -let client: mqtt.MqttClient +let mqttClient: mqtt.MqttClient function startServer(): Promise { - return new Promise(async (resolve) => { - // const server = new mosca.Server(settings) - // await new Promise(resolve => server.once('ready', resolve)) - client = await connectMqtt() - generateData(client) - resolve(client) + return new Promise(async resolve => { + mqttClient = await connectMqtt() + generateData(mqttClient) + resolve(mqttClient) }) } function connectMqtt(): Promise { - return new Promise((resolve) => { - const client = mqtt.connect('mqtt://127.0.0.1:1883', { username: 'thomas', password: 'bierbier' }) + return new Promise(resolve => { + const client = mqtt.connect('mqtt://127.0.0.1:1883', { + username: 'thomas', + password: 'bierbier', + }) client.once('connect', () => { resolve(client) }) @@ -40,8 +37,10 @@ export function stopUpdates() { export function stop() { stopUpdates() try { - client && client.end() - } catch {} + mqttClient && mqttClient.end() + } catch { + // ignore + } } let intervals: any = [] @@ -49,20 +48,36 @@ let intervals: any = [] function generateData(client: mqtt.MqttClient) { client.publish('livingroom/lamp/state', 'on', { retain: true, qos: 0 }) client.publish('livingroom/lamp/brightness', '128', { retain: true, qos: 0 }) - client.publish('livingroom/thermostat/targetTemperature', '20°C', { retain: true, qos: 0 }) + client.publish('livingroom/thermostat/targetTemperature', '20°C', { + retain: true, + qos: 0, + }) intervals.push(setInterval(() => client.publish('livingroom/temperature', temperature()), 1000)) intervals.push(setInterval(() => client.publish('livingroom/humidity', temperature(60, -2, 0)), 1000)) client.publish('livingroom/lamp-1/state', 'on', { retain: true, qos: 0 }) - client.publish('livingroom/lamp-1/brightness', '48', { retain: true, qos: 0 }) + client.publish('livingroom/lamp-1/brightness', '48', { + retain: true, + qos: 0, + }) client.publish('livingroom/lamp-2/state', 'off', { retain: true, qos: 0 }) - client.publish('livingroom/lamp-2/brightness', '48', { retain: true, qos: 0 }) + client.publish('livingroom/lamp-2/brightness', '48', { + retain: true, + qos: 0, + }) client.publish('kitchen/lamp/state', 'off', { retain: true, qos: 0 }) client.subscribe('kitchen/lamp/set') client.on('message', (topic, payload) => { if (topic === 'kitchen/lamp/set') { - setTimeout(() => client.publish('kitchen/lamp/state', payload, { retain: true, qos: 0 }), 500) + setTimeout( + () => + client.publish('kitchen/lamp/state', payload, { + retain: true, + qos: 0, + }), + 500 + ) } }) @@ -74,7 +89,10 @@ function generateData(client: mqtt.MqttClient) { client.publish('garden/lamps/state', 'off', { retain: true, qos: 0 }) client.publish('garden/lamps/state', 'off', { retain: true, qos: 0 }) - client.publish('zigbee2mqtt/bridge/state', 'online', { retain: true, qos: 0 }) + client.publish('zigbee2mqtt/bridge/state', 'online', { + retain: true, + qos: 0, + }) client.publish('ble2mqtt/bridge/state', 'online', { retain: true, qos: 0 }) // Used for demonstrating "clean up" @@ -84,30 +102,33 @@ function generateData(client: mqtt.MqttClient) { // Just stuff client.publish('01-80-C2-00-00-0F/LWT', 'offline', { retain: true, qos: 0 }) - intervals.push(setInterval(() => { - client.publish('3d-printer/OctoPrint/temperature/bed', '{"_timestamp":1548589083,"actual":25.9,"target":0}') - client.publish('3d-printer/OctoPrint/temperature/tool0', '{"_timestamp":1548589093,"actual":26.4,"target":0}') - }, 3333)) + intervals.push( + setInterval(() => { + client.publish('3d-printer/OctoPrint/temperature/bed', '{"_timestamp":1548589083,"actual":25.9,"target":0}') + client.publish('3d-printer/OctoPrint/temperature/tool0', '{"_timestamp":1548589093,"actual":26.4,"target":0}') + }, 3333) + ) let state = true - intervals.push(setInterval(() => { - state = !state - const js = { - tags: { - entityId: 33512, - entityType: 'person', - host: 'd44ad81e10f9', - server: 'http://localhost/dataActuality', - status: state ? 'live' : 'inactive', - }, - timestamp: Date.now(), - } - client.publish( - 'actuality/showcase', - JSON.stringify(js), - { retain: true, qos: 0 } - ) - }, 2102)) + intervals.push( + setInterval(() => { + state = !state + const js = { + tags: { + entityId: 33512, + entityType: 'person', + host: 'd44ad81e10f9', + server: 'http://localhost/dataActuality', + status: state ? 'live' : 'inactive', + }, + timestamp: Date.now(), + } + client.publish('actuality/showcase', JSON.stringify(js), { + retain: true, + qos: 0, + }) + }, 2102) + ) } export default startServer diff --git a/src/spec/scenarios/clearOldTopics.ts b/src/spec/scenarios/clearOldTopics.ts index 657832a..74078c9 100644 --- a/src/spec/scenarios/clearOldTopics.ts +++ b/src/spec/scenarios/clearOldTopics.ts @@ -1,5 +1,5 @@ -import { clickOn, sleep, writeText, expandTopic, moveToCenterOfElement } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { clickOn, expandTopic, moveToCenterOfElement, sleep, writeText } from '../util' export async function clearOldTopics(browser: Browser) { const topics = ['hello', 'test 123'] diff --git a/src/spec/scenarios/connect.ts b/src/spec/scenarios/connect.ts index 6ec9138..8849a63 100644 --- a/src/spec/scenarios/connect.ts +++ b/src/spec/scenarios/connect.ts @@ -1,5 +1,5 @@ +import { Browser, Element } from 'webdriverio' import { clickOn, writeTextToInput } from '../util' -import { Browser } from 'webdriverio' export async function connectTo(host: string, browser: Browser) { await writeTextToInput('Host', host, browser) diff --git a/src/spec/scenarios/copyTopicToClipboard.ts b/src/spec/scenarios/copyTopicToClipboard.ts index c94e0d5..3608640 100644 --- a/src/spec/scenarios/copyTopicToClipboard.ts +++ b/src/spec/scenarios/copyTopicToClipboard.ts @@ -1,5 +1,5 @@ +import { Browser, Element } from 'webdriverio' import { clickOn } from '../util' -import { Browser } from 'webdriverio' export async function copyTopicToClipboard(browser: Browser) { const copyButton = await browser.$('//p[contains(text(), "Topic")]/span') diff --git a/src/spec/scenarios/copyValueToClipboard.ts b/src/spec/scenarios/copyValueToClipboard.ts index ffa5af4..a2c479e 100644 --- a/src/spec/scenarios/copyValueToClipboard.ts +++ b/src/spec/scenarios/copyValueToClipboard.ts @@ -1,5 +1,5 @@ -import { clickOn, sleep, writeText, expandTopic } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { clickOn, expandTopic, sleep, writeText } from '../util' export async function copyValueToClipboard(browser: Browser) { const copyButton = await browser.$('//p[contains(text(), "Value")]/span') diff --git a/src/spec/scenarios/disconnect.ts b/src/spec/scenarios/disconnect.ts index 1dcda41..9cf7cf2 100644 --- a/src/spec/scenarios/disconnect.ts +++ b/src/spec/scenarios/disconnect.ts @@ -1,5 +1,5 @@ +import { Browser, Element } from 'webdriverio' import { clickOn } from '../util' -import { Browser } from 'webdriverio' export async function disconnect(browser: Browser) { const disconnectButton = await browser.$('//button/span[contains(text(),"Disconnect")]') diff --git a/src/spec/scenarios/publishTopic.ts b/src/spec/scenarios/publishTopic.ts index 9c37971..e6bd9a3 100644 --- a/src/spec/scenarios/publishTopic.ts +++ b/src/spec/scenarios/publishTopic.ts @@ -1,5 +1,13 @@ -import { clickOn, sleep, writeText, delteTextWithBackspaces, expandTopic, moveToCenterOfElement, showText } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { + clickOn, + sleep, + writeText, + delteTextWithBackspaces, + expandTopic, + moveToCenterOfElement, + showText, +} from '../util' export async function publishTopic(browser: Browser) { await expandTopic('kitchen/lamp/state', browser) diff --git a/src/spec/scenarios/reconnect.ts b/src/spec/scenarios/reconnect.ts index ce51fe6..ba7340c 100644 --- a/src/spec/scenarios/reconnect.ts +++ b/src/spec/scenarios/reconnect.ts @@ -1,5 +1,5 @@ +import { Browser, Element } from 'webdriverio' import { clickOn } from '../util' -import { Browser } from 'webdriverio' export async function reconnect(browser: Browser) { const disconnectButton = await browser.$('//button/span[contains(text(),"Disconnect")]') diff --git a/src/spec/scenarios/searchTree.ts b/src/spec/scenarios/searchTree.ts index 63df210..407f717 100644 --- a/src/spec/scenarios/searchTree.ts +++ b/src/spec/scenarios/searchTree.ts @@ -1,5 +1,5 @@ -import { clickOn, sleep, writeText, delteTextWithBackspaces, showText } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { clickOn, delteTextWithBackspaces, showText, sleep, writeText } from '../util' export async function searchTree(text: string, browser: Browser) { const searchField = await browser.$('//input[contains(@placeholder, "Search")]') diff --git a/src/spec/scenarios/showAdvancedConnectionSettings.ts b/src/spec/scenarios/showAdvancedConnectionSettings.ts index 24cbe01..09aeea7 100644 --- a/src/spec/scenarios/showAdvancedConnectionSettings.ts +++ b/src/spec/scenarios/showAdvancedConnectionSettings.ts @@ -1,5 +1,5 @@ -import { clickOn, writeTextToInput, sleep } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { clickOn, sleep, writeTextToInput } from '../util' export async function showAdvancedConnectionSettings(browser: Browser) { const advancedSettingsButton = await browser.$('//button/span[contains(text(),"Advanced")]') diff --git a/src/spec/scenarios/showJsonFormatting.ts b/src/spec/scenarios/showJsonFormatting.ts index d913f60..667723e 100644 --- a/src/spec/scenarios/showJsonFormatting.ts +++ b/src/spec/scenarios/showJsonFormatting.ts @@ -1,8 +1,5 @@ -import { Browser } from 'webdriverio' -import { - clickOn, - sleep -} from '../util' +import { Browser, Element } from 'webdriverio' +import { clickOn, sleep } from '../util' export async function showJsonFormatting(browser: Browser) { const editor = await browser.$('//*[contains(@class, "ace_editor")]') diff --git a/src/spec/scenarios/showJsonPreview.ts b/src/spec/scenarios/showJsonPreview.ts index 9744f05..562d1f3 100644 --- a/src/spec/scenarios/showJsonPreview.ts +++ b/src/spec/scenarios/showJsonPreview.ts @@ -1,4 +1,4 @@ -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' import { expandTopic, sleep } from '../util' export async function showJsonPreview(browser: Browser) { diff --git a/src/spec/scenarios/showMenu.ts b/src/spec/scenarios/showMenu.ts index 897b3d5..8809732 100644 --- a/src/spec/scenarios/showMenu.ts +++ b/src/spec/scenarios/showMenu.ts @@ -1,5 +1,5 @@ -import { clickOn, sleep, writeText, expandTopic, moveToCenterOfElement, showText } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { clickOn, expandTopic, moveToCenterOfElement, showText, sleep, writeText } from '../util' export async function showMenu(browser: Browser) { const menuButton = await browser.$('//button[contains(@aria-label, "Menu")]') diff --git a/src/spec/scenarios/showNumericPlot.ts b/src/spec/scenarios/showNumericPlot.ts index 7b81980..345d626 100644 --- a/src/spec/scenarios/showNumericPlot.ts +++ b/src/spec/scenarios/showNumericPlot.ts @@ -1,5 +1,5 @@ -import { clickOn, sleep, writeText, expandTopic, clickOnHistory } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { clickOn, clickOnHistory, expandTopic, sleep, writeText } from '../util' export async function showNumericPlot(browser: Browser) { await expandTopic('livingroom/temperature', browser) diff --git a/src/spec/scenarios/showOffDiffCapability.ts b/src/spec/scenarios/showOffDiffCapability.ts index 481f21c..c9f06b3 100644 --- a/src/spec/scenarios/showOffDiffCapability.ts +++ b/src/spec/scenarios/showOffDiffCapability.ts @@ -1,5 +1,5 @@ -import { clickOn, sleep, showText } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { clickOn, showText, sleep } from '../util' // Expects a topic with at least two messages to be selected export async function showOffDiffCapability(browser: Browser) { diff --git a/src/spec/scenarios/showZoomLevel.ts b/src/spec/scenarios/showZoomLevel.ts index c385eab..6ffb553 100644 --- a/src/spec/scenarios/showZoomLevel.ts +++ b/src/spec/scenarios/showZoomLevel.ts @@ -1,5 +1,5 @@ -import { sleep, showKeys, showText } from '../util' -import { Browser } from 'webdriverio' +import { Browser, Element } from 'webdriverio' +import { showKeys, showText, sleep } from '../util' export async function showZoomLevel(browser: Browser) { await showKeys('Zoom in', 2000, browser, 'top', ['Ctrl', '+']) diff --git a/src/spec/util/expandTopic.ts b/src/spec/util/expandTopic.ts index 656774c..1d8fa5e 100644 --- a/src/spec/util/expandTopic.ts +++ b/src/spec/util/expandTopic.ts @@ -1,10 +1,10 @@ -import { Browser } from 'webdriverio' import { clickOn } from './' +import { Browser, Element } from 'webdriverio' export async function expandTopic(path: string, browser: Browser) { const originalTopics = path.split('/') let topics = path.split('/') - while (topics.length > 0 && !await topicMatches(topics, browser)) { + while (topics.length > 0 && !(await topicMatches(topics, browser))) { topics = topics.slice(0, topics.length - 1) } if (topics.length === 0) { @@ -18,12 +18,12 @@ export async function expandTopic(path: string, browser: Browser) { } } -async function topicMatches(topics: string[], browser: Browser) { +async function topicMatches(topics: Array, browser: Browser) { const result = await browser.$(topicSelector(topics)) return result.isExisting() } -function topicSelector(topics: string[]) { +function topicSelector(topics: Array) { const suffix = topics.map(topic => `*[contains(text(), "${topic}")]`).join('/../..//') return `//${suffix}` } diff --git a/src/spec/util/index.ts b/src/spec/util/index.ts index 5f11fae..404e24a 100644 --- a/src/spec/util/index.ts +++ b/src/spec/util/index.ts @@ -1,5 +1,6 @@ import * as fs from 'fs' import { Browser, Element } from 'webdriverio' + export { expandTopic } from './expandTopic' let fast = false @@ -8,7 +9,7 @@ export function setFast() { } export function sleep(ms: number, required = false) { - return new Promise((resolve) => { + return new Promise(resolve => { if (required) { setTimeout(resolve, ms) } else { @@ -39,9 +40,9 @@ export async function delteTextWithBackspaces(element: Element, browser: Browser export async function writeTextToInput(name: string, text: string, browser: Browser, wait: boolean = true) { const input = await browser.$(`//label[contains(text(), "${name}")]/..//input`) await clickOn(input, browser, 1) - wait && await sleep(500) + wait && (await sleep(500)) input.clearValue() - wait && await sleep(300) + wait && (await sleep(300)) await writeText(text, browser) } @@ -81,7 +82,13 @@ export async function createFakeMousePointer(browser: Browser) { await browser.execute(js) } -export async function showText(text: string, duration: number = 0, browser: Browser, location: 'top' | 'bottom' | 'middle' = 'bottom', keys = []) { +export async function showText( + text: string, + duration: number = 0, + browser: Browser, + location: 'top' | 'bottom' | 'middle' = 'bottom', + keys = [] +) { const js = `window.demo.showMessage('${text}', '${location}', ${duration});` await browser.execute(js) @@ -106,12 +113,16 @@ export enum ClassNameMapping { } export async function countInstancesOf(heapDump: HeapDump, className: ClassNameMapping): Promise { - return heapDump.nodes - .map((idx: number) => heapDump.strings[idx]) - .filter((s: string) => s === className).length + return heapDump.nodes.map((idx: number) => heapDump.strings[idx]).filter((s: string) => s === className).length } -export async function showKeys(text: string, duration: number = 0, browser: Browser, location: 'top' | 'bottom' | 'middle' = 'bottom', keys: string[] = []) { +export async function showKeys( + text: string, + duration: number = 0, + browser: Browser, + location: 'top' | 'bottom' | 'middle' = 'bottom', + keys: Array = [] +) { const js = `window.demo.showMessage('${text}', '${location}', ${duration}, ${JSON.stringify(keys)});` await browser.execute(js) diff --git a/tsconfig.json b/tsconfig.json index 5af6461..2f504c0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,14 @@ "moduleResolution": "node", "sourceRoot": "src/", "lib": ["es2017", "dom"], - "sourceMap": true + "sourceMap": true, + "types": ["node"] }, - "include": ["src/electron.ts", "src/spec/electron.ts", "src/spec/demoVideo.ts", "src/spec/leakTest.ts", "scripts/*.ts"] + "include": [ + "src/electron.ts", + "src/spec/electron.ts", + "src/spec/demoVideo.ts", + "src/spec/leakTest.ts", + "scripts/*.ts" + ] } diff --git a/tslint.json b/tslint.json index 555bfee..c0434d9 100644 --- a/tslint.json +++ b/tslint.json @@ -13,7 +13,9 @@ "array-type": [true, "generic"], "prefer-array-literal": false, "function-name": false, + "ter-arrow-parens": [true, "as-needed"], "variable-name": [true, "ban-keywords", "check-format", "allow-pascal-case"], + "no-implicit-dependencies": [true, "dev", "optional"], "trailing-comma": [ true, { diff --git a/yarn.lock b/yarn.lock index fa5f3ef..37f09ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -180,7 +180,7 @@ dependencies: "@types/node" "*" -"@wdio/config@^5.9.4": +"@wdio/config@^5.4.20", "@wdio/config@^5.9.4": version "5.9.4" resolved "https://registry.yarnpkg.com/@wdio/config/-/config-5.9.4.tgz#f8b992d421b9311842facffd5c17da4b1573c7c7" integrity sha512-wlQJJfXwR28xktsXpOC7s/+fWcLAKhIB6s6slCREm3RvcJBfJ9pM4z9lrBRAiawvI4bpNBl8EdUZrRwCtGlkJQ== @@ -189,7 +189,7 @@ deepmerge "^3.2.0" glob "^7.1.2" -"@wdio/logger@^5.9.3": +"@wdio/logger@^5.4.6", "@wdio/logger@^5.9.3": version "5.9.3" resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-5.9.3.tgz#8aab6f1e8aafe7b655b0840e0ed9dcfd70744887" integrity sha512-tpvu/wQqLAaShIIqZr7e/xl3lt9IeE6z/9DN59r+6xTC+RfD8YJ3D1n/c2jOsGbs/IW8RSWRvOERBWvpPcyQxw== @@ -199,18 +199,30 @@ loglevel-plugin-prefix "^0.8.4" strip-ansi "^5.2.0" -"@wdio/repl@^5.9.4": +"@wdio/repl@^5.4.20": version "5.9.4" resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-5.9.4.tgz#a786c9c8f98a71faf604d268029569e5111d7b4f" integrity sha512-PMpBB8+6uCVgP1D4iLnINKX9fTmQqX5DSnwtiTC90NYYmU3lNcZgt5NBJFfK6tRPu6cQyU3CeG8yXrf1e+9e5A== dependencies: "@wdio/config" "^5.9.4" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + about-window@^1.12.1: version "1.13.0" resolved "https://registry.yarnpkg.com/about-window/-/about-window-1.13.0.tgz#8652f31a9631f38941bd4f92e31c1d62658ee95f" integrity sha512-/AdIW/g1zre3d2OKQJTbZqfJWoVQvJ5ABmxU8IhwbxpA34wVNlHXIXlrCJphs4dxb+qpzmoMjCCf64dq5aXA0w== +add-line-numbers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" + integrity sha1-SNu96kfb0jTer+rGyTzqb3C0t+M= + dependencies: + pad-left "^1.0.2" + ajv-keywords@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" @@ -312,6 +324,16 @@ append-transform@^1.0.0: dependencies: default-require-extensions "^2.0.0" +append-type@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-type/-/append-type-1.0.2.tgz#a492f350e81ddcb46b787fc605becf6dd8bccbf6" + integrity sha512-hac740vT/SAbrFBLgLIWZqVT5PUAcGTWS5UkDDhr+OCizZSw90WKw6sWAEgGaYd2viIblggypMXwpjzHXOvAQg== + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + archiver-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" @@ -343,6 +365,14 @@ archy@^1.0.0: resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + arg@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" @@ -375,6 +405,11 @@ array-reduce@~0.0.0: resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= +array-to-sentence@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" + integrity sha1-yASVba+lMjJJWyBalFJ1OiWNOfw= + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -387,6 +422,14 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assert-valid-glob-opts@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-valid-glob-opts/-/assert-valid-glob-opts-1.0.0.tgz#ab9b5438ec5e929f5bb08201819affb1227f730a" + integrity sha512-/mttty5Xh7wE4o7ttKaUpBJl0l04xWe3y6muy1j27gyzSsnceK0AYU9owPtUoL9z8+9hnPxztmuhdFZ7jRoyWw== + dependencies: + glob-option-error "^1.0.0" + validate-glob-opts "^1.0.0" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -402,6 +445,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== +async@>=0.2.9: + version "3.0.1" + resolved "https://registry.yarnpkg.com/async/-/async-3.0.1.tgz#dfeb34657d1e63c94c0eee424297bf8a2c9a8182" + integrity sha512-ZswD8vwPtmBZzbn9xyi8XBQWXH3AvOQ43Za1KWYq7JeycrZuUYzx01KvHcVbXltjqH4y0MWrQ33008uLTqXuDw== + async@^2.0.0: version "2.6.2" resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" @@ -414,6 +462,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +atob-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" + integrity sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs= + atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -470,6 +523,18 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" + integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= + bl@^1.0.0, bl@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" @@ -485,7 +550,14 @@ bluebird-lst@^1.0.6, bluebird-lst@^1.0.7, bluebird-lst@^1.0.8: dependencies: bluebird "^3.5.4" -bluebird@^3.5.0, bluebird@^3.5.4: +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.0, bluebird@^3.5.4, bluebird@^3.5.5: version "3.5.5" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== @@ -511,6 +583,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -572,6 +651,16 @@ builder-util-runtime@^8.2.2, builder-util-runtime@^8.2.3: fs-extra-p "^8.0.0" sax "^1.2.4" +builder-util-runtime@^8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.2.5.tgz#6f19330178345f8ce2c65842b0a9cf6a187d5946" + integrity sha512-YILT+YUlxrE3yNB6mDC1tF+Q24mr1LSYdjP5U861jbBeDZfvy1/VPDzW3boMVrDtzYnDnvkYrzLJnoh6TXA75w== + dependencies: + bluebird-lst "^1.0.9" + debug "^4.1.1" + fs-extra-p "^8.0.2" + sax "^1.2.4" + builder-util-runtime@~8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.1.1.tgz#f2f6fc43e33d26892bd491667fc746ad69bccc50" @@ -721,6 +810,11 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= +chownr@^1.0.1, chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" @@ -781,7 +875,7 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -798,6 +892,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -805,11 +920,18 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.12.1, commander@~2.20.0: +commander@^2.12.1, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +comment-json@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-1.1.3.tgz#6986c3330fee0c4c9e00c2398cd61afa5d8f239e" + integrity sha1-aYbDMw/uDEyeAMI5jNYa+l2PI54= + dependencies: + json-parser "^1.0.0" + commist@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/commist/-/commist-1.1.0.tgz#17811ec6978f6c15ee4de80c45c9beb77cee35d5" @@ -865,6 +987,23 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + convert-source-map@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" @@ -953,6 +1092,201 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +cspell-dict-companies@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/cspell-dict-companies/-/cspell-dict-companies-1.0.10.tgz#694fd485d3fef077971f4b517d8f7e97b9d42563" + integrity sha512-mLJnxxtkQt4nX2uWwz1BfAmq03Q0YyM5Gjh4uf4EFhT/8v7KJ/gGWBvjPZuUlOnyqNFG1FdKFNyH23WP3SI6uA== + dependencies: + configstore "^4.0.0" + +cspell-dict-cpp@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/cspell-dict-cpp/-/cspell-dict-cpp-1.1.19.tgz#913e5a5e100ba7f1a6371fde0610b2d30e543527" + integrity sha512-KaKDc4H7FwjZnGL2kjn7fa6SXbymETKVyDWwq/XmoI2q16ZOrs0pYz/aOVjBwBbFy3QNmDIKODswYe0FSQhDNA== + dependencies: + configstore "^4.0.0" + +cspell-dict-django@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/cspell-dict-django/-/cspell-dict-django-1.0.11.tgz#d368ecd7d95a362855584a58df847fec1412e162" + integrity sha512-cCVDgYTxHjNGsXOkOXFlIFFYyD/+QKa4P5gjAO+ftVe5YkYLgR/ToIqBjLkeMpd5XLcUp9I2+4qAW4bXUGXvhA== + dependencies: + configstore "^4.0.0" + +cspell-dict-elixir@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/cspell-dict-elixir/-/cspell-dict-elixir-1.0.9.tgz#2ae775684f1a5004eb841d68f3697257f0e1e89b" + integrity sha512-gez2DdKiiR0z51kGR8YI61qW5ARKDgoOxlwz9w84biCWDeN0m3th/xqFDf7D6IaA9PosNhSk1uD/OgoIWLH3mA== + dependencies: + configstore "^4.0.0" + +cspell-dict-en-gb@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/cspell-dict-en-gb/-/cspell-dict-en-gb-1.1.10.tgz#4baa5cc39661f017b226ba27bc7cefa3f54bcd89" + integrity sha512-Gx6vcaHBnNzYs9W9LlSjomYq1XCw9+aGVsU+Ayl3oMG5zuJGi3I7G5xPyWcTTkWqb6/z6F5LXnW/vFtkTGE5fg== + dependencies: + configstore "^4.0.0" + +cspell-dict-en_us@^1.2.16: + version "1.2.16" + resolved "https://registry.yarnpkg.com/cspell-dict-en_us/-/cspell-dict-en_us-1.2.16.tgz#30f7f1c2f3ae6fb2248e1514dbfbac4f3dc84481" + integrity sha512-qrc5Mh2hWT53jlcDo3hFFvAgC+hpekQnNN5seHohz6yWr2XeAsATZP/2ftnrKadZ1iAkeJU2LABymhzK+ZAIHg== + dependencies: + configstore "^4.0.0" + +cspell-dict-fullstack@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/cspell-dict-fullstack/-/cspell-dict-fullstack-1.0.13.tgz#9cdcc829cba4eebc99b725e8a71c2bcdc84398a2" + integrity sha512-2173pXRCNzC6v5ACFlbFAfp5HNcoX5ANYcAHtNa/cBIjP4G0ASdLJY1SRSPBojNh3qxAulwIASck4fX3DgGe1A== + dependencies: + configstore "^4.0.0" + +cspell-dict-golang@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/cspell-dict-golang/-/cspell-dict-golang-1.1.11.tgz#fd84f77cc2dff0a0f404c2d0d489e895c2d5e327" + integrity sha512-dInmq72nAtTBV4B1kX+6STIpKzMNfFTrzC1YBE3x3AKMdyCvKpuoIQHHpm/PFsfIeW2hiu+ZZrTYv1xc+diGlw== + dependencies: + configstore "^4.0.0" + +cspell-dict-html-symbol-entities@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/cspell-dict-html-symbol-entities/-/cspell-dict-html-symbol-entities-1.0.10.tgz#08e79b8c38cc23702f26f2c2c615cea2b9145122" + integrity sha512-8467CM6fUGnw9biN1OSJ2vXNe/I3UQrOv+rWhOJ79YiYz2rlNMZzIKmizIIvH03OqVHnzKtnHdP+udmyqHOMvQ== + dependencies: + configstore "^4.0.0" + +cspell-dict-java@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/cspell-dict-java/-/cspell-dict-java-1.0.9.tgz#61a527c6bb37a00880bbc23885594575e288ff4f" + integrity sha512-z3u1SZ9IpwhmQ9wps1qj0BTtkNNz6piMcDxzMOQDkTM+hkK/BSLEJ/+DMsnKr1Kiob1mde8LxHr/MvB9qcWXtQ== + dependencies: + configstore "^4.0.0" + +cspell-dict-latex@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/cspell-dict-latex/-/cspell-dict-latex-1.0.10.tgz#30da58a5605534dfeab3a6ea5e09f4d696540202" + integrity sha512-H2Kdu/7N5rcPpjr/5qBPdWluu2+0SdQaFrqZPWyn8XYXpYAs9YLqvsl+0MgyV3VTUJPAbz1B34UvByLfZy7FWg== + dependencies: + configstore "^4.0.0" + +cspell-dict-lorem-ipsum@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/cspell-dict-lorem-ipsum/-/cspell-dict-lorem-ipsum-1.0.9.tgz#544706b25a21ebffd115f9f064ab6984c9666cce" + integrity sha512-cGZ8vkt6dfZGZm/pMtnvYZ4coPHA/FyYL0cuA8fy30wNTdW00CnWWilQvdh0JH53eSTDDWNO9x8Uz+OFIgOeLA== + dependencies: + configstore "^4.0.0" + +cspell-dict-php@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/cspell-dict-php/-/cspell-dict-php-1.0.10.tgz#edde59bbe4d0f481886e1139a354ecaeda0c1221" + integrity sha512-9efe0p3eL8gPtjanYdMqXSj6G7SdIZaz2kiDH3vWP4qc9j4oa67rq/F+WxsLcZuye7Scm9Tw1nZWetvs/u0M8w== + dependencies: + configstore "^4.0.0" + +cspell-dict-powershell@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cspell-dict-powershell/-/cspell-dict-powershell-1.0.1.tgz#59a65426674dbd5805c84142ab616fc7deca70dc" + integrity sha512-uNmnu2wn+Yw6JDnt4jdu08HvEmZjbxbndtkStfDqIdhg/iBFRdm4VUZIY7vL5Z5xPwAgC9QwT6h86mqT8ZnCag== + dependencies: + configstore "^4.0.0" + +cspell-dict-python@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/cspell-dict-python/-/cspell-dict-python-1.0.12.tgz#c3a1b76f4eaf11ed4b3d2e8ef1c748e8a6cda461" + integrity sha512-h82By/vlnZvaag0mn+Qoj4yURZ0s/5/hpNwmIWiQWSHK61b9GMcZSmFLoJ7Nc8wi8NkxYJdL3ot5mmjBzHVPiA== + dependencies: + configstore "^4.0.0" + +cspell-dict-rust@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/cspell-dict-rust/-/cspell-dict-rust-1.0.9.tgz#cc804152537db0b812b8d2ca22bd987758f14103" + integrity sha512-8KiEawwcixyVw8EuTTQIcxHc3GTxQ3PFW+T9D8r+Y4crw5JcJeyOQlRHZcyG2+2qAhamS+tlAh/puaKwANuWWg== + dependencies: + configstore "^4.0.0" + +cspell-dict-scala@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/cspell-dict-scala/-/cspell-dict-scala-1.0.8.tgz#b7ed4df50e7c97a674d196a5953675db3ef88bfc" + integrity sha512-/t2SyLnl/zaOBilTWlBNsD2X/Sd6+WyUi5REKQhopQ1MoJc9AFUavI17ZIFHq/vCyu1ziO7xslFWYRTwfQ8yBA== + dependencies: + configstore "^4.0.0" + +cspell-glob@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-0.1.10.tgz#86c5af07dd46c2c2827a7378ffeee1c212349fba" + integrity sha512-zE8dnd5c3HA5J6mFgdKJY7cC9CUOQBCPUvRn88VRJbz1UOqezCYs2oaWZwzaZq3t2aQaR3LPsHx6022t8M5ufg== + dependencies: + micromatch "^4.0.2" + +cspell-io@^4.0.16: + version "4.0.16" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-4.0.16.tgz#0cadeace4320ac78a1d219d9a5974c6d24260e81" + integrity sha512-DDCsWbMMn2lPBASYddAt1tXpR+F5W9LnsGHz+z2uJe34ByilBEslnChyl35B5Kz46oecZM7re08qYjLEF47omw== + dependencies: + iconv-lite "^0.4.24" + iterable-to-stream "^1.0.1" + +cspell-lib@^4.0.20: + version "4.0.20" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-4.0.20.tgz#9f3c82b4c061c8715450865bf1ad8e362c52a307" + integrity sha512-Y6fxoe+dKL/VUjyBOaVvwIMR98Kq04C451H/qDEQHt5sDP5+TEo9AgvyWee+QhA1KV4fOGfOrLwOaSf0HPRDZQ== + dependencies: + comment-json "^1.1.3" + configstore "^4.0.0" + cspell-dict-companies "^1.0.10" + cspell-dict-cpp "^1.1.19" + cspell-dict-django "^1.0.11" + cspell-dict-elixir "^1.0.9" + cspell-dict-en-gb "^1.1.10" + cspell-dict-en_us "^1.2.16" + cspell-dict-fullstack "^1.0.13" + cspell-dict-golang "^1.1.11" + cspell-dict-html-symbol-entities "^1.0.10" + cspell-dict-java "^1.0.9" + cspell-dict-latex "^1.0.10" + cspell-dict-lorem-ipsum "^1.0.9" + cspell-dict-php "^1.0.10" + cspell-dict-powershell "^1.0.1" + cspell-dict-python "^1.0.12" + cspell-dict-rust "^1.0.9" + cspell-dict-scala "^1.0.8" + cspell-io "^4.0.16" + cspell-trie-lib "^4.0.14" + cspell-util-bundle "^4.0.4" + fs-extra "^7.0.1" + gensequence "^2.1.2" + vscode-uri "^2.0.1" + +cspell-trie-lib@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-4.0.14.tgz#614e538eee59847057af5cb540b776c6a6724d0e" + integrity sha512-wQWZg0ppmYobH1I8fEX7nBW4L/gAhHpG0hx9ywwLDBfrUSkNccyey6ttm4fovkTbHxw6y7G8FYFCu8oqxQWkTw== + dependencies: + gensequence "^2.1.2" + js-xxhash "^1.0.1" + +cspell-util-bundle@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/cspell-util-bundle/-/cspell-util-bundle-4.0.4.tgz#fb563d2003c3362c8dba20c9509b535e6a666c26" + integrity sha512-rJ5lz9j5TglN1WfaFTiA5eoEQwWixGMIL9dTNTbZe2XU+Owz3KhCmHUJO5xnYPNF88AnT6x/oo2qnve3/WUJ0g== + +cspell@^4.0.23: + version "4.0.23" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-4.0.23.tgz#0b33349c984cc85203f6702d52065738324b435b" + integrity sha512-RQEPn+e0hTO1zaX9ci9MHOhnZYLquKQYzbnhM3BYe/0QBwnCWP5NyUl/eMAjxxI46LePsyAxC1g4PiLdxtQwag== + dependencies: + chalk "^2.4.2" + commander "^2.20.0" + comment-json "^1.1.3" + configstore "^4.0.0" + cspell-glob "^0.1.10" + cspell-lib "^4.0.20" + fs-extra "^7.0.1" + gensequence "^2.1.2" + get-stdin "^7.0.0" + glob "^7.1.4" + minimatch "^3.0.4" + css-parse@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" @@ -982,6 +1316,13 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +cwise-compiler@^1.0.0, cwise-compiler@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" + integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + dependencies: + uniq "^1.0.0" + d@1: version "1.0.0" resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" @@ -996,6 +1337,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-uri-to-buffer@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz#18ae979a6a0ca994b0625853916d2662bbae0b1a" + integrity sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo= + debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1034,6 +1380,13 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -1075,6 +1428,16 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + dev-null@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" @@ -1136,6 +1499,11 @@ dotenv@^6.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== +dup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" + integrity sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk= + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -1382,6 +1750,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +esprima@^2.7.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -1418,6 +1791,19 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -1444,6 +1830,11 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -1495,6 +1886,45 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +ffmpeg-concat@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/ffmpeg-concat/-/ffmpeg-concat-1.0.13.tgz#a8e3bfdbf7491e9dbf5496b1ee404146051c7079" + integrity sha512-KJoimEMXJDLVLMj236ZnjBqPxa4nyDqoZS5uG9eViAuC/+0hx588O3t79wdHCMHfBbp67dOR83KhbhidmYOgHQ== + dependencies: + commander "^2.19.0" + ffmpeg-on-progress "^1.0.0" + ffmpeg-probe "^1.0.6" + fluent-ffmpeg "^2.1.2" + fs-extra "^7.0.1" + get-pixels "^3.3.2" + gl "^4.2.2" + gl-buffer "^2.1.2" + gl-texture2d "^2.1.0" + gl-transition "^1.13.0" + gl-transitions "^1.43.0" + left-pad "^1.3.0" + ndarray "^1.0.18" + p-map "^2.0.0" + p-race "^2.0.0" + rmfr "^2.0.0" + sharp "^0.22.0" + tempy "^0.2.1" + url-parse "^1.4.4" + +ffmpeg-on-progress@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ffmpeg-on-progress/-/ffmpeg-on-progress-1.0.0.tgz#f2e2d99b5f8164bebf5c33a445528353edd08304" + integrity sha1-8uLZm1+BZL6/XDOkRVKDU+3QgwQ= + dependencies: + hh-mm-ss "^1.2.0" + +ffmpeg-probe@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ffmpeg-probe/-/ffmpeg-probe-1.0.6.tgz#4dbb127665ef290fb1b3b51cbecca2d8c7c72406" + integrity sha512-zxH4MYEtrbafVQ5p1doGzHjUmjt3zI4cdKFSNVbBMKy0bTc/KwqYwnGsnQVlyBcXgqBPw2YwGBEWF53MRLh3Sw== + dependencies: + execa "^0.10.0" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -1502,6 +1932,18 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + find-cache-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -1533,6 +1975,14 @@ flat@^4.1.0: dependencies: is-buffer "~2.0.3" +fluent-ffmpeg@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz#c952de2240f812ebda0aa8006d7776ee2acf7d74" + integrity sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ= + dependencies: + async ">=0.2.9" + which "^1.1.1" + follow-redirects@1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" @@ -1579,6 +2029,11 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-copy-file-sync@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" + integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== + fs-extra-p@^7.0.0, fs-extra-p@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-7.0.1.tgz#4eec0b6dfa150fa90f6ddd773b4fb1d55cad54e3" @@ -1595,6 +2050,14 @@ fs-extra-p@^8.0.0: bluebird-lst "^1.0.8" fs-extra "^8.0.0" +fs-extra-p@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-8.0.2.tgz#3b8e03ad963358570b70a152b2ee8d1c9eed5bf4" + integrity sha512-dpWboLA/OlyuqGQdsTjC2PKNkise3O4ptcMpXoyfeM/VXrthkEape3I+drWLI0JAW46r1D3eb6QBSPkSyXPXzA== + dependencies: + bluebird-lst "^1.0.9" + fs-extra "^8.0.1" + fs-extra@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -1622,6 +2085,13 @@ fs-extra@^8.0.0, fs-extra@^8.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + dependencies: + minipass "^2.2.1" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1632,6 +2102,20 @@ function-bind@^1.0.2, function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gaze@~1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" @@ -1639,6 +2123,11 @@ gaze@~1.1.2: dependencies: globule "^1.0.0" +gensequence@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-2.1.2.tgz#ab213a705bf88699a1ab1f6b9a1b4ed487423488" + integrity sha512-TH0HcxnR7gpvpdMbiQ7+mL10Vf+9zekenuaSmUl7dHWzzeiiaCelk3Xv3V2ebrsVMLfi1KJ8Q0CpGthaxiM9zQ== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -1654,11 +2143,33 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +get-pixels@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/get-pixels/-/get-pixels-3.3.2.tgz#3f62fb8811932c69f262bba07cba72b692b4ff03" + integrity sha512-6ar+8yPxRd1pskEcl2GSEu1La0+xYRjjnkby6AYiRDDwZ0tJbPQmHnSeH9fGLskT8kvR0OukVgtZLcsENF9YKQ== + dependencies: + data-uri-to-buffer "0.0.3" + jpeg-js "^0.3.2" + mime-types "^2.0.1" + ndarray "^1.0.13" + ndarray-pack "^1.1.1" + node-bitmap "0.0.1" + omggif "^1.0.5" + parse-data-uri "^0.2.0" + pngjs "^3.3.3" + request "^2.44.0" + through "^2.3.4" + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stdin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" + integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -1678,6 +2189,81 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +gl-buffer@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gl-buffer/-/gl-buffer-2.1.2.tgz#2db8d9c1a5527fba0cdb91289c206e882b889cdb" + integrity sha1-LbjZwaVSf7oM25EonCBuiCuInNs= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.1.0" + typedarray-pool "^1.0.0" + +gl-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" + integrity sha1-WXpQTjZHUP9QJTqjX43qevSl0jM= + +gl-format-compiler-error@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz#0c79b1751899ce9732e86240f090aa41e98471a8" + integrity sha1-DHmxdRiZzpcy6GJA8JCqQemEcag= + dependencies: + add-line-numbers "^1.0.1" + gl-constants "^1.0.0" + glsl-shader-name "^1.0.0" + sprintf-js "^1.0.3" + +gl-shader@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.2.1.tgz#bc9b808e9293c51b668e88de615b0c113708dc2f" + integrity sha1-vJuAjpKTxRtmjojeYVsMETcI3C8= + dependencies: + gl-format-compiler-error "^1.0.2" + weakmap-shim "^1.1.0" + +gl-texture2d@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" + integrity sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.2.2" + typedarray-pool "^1.1.0" + +gl-transition@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/gl-transition/-/gl-transition-1.13.0.tgz#69b07f26e51930edd24a6922b10cb74e134603fd" + integrity sha1-abB/JuUZMO3SSmkisQy3ThNGA/0= + dependencies: + gl-shader "^4.2.1" + +gl-transitions@^1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/gl-transitions/-/gl-transitions-1.43.0.tgz#790ce78f6713c75caba2b354764d7497971edcfd" + integrity sha1-eQznj2cTx1yrorNUdk10l5ce3P0= + +gl@^4.2.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/gl/-/gl-4.3.3.tgz#b8b91f4718397e67803b4d95a0c4c443425dd462" + integrity sha512-a16acSGmSLoyX4s6QjzIWI4LYsxztvr7aR8vt8anZpA4RboTrQ21ZQCQ8WcKWnQp/dn+nSYnw1fn5rHH9D85jQ== + dependencies: + bindings "^1.5.0" + bit-twiddle "^1.0.2" + glsl-tokenizer "^2.0.2" + nan "^2.14.0" + node-gyp "^4.0.0" + prebuild-install "^5.1.0" + +glob-option-error@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glob-option-error/-/glob-option-error-1.0.0.tgz#57cc65def9c7d5c1461baf13129bb5403cff6176" + integrity sha1-V8xl3vnH1cFGG68TEpu1QDz/YXY= + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -1714,7 +2300,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== @@ -1747,6 +2333,21 @@ globule@^1.0.0: lodash "~4.17.10" minimatch "~3.0.2" +glsl-shader-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz#a2c30b3ba73499befb0cc7184d7c7733dd4b487d" + integrity sha1-osMLO6c0mb77DMcYTXx3M91LSH0= + dependencies: + atob-lite "^1.0.0" + glsl-tokenizer "^2.0.2" + +glsl-tokenizer@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" + integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== + dependencies: + through2 "^0.6.3" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -1825,6 +2426,11 @@ has-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1854,6 +2460,13 @@ help-me@^1.0.1: through2 "^2.0.1" xtend "^4.0.0" +hh-mm-ss@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hh-mm-ss/-/hh-mm-ss-1.2.0.tgz#6d0f0b8280824a634cb1d1f20e0bc7bc8b689948" + integrity sha512-f4I9Hz1dLpX/3mrEs7yq30+FiuO3tt5NWAqAGeBTaoeoBfB8vhcQ3BphuDc5DjZb/K809agqrAaFlP0jhEU/8w== + dependencies: + zero-fill "^2.2.3" + hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -1897,6 +2510,13 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indexed-filter@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/indexed-filter/-/indexed-filter-1.0.3.tgz#7911439191cac588188464640a8db4f6b324973d" + integrity sha512-oBIzs6EARNMzrLgVg20fK52H19WcRHBiukiiEkw9rnnI//8rinEBMLrYdwEfJ9d4K7bjV1L6nSGft6H/qzHNgQ== + dependencies: + append-type "^1.0.1" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1935,6 +2555,13 @@ inquirer@~3.3.0: strip-ansi "^4.0.0" through "^2.3.6" +inspect-with-kind@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/inspect-with-kind/-/inspect-with-kind-1.0.5.tgz#fce151d4ce89722c82ca8e9860bb96f9167c316c" + integrity sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g== + dependencies: + kind-of "^6.0.2" + inversify@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.0.1.tgz#500d709b1434896ce5a0d58915c4a4210e34fb6e" @@ -1945,6 +2572,11 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +iota-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" + integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -1958,7 +2590,12 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-buffer@^1.1.5: +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -1992,6 +2629,11 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= +is-empty-iterable@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-empty-iterable/-/is-empty-iterable-2.1.0.tgz#59e576286c4b676b726e08524426cc00d5eada7b" + integrity sha512-CeQALg8gB8j73kUr/V/O97j5CmoOOTLuTE4AOC0yp91g532ZUm3upJBYq6Zm/QIpXmMXUwC/2ZMTih3ENse/hQ== + is-extglob@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2041,6 +2683,11 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -2053,6 +2700,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -2200,6 +2852,16 @@ istanbul-reports@^2.2.4: dependencies: handlebars "^4.1.2" +iterable-to-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/iterable-to-stream/-/iterable-to-stream-1.0.1.tgz#37e86baacf6b1a0e9233dad4eb526d0423d08bf3" + integrity sha512-O62gD5ADMUGtJoOoM9U6LQ7i4byPXUNoHJ6mqsmkQJcom331ZJGDApWgDESWyBMEHEJRjtHozgIiTzYo9RU4UA== + +jpeg-js@^0.3.2: + version "0.3.5" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.3.5.tgz#6fbd6cd0e49627c5a0341796c9e50c70a2aa3673" + integrity sha512-hvaExqwmQDS8O9qnZAVDXGWU43Tbu1V0wMZmjROjT11jloSgGICZpscG+P6Nyi1BVAvyu2ARRx8qmEW30sxgdQ== + js-base64@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" @@ -2210,6 +2872,11 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-xxhash@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-xxhash/-/js-xxhash-1.0.1.tgz#8ef97ff13576abac8539e91512a4033f0e9d69c5" + integrity sha512-ociwKjHkCPjqNMmZtD7uUoL+AVhcSZX3WPmirRwXg+PzKD0v5x9K2yLpvkSglbThvbGN/TVA+3XFjPVolQwDpQ== + js-yaml@3.13.1, js-yaml@^3.12.0, js-yaml@^3.12.1, js-yaml@^3.13.0, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -2233,6 +2900,13 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parser@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/json-parser/-/json-parser-1.1.5.tgz#e62ec5261d1a6a5fc20e812a320740c6d9005677" + integrity sha1-5i7FJh0aal/CDoEqMgdAxtkAVnc= + dependencies: + esprima "^2.7.0" + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2290,6 +2964,11 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -2316,6 +2995,11 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -2360,16 +3044,6 @@ lodash.isequal@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash.isobject@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - lodash.merge@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" @@ -2503,12 +3177,20 @@ merge-source-map@^1.1.0: dependencies: source-map "^0.6.1" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + mime-db@1.40.0: version "1.40.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.0.1, mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.24" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== @@ -2530,6 +3212,11 @@ mimic-fn@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2552,6 +3239,21 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minipass@^2.2.1, minipass@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -2639,6 +3341,39 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +nan@^2.13.2, nan@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +napi-build-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" + integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== + +ndarray-ops@^1.1.0, ndarray-ops@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" + integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= + dependencies: + cwise-compiler "^1.0.0" + +ndarray-pack@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" + integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + dependencies: + cwise-compiler "^1.1.2" + ndarray "^1.0.13" + +ndarray@^1.0.13, ndarray@^1.0.15, ndarray@^1.0.18: + version "1.0.18" + resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.18.tgz#b60d3a73224ec555d0faa79711e502448fd3f793" + integrity sha1-tg06cyJOxVXQ+qeXEeUCRI/T95M= + dependencies: + iota-array "^1.0.0" + is-buffer "^1.0.2" + neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" @@ -2659,6 +3394,18 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-abi@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.8.0.tgz#bd2e88dbe6a6871e6dd08553e0605779325737ec" + integrity sha512-1/aa2clS0pue0HjckL62CsbhWWU35HARvBDXcJtYKbYR7LnIutmpxmXbuDMV9kEviD2lP/wACOgWmmwljghHyQ== + dependencies: + semver "^5.4.1" + +node-bitmap@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/node-bitmap/-/node-bitmap-0.0.1.tgz#180eac7003e0c707618ef31368f62f84b2a69091" + integrity sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE= + node-environment-flags@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" @@ -2667,6 +3414,35 @@ node-environment-flags@1.0.5: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" +node-gyp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-4.0.0.tgz#972654af4e5dd0cd2a19081b4b46fe0442ba6f45" + integrity sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA== + dependencies: + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^4.4.8" + which "1" + +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -2696,6 +3472,16 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nugget@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" @@ -2750,7 +3536,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -2783,6 +3569,11 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.2" es-abstract "^1.5.1" +omggif@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/omggif/-/omggif-1.0.9.tgz#dcb7024dacd50c52b4d303f04802c91c057c765f" + integrity sha1-3LcCTazVDFK00wPwSALJHAV8dl8= + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2812,7 +3603,7 @@ ordered-read-streams@^1.0.0: dependencies: readable-stream "^2.0.1" -os-homedir@^1.0.1: +os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= @@ -2826,11 +3617,19 @@ os-locale@^3.0.0, os-locale@^3.1.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +osenv@0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -2860,6 +3659,18 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-race@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-race/-/p-race-2.1.0.tgz#7b1b87bea4b9c5581b63e0344fd25e36dd9ddd30" + integrity sha512-BiZlNIdxmgVnjl7wX8pWlnlhM7GzomYT804WbAoAW4782iFWG3FRwME1tm/Gh8KNYlhjNY+EgQL0fKYral5aLw== + dependencies: + is-empty-iterable "^2.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -2885,6 +3696,13 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +pad-left@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-1.0.2.tgz#19e5735ea98395a26cedc6ab926ead10f3100d4c" + integrity sha1-GeVzXqmDlaJs7carkm6tEPMQDUw= + dependencies: + repeat-string "^1.3.0" + pako@^1.0.7, pako@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" @@ -2897,6 +3715,13 @@ parse-color@^1.0.0: dependencies: color-convert "~0.5.0" +parse-data-uri@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/parse-data-uri/-/parse-data-uri-0.2.0.tgz#bf04d851dd5c87b0ab238e5d01ace494b604b4c9" + integrity sha1-vwTYUd1ch7CrI45dAazklLYEtMk= + dependencies: + data-uri-to-buffer "0.0.3" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -2987,6 +3812,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3030,11 +3860,43 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" +pngjs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +prebuild-install@^5.1.0, prebuild-install@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.0.tgz#58b4d8344e03590990931ee088dd5401b03004c8" + integrity sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + os-homedir "^1.0.1" + pump "^2.0.1" + rc "^1.2.7" + simple-get "^2.7.0" + tar-fs "^1.13.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +prettier@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + pretty-bytes@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" @@ -3073,7 +3935,15 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db" integrity sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g== -pump@^2.0.0: +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0, pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== @@ -3128,7 +3998,12 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -rc@^1.0.1, rc@^1.1.6, rc@^1.2.1: +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.1, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -3187,7 +4062,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@> 1.0.0 < 3.0.0", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -3200,6 +4075,16 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^3.0.0: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" @@ -3274,6 +4159,11 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +repeat-string@^1.3.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -3281,7 +4171,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.45.0, request@^2.83.0, request@^2.87.0: +request@^2.44.0, request@^2.45.0, request@^2.83.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -3322,6 +4212,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -3339,13 +4234,6 @@ resolve@^1.10.0, resolve@^1.3.2: dependencies: path-parse "^1.0.6" -resq@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resq/-/resq-1.5.0.tgz#a5f238e0c90f4e32ad0bfe3f36f041fae8b90f1d" - integrity sha512-6US6oo2fQ/vgs7wBwqq1w9901Z5VEDgxQH0LrNaN8HcHUZInhtrIt1a0Icysu0vuoK26Bt+SR1dIYeR9+ftMxA== - dependencies: - fast-deep-equal "^2.0.1" - restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -3359,13 +4247,24 @@ rgb2hex@^0.1.0, rgb2hex@^0.1.9: resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.9.tgz#5d3e0e14b0177b568e6f0d5b43e34fbfdb670346" integrity sha512-32iuQzhOjyT+cv9aAFRBJ19JgHwzQwbjUhH3Fj2sWW2EEGAW8fpFrDFP5ndoKDxJaLO06x1hE3kyuIFrUQtybQ== -rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.6.2, 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== dependencies: glob "^7.1.3" +rmfr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rmfr/-/rmfr-2.0.0.tgz#8a42e81332550b3f0019b8fb8ab245bea81b6d1c" + integrity sha512-nQptLCZeyyJfgbpf2x97k5YE8vzDn7bhwx9NlvODdhgbU0mL1ruh71X0HYdRaOEvWC7Cr+SfV0p5p+Ib5yOl7A== + dependencies: + assert-valid-glob-opts "^1.0.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + inspect-with-kind "^1.0.4" + rimraf "^2.6.2" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -3424,14 +4323,17 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== -serialize-error@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-4.1.0.tgz#63e1e33ede20bcd89d9f0528ea4c15fbf0f2b78a" - integrity sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw== - dependencies: - type-fest "^0.3.0" +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= -set-blocking@^2.0.0: +serialize-error@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-3.0.0.tgz#80100282b09be33c611536f50033481cb9cc87cf" + integrity sha512-+y3nkkG/go1Vdw+2f/+XUXM1DXX1XcxTl99FfiD/OEPUNw4uo0i6FKABfTAN5ZcgGtjTRZcEbxcE/jtXbEY19A== + +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -3444,6 +4346,22 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" +sharp@^0.22.0: + version "0.22.1" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.22.1.tgz#a67c0e75567f03dd5a7861b901fec04072c5b0f4" + integrity sha512-lXzSk/FL5b/MpWrT1pQZneKe25stVjEbl6uhhJcTULm7PhmJgKKRbTDM/vtjyUuC/RLqL2PRyC4rpKwbv3soEw== + dependencies: + color "^3.1.1" + detect-libc "^1.0.3" + fs-copy-file-sync "^1.1.1" + nan "^2.13.2" + npmlog "^4.1.2" + prebuild-install "^5.3.0" + semver "^6.0.0" + simple-get "^3.0.3" + tar "^4.4.8" + tunnel-agent "^0.6.0" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -3471,6 +4389,36 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" + integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-get@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa" + integrity sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + single-line-log@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" @@ -3587,6 +4535,11 @@ split@^1.0.0: dependencies: through "2" +sprintf-js@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -3775,7 +4728,17 @@ supports-color@~5.0.0: dependencies: has-flag "^2.0.0" -tar-stream@^1.5.0: +tar-fs@^1.13.0: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2, tar-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== @@ -3788,6 +4751,24 @@ tar-stream@^1.5.0: to-buffer "^1.1.1" xtend "^4.0.0" +tar@^4.4.8: + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + temp-file@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.2.tgz#69b6daf1bbe23231d0a5d03844e3d96f3f531aaa" @@ -3797,6 +4778,14 @@ temp-file@^3.3.2: bluebird-lst "^1.0.6" fs-extra-p "^7.0.0" +tempy@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.2.1.tgz#9038e4dbd1c201b74472214179bc2c6f7776e54c" + integrity sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw== + dependencies: + temp-dir "^1.0.0" + unique-string "^1.0.0" + term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -3827,6 +4816,14 @@ through2-filter@^3.0.0: through2 "~2.0.0" xtend "~4.0.0" +through2@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + through2@^2.0.1, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -3843,7 +4840,7 @@ through2@~0.2.3: readable-stream "~1.1.9" xtend "~2.1.1" -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: +through@2, through@^2.3.4, through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -3878,6 +4875,13 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -4039,10 +5043,13 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== +typedarray-pool@^1.0.0, typedarray-pool@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.1.0.tgz#d114f484801489f53ecab5e8088aa23044f498d9" + integrity sha1-0RT0hIAUifU+yrXoCIqiMET0mNk= + dependencies: + bit-twiddle "^1.0.0" + dup "^1.0.0" typedarray@^0.0.6: version "0.0.6" @@ -4072,6 +5079,11 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +uniq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + unique-stream@^2.0.2: version "2.3.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" @@ -4132,6 +5144,14 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" +url-parse@^1.4.4: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + url@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -4155,6 +5175,16 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +validate-glob-opts@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate-glob-opts/-/validate-glob-opts-1.0.2.tgz#ef9f98977d965537ea4f51fa7d5799e9c6ebca91" + integrity sha512-3PKjRQq/R514lUcG9OEiW0u9f7D4fP09A07kmk1JbNn2tfeQdAHhlT+A4dqERXKu2br2rrxSM3FzagaEeq9w+A== + dependencies: + array-to-sentence "^1.1.0" + indexed-filter "^1.0.0" + inspect-with-kind "^1.0.4" + is-plain-obj "^1.1.0" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -4172,15 +5202,25 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vscode-uri@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.0.2.tgz#cbc7982525e1cd102d2da6515e6f103650cb507c" + integrity sha512-VebpIxm9tG0fG2sBOhnsSPzDYuNUPP1UQW4K3mwthlca4e4f3d6HKq3HkITC2OPFomOaB7pHTSjcpdFWjfYTzg== + wdio-dot-reporter@~0.0.8: version "0.0.10" resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz#facfb7c9c5984149951f59cbc3cd0752101cf0e0" integrity sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg== -webdriver@^5.9.6: - version "5.9.6" - resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-5.9.6.tgz#0c4b46da389b7050bd194a81e5f8479bd5e5245d" - integrity sha512-cEPtbOCTMRiedWyAlc2Bxnxw0lTRKqrAEDP9yB7rwUKQs3OZQzpDrmqiYZ/rBhJ0j+up6Cmx/L9rdm9Iyp4WVQ== +weakmap-shim@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/weakmap-shim/-/weakmap-shim-1.1.1.tgz#d65afd784109b2166e00ff571c33150ec2a40b49" + integrity sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k= + +webdriver@^5.5.0: + version "5.10.4" + resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-5.10.4.tgz#ecfa464a95445fefeb645259ebad1ed00d214649" + integrity sha512-JIlHdKCWhS7cPwP3y3+OEWy1coUjGr7U8o8WeQfQbCxlO8163djeW5R2/dr78FqQxBAGQhFWiGU4qDagL9cboA== dependencies: "@wdio/config" "^5.9.4" "@wdio/logger" "^5.9.3" @@ -4188,6 +5228,22 @@ webdriver@^5.9.6: lodash.merge "^4.6.1" request "^2.83.0" +webdriverio@5.5: + version "5.5.0" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-5.5.0.tgz#052481e3c67365229998b492583f1061c726ed08" + integrity sha512-cIkXMo2njlT5Wmf6v+bZDS1MjCN07hQ1++28TqE7YlzJEb9oZzIoaHOznopufO6ItW83HMuCQUb4PSDWG2XONA== + dependencies: + "@wdio/config" "^5.4.20" + "@wdio/logger" "^5.4.6" + "@wdio/repl" "^5.4.20" + css-value "^0.0.1" + grapheme-splitter "^1.0.2" + lodash.merge "^4.6.1" + lodash.zip "^4.2.0" + rgb2hex "^0.1.0" + serialize-error "^3.0.0" + webdriver "^5.5.0" + webdriverio@^4.13.0: version "4.14.4" resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.14.4.tgz#f7a94e9a6530819796088f42b009833d83de0386" @@ -4216,25 +5272,6 @@ webdriverio@^4.13.0: wdio-dot-reporter "~0.0.8" wgxpath "~1.0.0" -webdriverio@~5.9.6: - version "5.9.6" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-5.9.6.tgz#7cfe77d234bb9961b71a4070541458348de34702" - integrity sha512-xjQyz0hdDXyPViaMTUuP8lpg91CxOVNQA20bp3kqRHlolipCmALTo1EFHF9+pz2aI5KGgVyz4r2+5T11VW9MYg== - dependencies: - "@wdio/config" "^5.9.4" - "@wdio/logger" "^5.9.3" - "@wdio/repl" "^5.9.4" - css-value "^0.0.1" - grapheme-splitter "^1.0.2" - lodash.isobject "^3.0.2" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.1" - lodash.zip "^4.2.0" - resq "^1.5.0" - rgb2hex "^0.1.0" - serialize-error "^4.1.0" - webdriver "^5.9.6" - websocket-stream@^5.1.2: version "5.5.0" resolved "https://registry.yarnpkg.com/websocket-stream/-/websocket-stream-5.5.0.tgz#9827f2846fc0d2b4dca7aab8f92980b2548b868e" @@ -4257,14 +5294,19 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1.3.1, which@^1.2.9, which@^1.3.0: +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which@1, which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@1.1.3: +wide-align@1.1.3, wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== @@ -4338,7 +5380,7 @@ xmldom@0.1.x: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= @@ -4360,6 +5402,11 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.0, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + yargs-parser@13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" @@ -4473,6 +5520,11 @@ yn@^3.0.0: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.0.tgz#fcbe2db63610361afcc5eb9e0ac91e976d046114" integrity sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg== +zero-fill@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/zero-fill/-/zero-fill-2.2.3.tgz#a3def06ba5e39ae644850bb4ca2ad4112b4855e9" + integrity sha1-o97wa6XjmuZEhQu0yirUEStIVek= + zip-stream@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"