diff --git a/app/src/actions/Charts.ts b/app/src/actions/Charts.ts index ed89d6f..cb036d3 100644 --- a/app/src/actions/Charts.ts +++ b/app/src/actions/Charts.ts @@ -60,63 +60,55 @@ export const saveCharts = () => async (dispatch: Dispatch, getState: () => } } -export const addChart = (chartParameters: ChartParameters) => async ( - dispatch: Dispatch, - getState: () => AppState -) => { - const chartExists = Boolean( - getState() - .charts.get('charts') - .find(chart => chart.topic === chartParameters.topic && chart.dotPath === chartParameters.dotPath) - ) - if (chartExists) { - dispatch(showNotification('Already added')) - return +export const addChart = + (chartParameters: ChartParameters) => async (dispatch: Dispatch, getState: () => AppState) => { + const chartExists = Boolean( + getState() + .charts.get('charts') + .find(chart => chart.topic === chartParameters.topic && chart.dotPath === chartParameters.dotPath) + ) + if (chartExists) { + dispatch(showNotification('Already added')) + return + } + + dispatch({ + type: ActionTypes.CHARTS_ADD, + chart: chartParameters, + }) + dispatch(saveCharts()) + dispatch(showNotification('Added to chart panel')) } - dispatch({ - type: ActionTypes.CHARTS_ADD, - chart: chartParameters, - }) - dispatch(saveCharts()) - dispatch(showNotification('Added to chart panel')) -} +export const updateChart = + (chartParameters: ChartParameters) => async (dispatch: Dispatch, getState: () => AppState) => { + dispatch({ + type: ActionTypes.CHARTS_UPDATE, + topic: chartParameters.topic, + dotPath: chartParameters.dotPath, + parameters: chartParameters, + }) + dispatch(saveCharts()) + } -export const updateChart = (chartParameters: ChartParameters) => async ( - dispatch: Dispatch, - getState: () => AppState -) => { - dispatch({ - type: ActionTypes.CHARTS_UPDATE, - topic: chartParameters.topic, - dotPath: chartParameters.dotPath, - parameters: chartParameters, - }) - dispatch(saveCharts()) -} +export const removeChart = + (chartParameters: ChartParameters) => async (dispatch: Dispatch, getState: () => AppState) => { + dispatch({ + chart: chartParameters, + type: ActionTypes.CHARTS_REMOVE, + }) + dispatch(saveCharts()) + } -export const removeChart = (chartParameters: ChartParameters) => async ( - dispatch: Dispatch, - getState: () => AppState -) => { - dispatch({ - chart: chartParameters, - type: ActionTypes.CHARTS_REMOVE, - }) - dispatch(saveCharts()) -} - -export const moveChartUp = (parameters: { topic: string; dotPath?: string }) => async ( - dispatch: Dispatch, - getState: () => AppState -) => { - dispatch({ - topic: parameters.topic, - dotPath: parameters.dotPath, - type: ActionTypes.CHARTS_MOVE_UP, - }) - dispatch(saveCharts()) -} +export const moveChartUp = + (parameters: { topic: string; dotPath?: string }) => async (dispatch: Dispatch, getState: () => AppState) => { + dispatch({ + topic: parameters.topic, + dotPath: parameters.dotPath, + type: ActionTypes.CHARTS_MOVE_UP, + }) + dispatch(saveCharts()) + } export const setCharts = (charts: Array): Action => { return { diff --git a/app/src/actions/Connection.ts b/app/src/actions/Connection.ts index a2e0d23..904540b 100644 --- a/app/src/actions/Connection.ts +++ b/app/src/actions/Connection.ts @@ -11,31 +11,29 @@ import { showError } from './Global' import { TopicViewModel } from '../model/TopicViewModel' import { addMqttConnectionEvent, makeConnectionStateEvent, removeConnection, rendererEvents } from '../../../events' -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 +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 => { - if (dataSourceState.connected) { - const didReconnect = Boolean(getState().connection.tree) - if (!didReconnect) { - const tree = new q.Tree() - tree.updateWithConnection(rendererEvents, connectionId) - dispatch(showTree(tree)) - dispatch(connected(tree, host!)) + rendererEvents.subscribe(event, dataSourceState => { + if (dataSourceState.connected) { + const didReconnect = Boolean(getState().connection.tree) + if (!didReconnect) { + const tree = new q.Tree() + tree.updateWithConnection(rendererEvents, connectionId) + dispatch(showTree(tree)) + dispatch(connected(tree, host!)) + } + } else if (dataSourceState.error) { + dispatch(showError(dataSourceState.error)) + dispatch(disconnect()) } - } else if (dataSourceState.error) { - dispatch(showError(dataSourceState.error)) - dispatch(disconnect()) - } - dispatch(updateHealth(dataSourceState)) - }) -} + dispatch(updateHealth(dataSourceState)) + }) + } const updateHealth = (dataSourceState: DataSourceState) => (dispatch: Dispatch, getState: () => AppState) => { let state diff --git a/app/src/actions/ConnectionManager.ts b/app/src/actions/ConnectionManager.ts index 8d3c0dd..fce8cbe 100644 --- a/app/src/actions/ConnectionManager.ts +++ b/app/src/actions/ConnectionManager.ts @@ -51,21 +51,19 @@ export const loadConnectionSettings = () => async (dispatch: Dispatch, getS } export type CertificateTypes = 'selfSignedCertificate' | 'clientCertificate' | 'clientKey' -export const selectCertificate = (type: CertificateTypes, connectionId: string) => async ( - dispatch: Dispatch, - getState: () => AppState -) => { - try { - const certificate = await openCertificate() - dispatch( - updateConnection(connectionId, { - [type]: certificate, - }) - ) - } catch (error) { - dispatch(showError(error)) +export const selectCertificate = + (type: CertificateTypes, connectionId: string) => async (dispatch: Dispatch, getState: () => AppState) => { + try { + const certificate = await openCertificate() + dispatch( + updateConnection(connectionId, { + [type]: certificate, + }) + ) + } catch (error) { + dispatch(showError(error)) + } } -} async function openCertificate(): Promise { const rejectReasons = { diff --git a/app/src/actions/Settings.ts b/app/src/actions/Settings.ts index 0202aff..257e5e5 100644 --- a/app/src/actions/Settings.ts +++ b/app/src/actions/Settings.ts @@ -43,12 +43,14 @@ export const storeSettings = () => async (dispatch: Dispatch, getState: () } } -export const setAutoExpandLimit = (autoExpandLimit: number = 0) => (dispatch: Dispatch) => { - dispatch({ - autoExpandLimit, - type: ActionTypes.SETTINGS_SET_AUTO_EXPAND_LIMIT, - }) -} +export const setAutoExpandLimit = + (autoExpandLimit: number = 0) => + (dispatch: Dispatch) => { + dispatch({ + autoExpandLimit, + type: ActionTypes.SETTINGS_SET_AUTO_EXPAND_LIMIT, + }) + } export const setTimeLocale = (timeLocale: string) => (dispatch: Dispatch) => { dispatch({ @@ -81,13 +83,15 @@ export const toggleHighlightTopicUpdates = () => (dispatch: Dispatch) => { dispatch(storeSettings()) } -export const setTopicOrder = (topicOrder: TopicOrder = TopicOrder.none) => (dispatch: Dispatch) => { - dispatch({ - topicOrder, - type: ActionTypes.SETTINGS_SET_TOPIC_ORDER, - }) - dispatch(storeSettings()) -} +export const setTopicOrder = + (topicOrder: TopicOrder = TopicOrder.none) => + (dispatch: Dispatch) => { + dispatch({ + topicOrder, + type: ActionTypes.SETTINGS_SET_TOPIC_ORDER, + }) + dispatch(storeSettings()) + } export const filterTopics = (filterStr: string) => (dispatch: Dispatch, getState: () => AppState) => { const { tree } = getState().connection diff --git a/app/src/actions/Tree.ts b/app/src/actions/Tree.ts index d2a1ad2..0dd1896 100644 --- a/app/src/actions/Tree.ts +++ b/app/src/actions/Tree.ts @@ -12,12 +12,10 @@ export { clearTopic } from './clearTopic' export { moveSelectionUpOrDownwards, moveInward, moveOutward } from './visibleTreeTraversal' -export const selectTopic = (topic: q.TreeNode) => ( - dispatch: Dispatch, - getState: () => AppState -) => { - debouncedSelectTopic(topic, dispatch, getState) -} +export const selectTopic = + (topic: q.TreeNode) => (dispatch: Dispatch, getState: () => AppState) => { + debouncedSelectTopic(topic, dispatch, getState) + } const debouncedSelectTopic = debounce( (topic: q.TreeNode, dispatch: Dispatch, getState: () => AppState) => { @@ -74,25 +72,26 @@ function destroyUnreferencedTree(state: AppState) { } } -export const resetStore = () => (dispatch: Dispatch, getState: () => AppState): AnyAction => { - destroyUnreferencedTree(getState()) +export const resetStore = + () => + (dispatch: Dispatch, getState: () => AppState): AnyAction => { + destroyUnreferencedTree(getState()) - return dispatch({ - type: ActionTypes.TREE_RESET_STORE, - }) -} + return dispatch({ + type: ActionTypes.TREE_RESET_STORE, + }) + } -export const showTree = (tree: q.Tree | undefined) => ( - dispatch: Dispatch, - getState: () => AppState -): AnyAction => { - destroyUnreferencedTree(getState()) +export const showTree = + (tree: q.Tree | undefined) => + (dispatch: Dispatch, getState: () => AppState): AnyAction => { + destroyUnreferencedTree(getState()) - return dispatch({ - tree, - type: ActionTypes.TREE_SHOW_TREE, - }) -} + return dispatch({ + tree, + type: ActionTypes.TREE_SHOW_TREE, + }) + } export const togglePause = (tree?: q.Tree) => (dispatch: Dispatch, getState: () => AppState) => { const paused = getState().tree.get('paused') diff --git a/app/src/actions/clearTopic.ts b/app/src/actions/clearTopic.ts index 0c3e7df..14eef38 100644 --- a/app/src/actions/clearTopic.ts +++ b/app/src/actions/clearTopic.ts @@ -5,52 +5,50 @@ import { makePublishEvent, rendererEvents } from '../../../events' import { moveSelectionUpOrDownwards } from './visibleTreeTraversal' import { globalActions } from '.' -export const clearTopic = (topic: q.TreeNode, recursive: boolean) => async ( - dispatch: Dispatch, - getState: () => AppState -) => { - const topicsForPurging = recursive ? [topic, ...topic.childTopics()] : [topic] +export const clearTopic = + (topic: q.TreeNode, recursive: boolean) => async (dispatch: Dispatch, getState: () => AppState) => { + const topicsForPurging = recursive ? [topic, ...topic.childTopics()] : [topic] - if (recursive) { - const topicCount = topic.childTopicCount() + if (recursive) { + const topicCount = topic.childTopicCount() - const topicDelta = topic.hasMessage() ? -1 : 0 - const childTopicsMessage = - topicCount + topicDelta > 0 - ? ` and ${topicCount + topicDelta} child ${topicCount + topicDelta === 1 ? 'topic' : 'topics'}` - : '' + const topicDelta = topic.hasMessage() ? -1 : 0 + const childTopicsMessage = + topicCount + topicDelta > 0 + ? ` and ${topicCount + topicDelta} child ${topicCount + topicDelta === 1 ? 'topic' : 'topics'}` + : '' - const confirmed = await dispatch( - globalActions.requestConfirmation( - 'Confirm delete', - `Do you want to clear "${topic.path()}"${childTopicsMessage}?\n\nThis function will send an empty payload (QoS 0, retain) to this and every subtopic, clearing retained topics in the process. Only use this function if you know what you are doing.` + const confirmed = await dispatch( + globalActions.requestConfirmation( + 'Confirm delete', + `Do you want to clear "${topic.path()}"${childTopicsMessage}?\n\nThis function will send an empty payload (QoS 0, retain) to this and every subtopic, clearing retained topics in the process. Only use this function if you know what you are doing.` + ) ) - ) - if (!confirmed) { + if (!confirmed) { + return + } + } + + dispatch(moveSelectionUpOrDownwards('next')) + + const { connectionId } = getState().connection + if (!connectionId) { return } + const publishEvent = makePublishEvent(connectionId) + + topicsForPurging + .filter(t => t.path() !== '' && t.hasMessage()) + .map(t => t.path()) + .forEach((path, idx) => { + const mqttMessage = { + topic: path, + payload: null, + retain: true, + qos: 0 as 0, + messageId: undefined, + } + // Rate limit deletion + setTimeout(() => rendererEvents.emit(publishEvent, mqttMessage), 20 * idx) + }) } - - dispatch(moveSelectionUpOrDownwards('next')) - - const { connectionId } = getState().connection - if (!connectionId) { - return - } - const publishEvent = makePublishEvent(connectionId) - - topicsForPurging - .filter(t => t.path() !== '' && t.hasMessage()) - .map(t => t.path()) - .forEach((path, idx) => { - const mqttMessage = { - topic: path, - payload: null, - retain: true, - qos: 0 as 0, - messageId: undefined, - } - // Rate limit deletion - setTimeout(() => rendererEvents.emit(publishEvent, mqttMessage), 20 * idx) - }) -} diff --git a/app/src/actions/visibleTreeTraversal.ts b/app/src/actions/visibleTreeTraversal.ts index 233e22e..63fb9f2 100644 --- a/app/src/actions/visibleTreeTraversal.ts +++ b/app/src/actions/visibleTreeTraversal.ts @@ -6,53 +6,56 @@ import { SettingsState } from '../reducers/Settings' import { sortedNodes } from '../sortedNodes' import { TopicViewModel } from '../model/TopicViewModel' -export const moveSelectionUpOrDownwards = (direction: 'next' | 'previous') => ( - dispatch: Dispatch, - getState: () => AppState -): any => { - const state = getState() - const selected = state.tree.get('selectedTopic') - const tree = state.tree.get('tree') +export const moveSelectionUpOrDownwards = + (direction: 'next' | 'previous') => + (dispatch: Dispatch, getState: () => AppState): any => { + const state = getState() + const selected = state.tree.get('selectedTopic') + const tree = state.tree.get('tree') - if (!selected || !tree) { - if (tree) { - dispatch(selectTopic(tree)) + if (!selected || !tree) { + if (tree) { + dispatch(selectTopic(tree)) + } + return + } + const nextTreeNode = nextVisibleElementInTree(state.settings, tree, selected, direction) + if (nextTreeNode && nextTreeNode.viewModel) { + dispatch(selectTopic(nextTreeNode)) } - return - } - const nextTreeNode = nextVisibleElementInTree(state.settings, tree, selected, direction) - if (nextTreeNode && nextTreeNode.viewModel) { - dispatch(selectTopic(nextTreeNode)) - } -} - -export const moveInward = () => (dispatch: Dispatch, getState: () => AppState): any => { - const state = getState() - const selected = state.tree.get('selectedTopic') - if (!selected || !selected.viewModel) { - return } - if (!selected.viewModel.isExpanded() && selected.edgeCount() > 0) { - selected.viewModel.setExpanded(true, true) - } else { - dispatch(moveSelectionUpOrDownwards('next')) - } -} +export const moveInward = + () => + (dispatch: Dispatch, getState: () => AppState): any => { + const state = getState() + const selected = state.tree.get('selectedTopic') + if (!selected || !selected.viewModel) { + return + } -export const moveOutward = () => (dispatch: Dispatch, getState: () => AppState): any => { - const state = getState() - const selected = state.tree.get('selectedTopic') - if (!selected || !selected.viewModel) { - return + if (!selected.viewModel.isExpanded() && selected.edgeCount() > 0) { + selected.viewModel.setExpanded(true, true) + } else { + dispatch(moveSelectionUpOrDownwards('next')) + } } - if (selected.viewModel.isExpanded() && selected.edgeCount() > 0) { - selected.viewModel.setExpanded(false, true) - } else { - dispatch(moveSelectionUpOrDownwards('previous')) +export const moveOutward = + () => + (dispatch: Dispatch, getState: () => AppState): any => { + const state = getState() + const selected = state.tree.get('selectedTopic') + if (!selected || !selected.viewModel) { + return + } + + if (selected.viewModel.isExpanded() && selected.edgeCount() > 0) { + selected.viewModel.setExpanded(false, true) + } else { + dispatch(moveSelectionUpOrDownwards('previous')) + } } -} function isTreeNodeVisible(treeNode: q.TreeNode) { return Boolean(treeNode.viewModel) diff --git a/app/src/components/App.tsx b/app/src/components/App.tsx index 704c0dc..bb69c56 100644 --- a/app/src/components/App.tsx +++ b/app/src/components/App.tsx @@ -12,8 +12,7 @@ import { ConfirmationRequest } from '../reducers/Global' import { connect } from 'react-redux' import { globalActions, settingsActions } from '../actions' import { Theme, withStyles } from '@material-ui/core/styles' - -(window as any).global = window +;(window as any).global = window const Settings = React.lazy(() => import('./SettingsDrawer/Settings')) const ContentView = React.lazy(() => import('./Layout/ContentView')) @@ -68,7 +67,7 @@ class App extends React.PureComponent { return null } - const anyProps: any = {}; + const anyProps: any = {} return (
diff --git a/app/src/components/Demo/Mouse.tsx b/app/src/components/Demo/Mouse.tsx index ee09550..6cbc2ec 100644 --- a/app/src/components/Demo/Mouse.tsx +++ b/app/src/components/Demo/Mouse.tsx @@ -43,15 +43,15 @@ 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) => { - 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 } }) - this.moveCloser() - } + ;(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 } }) + this.moveCloser() + } } public render() { diff --git a/app/src/components/Demo/index.tsx b/app/src/components/Demo/index.tsx index 63bef6c..2eab705 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/SettingsDrawer/TimeLocale.tsx b/app/src/components/SettingsDrawer/TimeLocale.tsx index 08040bb..67845e4 100644 --- a/app/src/components/SettingsDrawer/TimeLocale.tsx +++ b/app/src/components/SettingsDrawer/TimeLocale.tsx @@ -8,10 +8,10 @@ import { settingsActions } from '../../actions' import { withStyles } from '@material-ui/styles' function importAll(r: any) { - r.keys().forEach(r); + r.keys().forEach(r) } // @ts-expect-error -- webpack require -importAll(require.context('moment/locale', true, /\.js$/)); +importAll(require.context('moment/locale', true, /\.js$/)) const moment = require('moment') diff --git a/app/src/components/Sidebar/CodeDiff/index.tsx b/app/src/components/Sidebar/CodeDiff/index.tsx index b4da029..379ead6 100644 --- a/app/src/components/Sidebar/CodeDiff/index.tsx +++ b/app/src/components/Sidebar/CodeDiff/index.tsx @@ -43,9 +43,9 @@ class CodeDiff extends React.PureComponent { private plottableLiteralsIndexedWithLineNumbers() { const allLiterals = this.isValidJson(this.props.current) ? literalsMappedByLines(this.props.current) || [] : [] - return allLiterals.map((l: JsonPropertyLocation) => (isPlottable(l.value) ? l : undefined)) as Array< - JsonPropertyLocation - > + return allLiterals.map((l: JsonPropertyLocation) => + isPlottable(l.value) ? l : undefined + ) as Array } private renderStyledCodeLines(changes: Array) { diff --git a/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx b/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx index 40f5797..8b4449f 100644 --- a/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx +++ b/app/src/components/Sidebar/ValueRenderer/ValueRenderer.tsx @@ -83,10 +83,12 @@ class ValueRenderer extends React.Component { } public render() { - return
- {this.props.message?.payload?.decoder === Decoder.SPARKPLUG && "Decoded SparkplugB"} - {this.renderValue()} -
+ return ( +
+ {this.props.message?.payload?.decoder === Decoder.SPARKPLUG && 'Decoded SparkplugB'} + {this.renderValue()} +
+ ) } public renderValue() { diff --git a/app/src/components/TopicPlot.tsx b/app/src/components/TopicPlot.tsx index f0159e6..ac635be 100644 --- a/app/src/components/TopicPlot.tsx +++ b/app/src/components/TopicPlot.tsx @@ -40,7 +40,7 @@ function nodeDotPathToHistory(startTime: number | undefined, history: q.MessageH let json: any = {} try { json = message.payload ? JSON.parse(Base64Message.toUnicodeString(message.payload)) : {} - } catch (ignore) { } + } catch (ignore) {} const value = dotProp.get(json, dotPath) diff --git a/app/src/components/Tree/index.tsx b/app/src/components/Tree/index.tsx index 7fb6e8c..b4f486a 100644 --- a/app/src/components/Tree/index.tsx +++ b/app/src/components/Tree/index.tsx @@ -91,23 +91,26 @@ class TreeComponent extends React.PureComponent { const updateInterval = Math.max(expectedRenderTime * 7, 300) const timeUntilNextUpdate = updateInterval - (performance.now() - this.renderTime) - this.updateTimer = setTimeout(() => { - window.requestIdleCallback( - () => { - this.updateTimer && clearTimeout(this.updateTimer) - this.updateTimer = undefined - this.renderTime = performance.now() + this.updateTimer = setTimeout( + () => { + window.requestIdleCallback( + () => { + this.updateTimer && clearTimeout(this.updateTimer) + this.updateTimer = undefined + this.renderTime = performance.now() - window.requestIdleCallback( - () => { - this.setState({ lastUpdate: this.renderTime }) - }, - { timeout: 100 } - ) - }, - { timeout: 500 } - ) - }, Math.max(0, timeUntilNextUpdate)) + window.requestIdleCallback( + () => { + this.setState({ lastUpdate: this.renderTime }) + }, + { timeout: 100 } + ) + }, + { timeout: 500 } + ) + }, + Math.max(0, timeUntilNextUpdate) + ) } public componentWillUpdate() { diff --git a/app/src/components/UpdateNotifier.tsx b/app/src/components/UpdateNotifier.tsx index 656b221..e68719d 100644 --- a/app/src/components/UpdateNotifier.tsx +++ b/app/src/components/UpdateNotifier.tsx @@ -55,8 +55,8 @@ class UpdateNotifier extends React.PureComponent { } private async checkForUpdates() { - const ownVersion = await rendererRpc.call(getAppVersion, undefined, 10000); - const releases = await this.fetchReleases(); + const ownVersion = await rendererRpc.call(getAppVersion, undefined, 10000) + const releases = await this.fetchReleases() const newerVersions = releases .filter(release => this.allowPrereleaseIfOwnVersionIsBeta(release, ownVersion)) .filter(release => compareVersions(release.tag_name, ownVersion) > 0) diff --git a/app/src/reducers/Tree.ts b/app/src/reducers/Tree.ts index f7ede82..cf96f71 100644 --- a/app/src/reducers/Tree.ts +++ b/app/src/reducers/Tree.ts @@ -45,9 +45,11 @@ const initialStateFactory = Record({ filter: undefined, }) -const setPaused = (pause: boolean) => (state: TreeState, action: ShowTree): TreeState => { - return state.set('paused', pause) -} +const setPaused = + (pause: boolean) => + (state: TreeState, action: ShowTree): TreeState => { + return state.set('paused', pause) + } const actions: { [s: string]: (state: TreeState, action: ReduxAction) => TreeState diff --git a/app/src/utils/PersistentStorage.ts b/app/src/utils/PersistentStorage.ts index 7346f34..0c91bb5 100644 --- a/app/src/utils/PersistentStorage.ts +++ b/app/src/utils/PersistentStorage.ts @@ -1,10 +1,6 @@ import { rendererRpc } from '../../../events' -import { - storageStoreEvent, - storageLoadEvent, - storageClearEvent, -} from '../../../events/StorageEvents' +import { storageStoreEvent, storageLoadEvent, storageClearEvent } from '../../../events/StorageEvents' export interface StorageIdentifier { id: string @@ -25,9 +21,13 @@ class RemoteStorage implements PersistentStorage { } public async load(identifier: StorageIdentifier): Promise { - const result = await rendererRpc.call(storageLoadEvent, { - store: identifier.id, - }, 10000) + const result = await rendererRpc.call( + storageLoadEvent, + { + store: identifier.id, + }, + 10000 + ) return (result as any).data } diff --git a/app/src/utils/handleTextSelectWithCtrlA.ts b/app/src/utils/handleTextSelectWithCtrlA.ts index 01db170..007ba3e 100644 --- a/app/src/utils/handleTextSelectWithCtrlA.ts +++ b/app/src/utils/handleTextSelectWithCtrlA.ts @@ -1,24 +1,23 @@ -export const selectTextWithCtrlA = (options?: { targetSelector: string }) => ( - e: React.KeyboardEvent -) => { - const isCtrlA = (e.metaKey || e.ctrlKey) && e.key === 'a' +export const selectTextWithCtrlA = + (options?: { targetSelector: string }) => (e: React.KeyboardEvent) => { + const isCtrlA = (e.metaKey || e.ctrlKey) && e.key === 'a' - if (isCtrlA && window.getSelection) { - e.persist() - e.preventDefault() - 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 + if (isCtrlA && window.getSelection) { + e.persist() + e.preventDefault() + 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 - if (!target) { - console.error('Could not find matching target for Ctrl+A Event') - } - if (selection && target) { - range.selectNodeContents(target) - selection.removeAllRanges() - selection.addRange(range) + if (!target) { + console.error('Could not find matching target for Ctrl+A Event') + } + if (selection && target) { + range.selectNodeContents(target) + selection.removeAllRanges() + selection.addRange(range) + } } } -} diff --git a/backend/src/ConfigStorage.ts b/backend/src/ConfigStorage.ts index 898941e..7da131c 100644 --- a/backend/src/ConfigStorage.ts +++ b/backend/src/ConfigStorage.ts @@ -3,11 +3,7 @@ import * as fs from 'fs-extra' import * as lowdb from 'lowdb' import * as path from 'path' import { backendRpc } from '../../events' -import { - storageClearEvent, - storageLoadEvent, - storageStoreEvent, -} from '../../events/StorageEvents' +import { storageClearEvent, storageLoadEvent, storageStoreEvent } from '../../events/StorageEvents' export default class ConfigStorage { private file: string diff --git a/backend/src/DataSource/MqttSource.ts b/backend/src/DataSource/MqttSource.ts index fb76c2f..e53d5a2 100644 --- a/backend/src/DataSource/MqttSource.ts +++ b/backend/src/DataSource/MqttSource.ts @@ -47,7 +47,6 @@ export class MqttSource implements DataSource { throw error } - const client = mqttConnect(url.toString(), { resubscribe: false, rejectUnauthorized: options.certValidation, diff --git a/backend/src/Model/Decoder.ts b/backend/src/Model/Decoder.ts index 5017976..9f4d9a8 100644 --- a/backend/src/Model/Decoder.ts +++ b/backend/src/Model/Decoder.ts @@ -1,4 +1,4 @@ export enum Decoder { - NONE, - SPARKPLUG + NONE, + SPARKPLUG, } diff --git a/backend/src/Model/Tree.ts b/backend/src/Model/Tree.ts index 904001e..2eeedef 100644 --- a/backend/src/Model/Tree.ts +++ b/backend/src/Model/Tree.ts @@ -31,7 +31,7 @@ export class Tree extends TreeNode { if (!this.paused && this.applyChangesHasCompleted) { this.applyChangesHasCompleted = false if ((window as any).requestIdleCallback) { - ; (window as any).requestIdleCallback(() => this.applyUnmergedChanges(), { timeout: 500 }) + ;(window as any).requestIdleCallback(() => this.applyUnmergedChanges(), { timeout: 500 }) } else { this.applyUnmergedChanges() } diff --git a/backend/src/Model/sparkplugb.ts b/backend/src/Model/sparkplugb.ts index 467752d..45e8a48 100644 --- a/backend/src/Model/sparkplugb.ts +++ b/backend/src/Model/sparkplugb.ts @@ -1,9 +1,9 @@ import { readFileSync } from 'fs' import * as protobuf from 'protobufjs' -import { Base64Message } from './Base64Message'; -import { Decoder } from './Decoder'; +import { Base64Message } from './Base64Message' +import { Decoder } from './Decoder' -const buffer = readFileSync(require.resolve('../../../../res/sparkplug_b.proto')); +const buffer = readFileSync(require.resolve('../../../../res/sparkplug_b.proto')) const root = protobuf.parse(buffer.toString()).root export let SparkplugPayload = root.lookupType('com.cirruslink.sparkplug.protobuf.Payload') @@ -11,14 +11,12 @@ export const SparkplugDecoder = { decode(input: Buffer): Base64Message | undefined { try { let message = Base64Message.fromString( - JSON.stringify( - SparkplugPayload.toObject(SparkplugPayload.decode(new Uint8Array(input))) - ) + JSON.stringify(SparkplugPayload.toObject(SparkplugPayload.decode(new Uint8Array(input)))) ) message.decoder = Decoder.SPARKPLUG return message } catch { // ignore } - } + }, } diff --git a/events/EventSystem/CallbackStore.ts b/events/EventSystem/CallbackStore.ts index 3d214ca..21f0831 100644 --- a/events/EventSystem/CallbackStore.ts +++ b/events/EventSystem/CallbackStore.ts @@ -1,4 +1,4 @@ export interface CallbackStore { - wrappedCallback: any; - callback: any; + wrappedCallback: any + callback: any } diff --git a/events/EventSystem/EventBusInterface.ts b/events/EventSystem/EventBusInterface.ts index bd574ee..11f685f 100644 --- a/events/EventSystem/EventBusInterface.ts +++ b/events/EventSystem/EventBusInterface.ts @@ -1,8 +1,8 @@ -import { Event } from '../Events'; +import { Event } from '../Events' export interface EventBusInterface { - subscribe(event: Event, callback: (msg: MessageType) => void): void; - unsubscribeAll(event: Event): void; - emit(event: Event, msg: MessageType): void; - unsubscribe(event: Event, callback: any): void; + subscribe(event: Event, callback: (msg: MessageType) => void): void + unsubscribeAll(event: Event): void + emit(event: Event, msg: MessageType): void + unsubscribe(event: Event, callback: any): void } diff --git a/events/EventSystem/IpcMainEventBus.ts b/events/EventSystem/IpcMainEventBus.ts index 406084b..4eeffc0 100644 --- a/events/EventSystem/IpcMainEventBus.ts +++ b/events/EventSystem/IpcMainEventBus.ts @@ -1,34 +1,34 @@ -import { IpcMain } from 'electron'; -import { Event } from '../Events'; -import { EventBusInterface } from "./EventBusInterface"; +import { IpcMain } from 'electron' +import { Event } from '../Events' +import { EventBusInterface } from './EventBusInterface' export class IpcMainEventBus implements EventBusInterface { - private ipc: IpcMain; - private client: any; - constructor(ipc: IpcMain) { - this.ipc = ipc; - } + private ipc: IpcMain + private client: any + constructor(ipc: IpcMain) { + this.ipc = ipc + } - public subscribe(subscribeEvent: Event, callback: (msg: MessageType) => void) { - console.log('subscribing', subscribeEvent.topic); - this.ipc.on(subscribeEvent.topic, (event: any, arg: any) => { - this.client = event.sender; - callback(arg); - }); - } + public subscribe(subscribeEvent: Event, callback: (msg: MessageType) => void) { + console.log('subscribing', subscribeEvent.topic) + this.ipc.on(subscribeEvent.topic, (event: any, arg: any) => { + this.client = event.sender + callback(arg) + }) + } - public unsubscribeAll(event: Event) { - console.log('unsubscribeAll', event.topic); - this.ipc.removeAllListeners(event.topic); - } + public unsubscribeAll(event: Event) { + console.log('unsubscribeAll', event.topic) + this.ipc.removeAllListeners(event.topic) + } - public unsubscribe(event: Event, callback: any) { - throw new Error('Not implemented'); // Todo: implement - } + public unsubscribe(event: Event, callback: any) { + throw new Error('Not implemented') // Todo: implement + } - public emit(event: Event, msg: MessageType) { - if (!this.client.isDestroyed()) { - this.client.send(event.topic, msg); - } + public emit(event: Event, msg: MessageType) { + if (!this.client.isDestroyed()) { + this.client.send(event.topic, msg) } + } } diff --git a/events/EventSystem/IpcRendererEventBus.ts b/events/EventSystem/IpcRendererEventBus.ts index 8fc0bcd..5a59bca 100644 --- a/events/EventSystem/IpcRendererEventBus.ts +++ b/events/EventSystem/IpcRendererEventBus.ts @@ -1,5 +1,5 @@ -import { CallbackStore } from "./CallbackStore" -import { EventBusInterface } from "./EventBusInterface" +import { CallbackStore } from './CallbackStore' +import { EventBusInterface } from './EventBusInterface' import { Event } from '../Events' import { IpcRenderer } from 'electron' @@ -15,7 +15,7 @@ export class IpcRendererEventBus implements EventBusInterface { const wrappedCallback = (_: any, arg: any) => { callback(arg) } - console.log("subscribing", event.topic) + console.log('subscribing', event.topic) this.ipc.on(event.topic, wrappedCallback) this.callbacks.push({ callback, diff --git a/events/EventSystem/Rpc.ts b/events/EventSystem/Rpc.ts index ae94448..4cfa016 100644 --- a/events/EventSystem/Rpc.ts +++ b/events/EventSystem/Rpc.ts @@ -1,53 +1,60 @@ -import { Event } from '../Events'; +import { Event } from '../Events' import { EventBusInterface } from './EventBusInterface' -import { v4 } from 'uuid'; +import { v4 } from 'uuid' export type RpcEvent = { - topic: string; -}; + topic: string +} export class Rpc { - constructor(private participant: EventBusInterface) { } + constructor(private participant: EventBusInterface) {} - async call(event: RpcEvent, request: RpcRequest, timeout: number = 0): Promise { - return new Promise((resolve, reject) => { - let id = v4(); + async call( + event: RpcEvent, + request: RpcRequest, + timeout: number = 0 + ): Promise { + return new Promise((resolve, reject) => { + let id = v4() - let responseEvent: Event = { topic: `${event.topic}/response/${id}` }; - let requestEvent: Event = { topic: `${event.topic}/request` }; - let callback = (result: { id: string; payload: RpcResponse; error: unknown }) => { - this.participant.unsubscribe(responseEvent as any, callback); - if (result.error) { - reject(result.error) - } else { - resolve(result.payload); - } - console.log("received", result) - }; - this.participant.subscribe(responseEvent, callback); - this.participant.emit(requestEvent, { id, payload: request }); + let responseEvent: Event = { topic: `${event.topic}/response/${id}` } + let requestEvent: Event = { topic: `${event.topic}/request` } + let callback = (result: { id: string; payload: RpcResponse; error: unknown }) => { + this.participant.unsubscribe(responseEvent as any, callback) + if (result.error) { + reject(result.error) + } else { + resolve(result.payload) + } + console.log('received', result) + } + this.participant.subscribe(responseEvent, callback) + this.participant.emit(requestEvent, { id, payload: request }) - if (timeout > 0) { - setTimeout(() => { - reject(new Error(`Did not respond to ${event.topic} within ${timeout}ms`)) - this.participant.unsubscribe(responseEvent as any, callback); - }, 10000) - } - }); - } + if (timeout > 0) { + setTimeout(() => { + reject(new Error(`Did not respond to ${event.topic} within ${timeout}ms`)) + this.participant.unsubscribe(responseEvent as any, callback) + }, 10000) + } + }) + } - async on(event: RpcEvent, handler: (request: RpcRequest) => Promise) { - this.participant.subscribe({ topic: `${event.topic}/request` } as RpcEvent, async (request) => { - let payload; - let error; - try { - payload = await handler((request as any).payload); - } catch (e) { - error = e - } - const id = (request as any).id - console.log(`${event.topic}/response/${id}`, payload, error) - this.participant.emit({ topic: `${event.topic}/response/${id}` }, { id, payload, error }); - }); - } + async on( + event: RpcEvent, + handler: (request: RpcRequest) => Promise + ) { + this.participant.subscribe({ topic: `${event.topic}/request` } as RpcEvent, async request => { + let payload + let error + try { + payload = await handler((request as any).payload) + } catch (e) { + error = e + } + const id = (request as any).id + console.log(`${event.topic}/response/${id}`, payload, error) + this.participant.emit({ topic: `${event.topic}/response/${id}` }, { id, payload, error }) + }) + } } diff --git a/events/Events.ts b/events/Events.ts index 55fdfa7..30adc04 100644 --- a/events/Events.ts +++ b/events/Events.ts @@ -1,7 +1,7 @@ import { Base64Message } from '../backend/src/Model/Base64Message' import { DataSourceState, MqttOptions } from '../backend/src/DataSource' import { UpdateInfo } from 'builder-util-runtime' -import { RpcEvent } from './EventSystem/Rpc'; +import { RpcEvent } from './EventSystem/Rpc' export type Event = { topic: string @@ -52,5 +52,5 @@ export function makeConnectionMessageEvent(connectionId: string): Event = { - topic: `getAppVersion` + topic: `getAppVersion`, } diff --git a/events/OpenDialogRequest.ts b/events/OpenDialogRequest.ts index f7e586a..d7e0e42 100644 --- a/events/OpenDialogRequest.ts +++ b/events/OpenDialogRequest.ts @@ -1,8 +1,8 @@ -import { OpenDialogOptions, OpenDialogReturnValue } from 'electron'; -import { RpcEvent } from './EventSystem/Rpc'; +import { OpenDialogOptions, OpenDialogReturnValue } from 'electron' +import { RpcEvent } from './EventSystem/Rpc' export function makeOpenDialogRpc(): RpcEvent { - return { - topic: `openDialog` - }; + return { + topic: `openDialog`, + } } diff --git a/events/index.ts b/events/index.ts index d067dee..02c1041 100644 --- a/events/index.ts +++ b/events/index.ts @@ -1,4 +1,4 @@ export * from './Events' export * from './EventSystem/EventDispatcher' export * from './EventSystem/EventBus' -export * from './EventSystem/EventBusInterface' \ No newline at end of file +export * from './EventSystem/EventBusInterface' diff --git a/package.json b/package.json index 23ca334..e5324b6 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dev:electron": "tsc && electron . --development", "lint": "npm-run-all --parallel lint:prettier lint:tslint lint:spellcheck", "lint:prettier": "prettier --check \"**/*.ts{x,}\"", + "lint:prettier:fix": "prettier --write \"**/*.ts{x,}\"", "lint:tslint": "tslint -p ./", "lint:spellcheck": "cspell -e ./build -e \"node_modules\" \"**/*.ts{x,}\"", "build": "tsc && cd app && yarn run build && cd ..", @@ -93,11 +94,15 @@ "mustache": "4", "npm-run-all": "^4.1.5", "nyc": "15", - "prettier": "2", + "prettier": "^3.2.5", "redux-thunk": "^2.3.0", "source-map-support": "^0.5.9", "spectron": "19", "ts-node": "^10.5.0", + "tslint": "^6.1.3", + "tslint-config-airbnb": "^5.11.2", + "tslint-react": "^5.0.0", + "tslint-react-recommended": "^1.0.15", "typescript": "^4.5.5", "webdriverio": "7.16" }, diff --git a/src/electron.ts b/src/electron.ts index 4b14a2a..b031273 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -21,7 +21,7 @@ registerCrashReporter() app.commandLine.appendSwitch('--no-sandbox') app.whenReady().then(() => { - backendRpc.on(makeOpenDialogRpc(), async (request) => { + backendRpc.on(makeOpenDialogRpc(), async request => { return dialog.showOpenDialog(BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0], request) }) backendRpc.on(getAppVersion, async () => app.getVersion()) diff --git a/src/spec/util/index.ts b/src/spec/util/index.ts index 3276a37..f13e257 100644 --- a/src/spec/util/index.ts +++ b/src/spec/util/index.ts @@ -29,7 +29,12 @@ export async function writeText(text: string, browser: Browser<'async'>, delay = } } -export async function deleteTextWithBackspaces(element: Element<'async'>, browser: Browser<'async'>, delay = 0, count = 0) { +export async function deleteTextWithBackspaces( + element: Element<'async'>, + browser: Browser<'async'>, + delay = 0, + count = 0 +) { const length = count > 0 ? count : (await element.getValue()).length for (let i = 0; i < length; i += 1) { await browser.keys(['Backspace']) diff --git a/yarn.lock b/yarn.lock index 056c336..9017d5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,6 +14,14 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" +"@babel/code-frame@^7.0.0": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + "@babel/code-frame@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" @@ -136,6 +144,11 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" @@ -159,6 +172,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.16.7", "@babel/parser@^7.17.3": version "7.17.3" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz" @@ -421,6 +443,25 @@ dir-compare "^2.4.0" fs-extra "^9.0.1" +"@fimbul/bifrost@^0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.21.0.tgz#d0fafa25938fda475657a6a1e407a21bbe02c74e" + integrity sha512-ou8VU+nTmOW1jeg+FT+sn+an/M0Xb9G16RucrfhjXGWv1Q97kCoM5CG9Qj7GYOSdu7km72k7nY83Eyr53Bkakg== + dependencies: + "@fimbul/ymir" "^0.21.0" + get-caller-file "^2.0.0" + tslib "^1.8.1" + tsutils "^3.5.0" + +"@fimbul/ymir@^0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@fimbul/ymir/-/ymir-0.21.0.tgz#8525726787aceeafd4e199472c0d795160b5d4a1" + integrity sha512-T/y7WqPsm4n3zhT08EpB5sfdm2Kvw3gurAxr2Lr5dQeLi8ZsMlNT/Jby+ZmuuAAd1PnXYzKp+2SXgIkQIIMCUg== + dependencies: + inversify "^5.0.0" + reflect-metadata "^0.1.12" + tslib "^1.8.1" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -1286,6 +1327,11 @@ builder-util@22.14.13: stat-mode "^1.0.0" temp-file "^3.4.0" +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== + cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" @@ -1374,7 +1420,7 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1546,6 +1592,11 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.12.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^5.0.0: version "5.1.0" resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" @@ -2037,6 +2088,14 @@ dmg-license@^1.0.9: smart-buffer "^4.0.2" verror "^1.10.0" +doctrine@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" + integrity sha512-qiB/Rir6Un6Ad/TIgTRzsremsTGWzs8j7woXvp14jgq00676uBiBT5eUOi+FgRywZFVy5Us/c04ISRpZhRbS6w== + dependencies: + esutils "^1.1.6" + isarray "0.0.1" + dot-prop@^5.0.0, dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" @@ -2280,6 +2339,11 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esutils@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" + integrity sha512-RG1ZkUT7iFJG9LSHr7KDuuMSlujfeTtMNIcInURxKAxhMtwQhI3NrQhz26gZQYlsYZQKzsnwtpKrFKj9K9Qu1A== + event-stream@=3.3.4: version "3.3.4" resolved "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz" @@ -2481,6 +2545,11 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + gensequence@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/gensequence/-/gensequence-3.1.1.tgz" @@ -2491,7 +2560,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.0, get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -2566,6 +2635,18 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.1: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" @@ -2739,6 +2820,13 @@ hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" +hasown@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" @@ -2866,6 +2954,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +inversify@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730" + integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -2917,6 +3010,13 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" @@ -3062,6 +3162,11 @@ is-yarn-global@^0.3.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -3567,6 +3672,13 @@ minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" @@ -3579,6 +3691,11 @@ minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" @@ -3591,6 +3708,13 @@ mkdirp@0.5.3: dependencies: minimist "^1.2.5" +mkdirp@^0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mkdirp@^0.5.4: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" @@ -3975,6 +4099,11 @@ path-parse@^1.0.6: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-type@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" @@ -4065,10 +4194,10 @@ prepend-http@^2.0.0: resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier@2: - version "2.0.4" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz" - integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== +prettier@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== printj@~1.3.1: version "1.3.1" @@ -4269,6 +4398,11 @@ redux-thunk@^2.3.0: resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== +reflect-metadata@^0.1.12: + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== + regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" @@ -4339,6 +4473,15 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" +resolve@^1.3.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" @@ -4433,6 +4576,11 @@ semver-diff@^3.1.1: resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@^5.3.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" @@ -4808,6 +4956,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + tar-fs@2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" @@ -4913,6 +5066,102 @@ ts-node@^10.5.0: v8-compile-cache-lib "^3.0.0" yn "3.1.1" +tslib@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== + +tslib@^1.13.0, tslib@^1.7.1, tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslint-config-airbnb@^5.11.2: + version "5.11.2" + resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.11.2.tgz#2f3d239fa3923be8e7a4372217a7ed552671528f" + integrity sha512-mUpHPTeeCFx8XARGG/kzYP4dPSOgoCqNiYbGHh09qTH8q+Y1ghsOgaeZKYYQT7IyxMos523z/QBaiv2zKNBcow== + dependencies: + tslint-consistent-codestyle "^1.14.1" + tslint-eslint-rules "^5.4.0" + tslint-microsoft-contrib "~5.2.1" + +tslint-consistent-codestyle@^1.14.1: + version "1.16.0" + resolved "https://registry.yarnpkg.com/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.16.0.tgz#52348ea899a7e025b37cc6545751c6a566a19077" + integrity sha512-ebR/xHyMEuU36hGNOgCfjGBNYxBPixf0yU1Yoo6s3BrpBRFccjPOmIVaVvQsWAUAMdmfzHOCihVkcaMfimqvHw== + dependencies: + "@fimbul/bifrost" "^0.21.0" + tslib "^1.7.1" + tsutils "^2.29.0" + +tslint-eslint-rules@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" + integrity sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w== + dependencies: + doctrine "0.7.2" + tslib "1.9.0" + tsutils "^3.0.0" + +tslint-microsoft-contrib@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz#a6286839f800e2591d041ea2800c77487844ad81" + integrity sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA== + dependencies: + tsutils "^2.27.2 <2.29.0" + +tslint-react-recommended@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/tslint-react-recommended/-/tslint-react-recommended-1.0.15.tgz#4166dc7d87b57280110673c99315a35ac5a76a7e" + integrity sha512-kEPJ+8D4Di30vqcU9ogFHXubyFvphM41EDb7ISnVuIhS0Zes8CntcgG9d9WDZvhPIjyd9pXvLOqc61RA450cpw== + +tslint-react@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/tslint-react/-/tslint-react-5.0.0.tgz#d0ae644e8163bdd3e134012e9353094904e8dd44" + integrity sha512-/IbcSmoBPlFic8kQaRfQ4knTY4mivwo5LVzvozvX6Dyu2ynEnrh1dIcR2ujjyp/IodXqY/H5GbxFxSMo/Kf2Hg== + dependencies: + tsutils "^3.17.1" + +tslint@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.3" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.13.0" + tsutils "^2.29.0" + +"tsutils@^2.27.2 <2.29.0": + version "2.28.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.28.0.tgz#6bd71e160828f9d019b6f4e844742228f85169a1" + integrity sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA== + dependencies: + tslib "^1.8.1" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +tsutils@^3.0.0, tsutils@^3.17.1, tsutils@^3.5.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tunnel@^0.0.6: version "0.0.6" resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz"