Merge pull request #756 from thomasnordquist/chore/fix-linting

Chore/fix linting
This commit is contained in:
Björn Dalfors
2024-03-10 11:48:29 +01:00
committed by GitHub
36 changed files with 650 additions and 392 deletions

View File

@@ -60,63 +60,55 @@ export const saveCharts = () => async (dispatch: Dispatch<any>, getState: () =>
} }
} }
export const addChart = (chartParameters: ChartParameters) => async ( export const addChart =
dispatch: Dispatch<any>, (chartParameters: ChartParameters) => async (dispatch: Dispatch<any>, getState: () => AppState) => {
getState: () => AppState const chartExists = Boolean(
) => { getState()
const chartExists = Boolean( .charts.get('charts')
getState() .find(chart => chart.topic === chartParameters.topic && chart.dotPath === chartParameters.dotPath)
.charts.get('charts') )
.find(chart => chart.topic === chartParameters.topic && chart.dotPath === chartParameters.dotPath) if (chartExists) {
) dispatch(showNotification('Already added'))
if (chartExists) { return
dispatch(showNotification('Already added')) }
return
dispatch({
type: ActionTypes.CHARTS_ADD,
chart: chartParameters,
})
dispatch(saveCharts())
dispatch(showNotification('Added to chart panel'))
} }
dispatch({ export const updateChart =
type: ActionTypes.CHARTS_ADD, (chartParameters: ChartParameters) => async (dispatch: Dispatch<any>, getState: () => AppState) => {
chart: chartParameters, dispatch({
}) type: ActionTypes.CHARTS_UPDATE,
dispatch(saveCharts()) topic: chartParameters.topic,
dispatch(showNotification('Added to chart panel')) dotPath: chartParameters.dotPath,
} parameters: chartParameters,
})
dispatch(saveCharts())
}
export const updateChart = (chartParameters: ChartParameters) => async ( export const removeChart =
dispatch: Dispatch<any>, (chartParameters: ChartParameters) => async (dispatch: Dispatch<any>, getState: () => AppState) => {
getState: () => AppState dispatch({
) => { chart: chartParameters,
dispatch({ type: ActionTypes.CHARTS_REMOVE,
type: ActionTypes.CHARTS_UPDATE, })
topic: chartParameters.topic, dispatch(saveCharts())
dotPath: chartParameters.dotPath, }
parameters: chartParameters,
})
dispatch(saveCharts())
}
export const removeChart = (chartParameters: ChartParameters) => async ( export const moveChartUp =
dispatch: Dispatch<any>, (parameters: { topic: string; dotPath?: string }) => async (dispatch: Dispatch<any>, getState: () => AppState) => {
getState: () => AppState dispatch({
) => { topic: parameters.topic,
dispatch({ dotPath: parameters.dotPath,
chart: chartParameters, type: ActionTypes.CHARTS_MOVE_UP,
type: ActionTypes.CHARTS_REMOVE, })
}) dispatch(saveCharts())
dispatch(saveCharts()) }
}
export const moveChartUp = (parameters: { topic: string; dotPath?: string }) => async (
dispatch: Dispatch<any>,
getState: () => AppState
) => {
dispatch({
topic: parameters.topic,
dotPath: parameters.dotPath,
type: ActionTypes.CHARTS_MOVE_UP,
})
dispatch(saveCharts())
}
export const setCharts = (charts: Array<ChartParameters>): Action => { export const setCharts = (charts: Array<ChartParameters>): Action => {
return { return {

View File

@@ -11,31 +11,29 @@ import { showError } from './Global'
import { TopicViewModel } from '../model/TopicViewModel' 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) => ( export const connect =
dispatch: Dispatch<any>, (options: MqttOptions, connectionId: string) => (dispatch: Dispatch<any>, getState: () => AppState) => {
getState: () => AppState dispatch(connecting(connectionId))
) => { rendererEvents.emit(addMqttConnectionEvent, { options, id: connectionId })
dispatch(connecting(connectionId)) const event = makeConnectionStateEvent(connectionId)
rendererEvents.emit(addMqttConnectionEvent, { options, id: connectionId }) const host = url.parse(options.url).hostname
const event = makeConnectionStateEvent(connectionId)
const host = url.parse(options.url).hostname
rendererEvents.subscribe(event, dataSourceState => { rendererEvents.subscribe(event, dataSourceState => {
if (dataSourceState.connected) { if (dataSourceState.connected) {
const didReconnect = Boolean(getState().connection.tree) const didReconnect = Boolean(getState().connection.tree)
if (!didReconnect) { if (!didReconnect) {
const tree = new q.Tree<TopicViewModel>() const tree = new q.Tree<TopicViewModel>()
tree.updateWithConnection(rendererEvents, connectionId) tree.updateWithConnection(rendererEvents, connectionId)
dispatch(showTree(tree)) dispatch(showTree(tree))
dispatch(connected(tree, host!)) dispatch(connected(tree, host!))
}
} else if (dataSourceState.error) {
dispatch(showError(dataSourceState.error))
dispatch(disconnect())
} }
} else if (dataSourceState.error) { dispatch(updateHealth(dataSourceState))
dispatch(showError(dataSourceState.error)) })
dispatch(disconnect()) }
}
dispatch(updateHealth(dataSourceState))
})
}
const updateHealth = (dataSourceState: DataSourceState) => (dispatch: Dispatch<any>, getState: () => AppState) => { const updateHealth = (dataSourceState: DataSourceState) => (dispatch: Dispatch<any>, getState: () => AppState) => {
let state let state

View File

@@ -51,21 +51,19 @@ export const loadConnectionSettings = () => async (dispatch: Dispatch<any>, getS
} }
export type CertificateTypes = 'selfSignedCertificate' | 'clientCertificate' | 'clientKey' export type CertificateTypes = 'selfSignedCertificate' | 'clientCertificate' | 'clientKey'
export const selectCertificate = (type: CertificateTypes, connectionId: string) => async ( export const selectCertificate =
dispatch: Dispatch<any>, (type: CertificateTypes, connectionId: string) => async (dispatch: Dispatch<any>, getState: () => AppState) => {
getState: () => AppState try {
) => { const certificate = await openCertificate()
try { dispatch(
const certificate = await openCertificate() updateConnection(connectionId, {
dispatch( [type]: certificate,
updateConnection(connectionId, { })
[type]: certificate, )
}) } catch (error) {
) dispatch(showError(error))
} catch (error) { }
dispatch(showError(error))
} }
}
async function openCertificate(): Promise<CertificateParameters> { async function openCertificate(): Promise<CertificateParameters> {
const rejectReasons = { const rejectReasons = {

View File

@@ -43,12 +43,14 @@ export const storeSettings = () => async (dispatch: Dispatch<any>, getState: ()
} }
} }
export const setAutoExpandLimit = (autoExpandLimit: number = 0) => (dispatch: Dispatch<any>) => { export const setAutoExpandLimit =
dispatch({ (autoExpandLimit: number = 0) =>
autoExpandLimit, (dispatch: Dispatch<any>) => {
type: ActionTypes.SETTINGS_SET_AUTO_EXPAND_LIMIT, dispatch({
}) autoExpandLimit,
} type: ActionTypes.SETTINGS_SET_AUTO_EXPAND_LIMIT,
})
}
export const setTimeLocale = (timeLocale: string) => (dispatch: Dispatch<any>) => { export const setTimeLocale = (timeLocale: string) => (dispatch: Dispatch<any>) => {
dispatch({ dispatch({
@@ -81,13 +83,15 @@ export const toggleHighlightTopicUpdates = () => (dispatch: Dispatch<any>) => {
dispatch(storeSettings()) dispatch(storeSettings())
} }
export const setTopicOrder = (topicOrder: TopicOrder = TopicOrder.none) => (dispatch: Dispatch<any>) => { export const setTopicOrder =
dispatch({ (topicOrder: TopicOrder = TopicOrder.none) =>
topicOrder, (dispatch: Dispatch<any>) => {
type: ActionTypes.SETTINGS_SET_TOPIC_ORDER, dispatch({
}) topicOrder,
dispatch(storeSettings()) type: ActionTypes.SETTINGS_SET_TOPIC_ORDER,
} })
dispatch(storeSettings())
}
export const filterTopics = (filterStr: string) => (dispatch: Dispatch<any>, getState: () => AppState) => { export const filterTopics = (filterStr: string) => (dispatch: Dispatch<any>, getState: () => AppState) => {
const { tree } = getState().connection const { tree } = getState().connection

View File

@@ -12,12 +12,10 @@ export { clearTopic } from './clearTopic'
export { moveSelectionUpOrDownwards, moveInward, moveOutward } from './visibleTreeTraversal' export { moveSelectionUpOrDownwards, moveInward, moveOutward } from './visibleTreeTraversal'
export const selectTopic = (topic: q.TreeNode<TopicViewModel>) => ( export const selectTopic =
dispatch: Dispatch<any>, (topic: q.TreeNode<TopicViewModel>) => (dispatch: Dispatch<any>, getState: () => AppState) => {
getState: () => AppState debouncedSelectTopic(topic, dispatch, getState)
) => { }
debouncedSelectTopic(topic, dispatch, getState)
}
const debouncedSelectTopic = debounce( const debouncedSelectTopic = debounce(
(topic: q.TreeNode<TopicViewModel>, dispatch: Dispatch<any>, getState: () => AppState) => { (topic: q.TreeNode<TopicViewModel>, dispatch: Dispatch<any>, getState: () => AppState) => {
@@ -74,25 +72,26 @@ function destroyUnreferencedTree(state: AppState) {
} }
} }
export const resetStore = () => (dispatch: Dispatch<any>, getState: () => AppState): AnyAction => { export const resetStore =
destroyUnreferencedTree(getState()) () =>
(dispatch: Dispatch<any>, getState: () => AppState): AnyAction => {
destroyUnreferencedTree(getState())
return dispatch({ return dispatch({
type: ActionTypes.TREE_RESET_STORE, type: ActionTypes.TREE_RESET_STORE,
}) })
} }
export const showTree = (tree: q.Tree<TopicViewModel> | undefined) => ( export const showTree =
dispatch: Dispatch<any>, (tree: q.Tree<TopicViewModel> | undefined) =>
getState: () => AppState (dispatch: Dispatch<any>, getState: () => AppState): AnyAction => {
): AnyAction => { destroyUnreferencedTree(getState())
destroyUnreferencedTree(getState())
return dispatch({ return dispatch({
tree, tree,
type: ActionTypes.TREE_SHOW_TREE, type: ActionTypes.TREE_SHOW_TREE,
}) })
} }
export const togglePause = (tree?: q.Tree<TopicViewModel>) => (dispatch: Dispatch<any>, getState: () => AppState) => { export const togglePause = (tree?: q.Tree<TopicViewModel>) => (dispatch: Dispatch<any>, getState: () => AppState) => {
const paused = getState().tree.get('paused') const paused = getState().tree.get('paused')

View File

@@ -5,52 +5,50 @@ import { makePublishEvent, rendererEvents } from '../../../events'
import { moveSelectionUpOrDownwards } from './visibleTreeTraversal' import { moveSelectionUpOrDownwards } from './visibleTreeTraversal'
import { globalActions } from '.' import { globalActions } from '.'
export const clearTopic = (topic: q.TreeNode<any>, recursive: boolean) => async ( export const clearTopic =
dispatch: Dispatch<any>, (topic: q.TreeNode<any>, recursive: boolean) => async (dispatch: Dispatch<any>, getState: () => AppState) => {
getState: () => AppState const topicsForPurging = recursive ? [topic, ...topic.childTopics()] : [topic]
) => {
const topicsForPurging = recursive ? [topic, ...topic.childTopics()] : [topic]
if (recursive) { if (recursive) {
const topicCount = topic.childTopicCount() const topicCount = topic.childTopicCount()
const topicDelta = topic.hasMessage() ? -1 : 0 const topicDelta = topic.hasMessage() ? -1 : 0
const childTopicsMessage = const childTopicsMessage =
topicCount + topicDelta > 0 topicCount + topicDelta > 0
? ` and ${topicCount + topicDelta} child ${topicCount + topicDelta === 1 ? 'topic' : 'topics'}` ? ` and ${topicCount + topicDelta} child ${topicCount + topicDelta === 1 ? 'topic' : 'topics'}`
: '' : ''
const confirmed = await dispatch( const confirmed = await dispatch(
globalActions.requestConfirmation( globalActions.requestConfirmation(
'Confirm delete', '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.` `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 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)
})
}

View File

@@ -6,53 +6,56 @@ import { SettingsState } from '../reducers/Settings'
import { sortedNodes } from '../sortedNodes' import { sortedNodes } from '../sortedNodes'
import { TopicViewModel } from '../model/TopicViewModel' import { TopicViewModel } from '../model/TopicViewModel'
export const moveSelectionUpOrDownwards = (direction: 'next' | 'previous') => ( export const moveSelectionUpOrDownwards =
dispatch: Dispatch<any>, (direction: 'next' | 'previous') =>
getState: () => AppState (dispatch: Dispatch<any>, getState: () => AppState): any => {
): any => { const state = getState()
const state = getState() const selected = state.tree.get('selectedTopic')
const selected = state.tree.get('selectedTopic') const tree = state.tree.get('tree')
const tree = state.tree.get('tree')
if (!selected || !tree) { if (!selected || !tree) {
if (tree) { if (tree) {
dispatch(selectTopic(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<any>, getState: () => AppState): any => {
const state = getState()
const selected = state.tree.get('selectedTopic')
if (!selected || !selected.viewModel) {
return
} }
if (!selected.viewModel.isExpanded() && selected.edgeCount() > 0) { export const moveInward =
selected.viewModel.setExpanded(true, true) () =>
} else { (dispatch: Dispatch<any>, getState: () => AppState): any => {
dispatch(moveSelectionUpOrDownwards('next')) const state = getState()
} const selected = state.tree.get('selectedTopic')
} if (!selected || !selected.viewModel) {
return
}
export const moveOutward = () => (dispatch: Dispatch<any>, getState: () => AppState): any => { if (!selected.viewModel.isExpanded() && selected.edgeCount() > 0) {
const state = getState() selected.viewModel.setExpanded(true, true)
const selected = state.tree.get('selectedTopic') } else {
if (!selected || !selected.viewModel) { dispatch(moveSelectionUpOrDownwards('next'))
return }
} }
if (selected.viewModel.isExpanded() && selected.edgeCount() > 0) { export const moveOutward =
selected.viewModel.setExpanded(false, true) () =>
} else { (dispatch: Dispatch<any>, getState: () => AppState): any => {
dispatch(moveSelectionUpOrDownwards('previous')) 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<any>) { function isTreeNodeVisible(treeNode: q.TreeNode<any>) {
return Boolean(treeNode.viewModel) return Boolean(treeNode.viewModel)

View File

@@ -12,8 +12,7 @@ import { ConfirmationRequest } from '../reducers/Global'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { globalActions, settingsActions } from '../actions' import { globalActions, settingsActions } from '../actions'
import { Theme, withStyles } from '@material-ui/core/styles' 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 Settings = React.lazy(() => import('./SettingsDrawer/Settings'))
const ContentView = React.lazy(() => import('./Layout/ContentView')) const ContentView = React.lazy(() => import('./Layout/ContentView'))
@@ -68,7 +67,7 @@ class App extends React.PureComponent<Props, {}> {
return null return null
} }
const anyProps: any = {}; const anyProps: any = {}
return ( return (
<div className={centerContent}> <div className={centerContent}>

View File

@@ -43,15 +43,15 @@ class Demo extends React.Component<{ classes: any }, State> {
} }
public componentDidMount() { public componentDidMount() {
; (window as any).demo.enableMouse = () => { ;(window as any).demo.enableMouse = () => {
this.setState({ enabled: true }) 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 stepSizeX = Math.abs(this.state.position.x - x) / (animationTime / this.frameInterval)
const stepSizeY = Math.abs(this.state.position.y - y) / (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.setState({ stepSizeX, stepSizeY, enabled: true, target: { x, y } })
this.moveCloser() this.moveCloser()
} }
} }
public render() { public render() {

View File

@@ -12,7 +12,7 @@ function writeHeapdump(path?: string) {
return path return path
} }
; (window as any).demo = { ;(window as any).demo = {
writeHeapdump, writeHeapdump,
} }

View File

@@ -8,10 +8,10 @@ import { settingsActions } from '../../actions'
import { withStyles } from '@material-ui/styles' import { withStyles } from '@material-ui/styles'
function importAll(r: any) { function importAll(r: any) {
r.keys().forEach(r); r.keys().forEach(r)
} }
// @ts-expect-error -- webpack require // @ts-expect-error -- webpack require
importAll(require.context('moment/locale', true, /\.js$/)); importAll(require.context('moment/locale', true, /\.js$/))
const moment = require('moment') const moment = require('moment')

View File

@@ -43,9 +43,9 @@ class CodeDiff extends React.PureComponent<Props, State> {
private plottableLiteralsIndexedWithLineNumbers() { 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) =>
JsonPropertyLocation isPlottable(l.value) ? l : undefined
> ) as Array<JsonPropertyLocation>
} }
private renderStyledCodeLines(changes: Array<Diff.Change>) { private renderStyledCodeLines(changes: Array<Diff.Change>) {

View File

@@ -83,10 +83,12 @@ class ValueRenderer extends React.Component<Props, State> {
} }
public render() { public render() {
return <div style={{ padding: '0px 0px 8px 0px', width: '100%' }}> return (
{this.props.message?.payload?.decoder === Decoder.SPARKPLUG && "Decoded SparkplugB"} <div style={{ padding: '0px 0px 8px 0px', width: '100%' }}>
{this.renderValue()} {this.props.message?.payload?.decoder === Decoder.SPARKPLUG && 'Decoded SparkplugB'}
</div> {this.renderValue()}
</div>
)
} }
public renderValue() { public renderValue() {

View File

@@ -40,7 +40,7 @@ function nodeDotPathToHistory(startTime: number | undefined, history: q.MessageH
let json: any = {} let json: any = {}
try { try {
json = message.payload ? JSON.parse(Base64Message.toUnicodeString(message.payload)) : {} json = message.payload ? JSON.parse(Base64Message.toUnicodeString(message.payload)) : {}
} catch (ignore) { } } catch (ignore) {}
const value = dotProp.get(json, dotPath) const value = dotProp.get(json, dotPath)

View File

@@ -91,23 +91,26 @@ class TreeComponent extends React.PureComponent<Props, State> {
const updateInterval = Math.max(expectedRenderTime * 7, 300) const updateInterval = Math.max(expectedRenderTime * 7, 300)
const timeUntilNextUpdate = updateInterval - (performance.now() - this.renderTime) const timeUntilNextUpdate = updateInterval - (performance.now() - this.renderTime)
this.updateTimer = setTimeout(() => { this.updateTimer = setTimeout(
window.requestIdleCallback( () => {
() => { window.requestIdleCallback(
this.updateTimer && clearTimeout(this.updateTimer) () => {
this.updateTimer = undefined this.updateTimer && clearTimeout(this.updateTimer)
this.renderTime = performance.now() this.updateTimer = undefined
this.renderTime = performance.now()
window.requestIdleCallback( window.requestIdleCallback(
() => { () => {
this.setState({ lastUpdate: this.renderTime }) this.setState({ lastUpdate: this.renderTime })
}, },
{ timeout: 100 } { timeout: 100 }
) )
}, },
{ timeout: 500 } { timeout: 500 }
) )
}, Math.max(0, timeUntilNextUpdate)) },
Math.max(0, timeUntilNextUpdate)
)
} }
public componentWillUpdate() { public componentWillUpdate() {

View File

@@ -55,8 +55,8 @@ class UpdateNotifier extends React.PureComponent<Props, State> {
} }
private async checkForUpdates() { private async checkForUpdates() {
const ownVersion = await rendererRpc.call(getAppVersion, undefined, 10000); const ownVersion = await rendererRpc.call(getAppVersion, undefined, 10000)
const releases = await this.fetchReleases(); const releases = await this.fetchReleases()
const newerVersions = releases const newerVersions = releases
.filter(release => this.allowPrereleaseIfOwnVersionIsBeta(release, ownVersion)) .filter(release => this.allowPrereleaseIfOwnVersionIsBeta(release, ownVersion))
.filter(release => compareVersions(release.tag_name, ownVersion) > 0) .filter(release => compareVersions(release.tag_name, ownVersion) > 0)

View File

@@ -45,9 +45,11 @@ const initialStateFactory = Record<TreeStateModel>({
filter: undefined, filter: undefined,
}) })
const setPaused = (pause: boolean) => (state: TreeState, action: ShowTree): TreeState => { const setPaused =
return state.set('paused', pause) (pause: boolean) =>
} (state: TreeState, action: ShowTree): TreeState => {
return state.set('paused', pause)
}
const actions: { const actions: {
[s: string]: (state: TreeState, action: ReduxAction) => TreeState [s: string]: (state: TreeState, action: ReduxAction) => TreeState

View File

@@ -1,10 +1,6 @@
import { rendererRpc } from '../../../events' import { rendererRpc } from '../../../events'
import { import { storageStoreEvent, storageLoadEvent, storageClearEvent } from '../../../events/StorageEvents'
storageStoreEvent,
storageLoadEvent,
storageClearEvent,
} from '../../../events/StorageEvents'
export interface StorageIdentifier<Model> { export interface StorageIdentifier<Model> {
id: string id: string
@@ -25,9 +21,13 @@ class RemoteStorage implements PersistentStorage {
} }
public async load<Model>(identifier: StorageIdentifier<Model>): Promise<Model | undefined> { public async load<Model>(identifier: StorageIdentifier<Model>): Promise<Model | undefined> {
const result = await rendererRpc.call(storageLoadEvent, { const result = await rendererRpc.call(
store: identifier.id, storageLoadEvent,
}, 10000) {
store: identifier.id,
},
10000
)
return (result as any).data return (result as any).data
} }

View File

@@ -1,24 +1,23 @@
export const selectTextWithCtrlA = (options?: { targetSelector: string }) => ( export const selectTextWithCtrlA =
e: React.KeyboardEvent<HTMLDivElement> (options?: { targetSelector: string }) => (e: React.KeyboardEvent<HTMLDivElement>) => {
) => { const isCtrlA = (e.metaKey || e.ctrlKey) && e.key === 'a'
const isCtrlA = (e.metaKey || e.ctrlKey) && e.key === 'a'
if (isCtrlA && window.getSelection) { if (isCtrlA && window.getSelection) {
e.persist() e.persist()
e.preventDefault() e.preventDefault()
e.stopPropagation() e.stopPropagation()
const selection = window.getSelection() const selection = window.getSelection()
const range = document.createRange() const range = document.createRange()
const eventTarget = e.target as HTMLElement const eventTarget = e.target as HTMLElement
const target: HTMLElement | null = options ? eventTarget.querySelector(options.targetSelector) : eventTarget const target: HTMLElement | null = options ? eventTarget.querySelector(options.targetSelector) : eventTarget
if (!target) { if (!target) {
console.error('Could not find matching target for Ctrl+A Event') console.error('Could not find matching target for Ctrl+A Event')
} }
if (selection && target) { if (selection && target) {
range.selectNodeContents(target) range.selectNodeContents(target)
selection.removeAllRanges() selection.removeAllRanges()
selection.addRange(range) selection.addRange(range)
}
} }
} }
}

View File

@@ -3,11 +3,7 @@ import * as fs from 'fs-extra'
import * as lowdb from 'lowdb' import * as lowdb from 'lowdb'
import * as path from 'path' import * as path from 'path'
import { backendRpc } from '../../events' import { backendRpc } from '../../events'
import { import { storageClearEvent, storageLoadEvent, storageStoreEvent } from '../../events/StorageEvents'
storageClearEvent,
storageLoadEvent,
storageStoreEvent,
} from '../../events/StorageEvents'
export default class ConfigStorage { export default class ConfigStorage {
private file: string private file: string

View File

@@ -47,7 +47,6 @@ export class MqttSource implements DataSource<MqttOptions> {
throw error throw error
} }
const client = mqttConnect(url.toString(), { const client = mqttConnect(url.toString(), {
resubscribe: false, resubscribe: false,
rejectUnauthorized: options.certValidation, rejectUnauthorized: options.certValidation,

View File

@@ -1,4 +1,4 @@
export enum Decoder { export enum Decoder {
NONE, NONE,
SPARKPLUG SPARKPLUG,
} }

View File

@@ -31,7 +31,7 @@ export class Tree<ViewModel extends Destroyable> extends TreeNode<ViewModel> {
if (!this.paused && this.applyChangesHasCompleted) { if (!this.paused && this.applyChangesHasCompleted) {
this.applyChangesHasCompleted = false this.applyChangesHasCompleted = false
if ((window as any).requestIdleCallback) { if ((window as any).requestIdleCallback) {
; (window as any).requestIdleCallback(() => this.applyUnmergedChanges(), { timeout: 500 }) ;(window as any).requestIdleCallback(() => this.applyUnmergedChanges(), { timeout: 500 })
} else { } else {
this.applyUnmergedChanges() this.applyUnmergedChanges()
} }

View File

@@ -1,24 +1,22 @@
import { readFileSync } from 'fs' import { readFileSync } from 'fs'
import * as protobuf from 'protobufjs' import * as protobuf from 'protobufjs'
import { Base64Message } from './Base64Message'; import { Base64Message } from './Base64Message'
import { Decoder } from './Decoder'; 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 const root = protobuf.parse(buffer.toString()).root
export let SparkplugPayload = root.lookupType('com.cirruslink.sparkplug.protobuf.Payload') export let SparkplugPayload = root.lookupType('com.cirruslink.sparkplug.protobuf.Payload')
export const SparkplugDecoder = { export const SparkplugDecoder = {
decode(input: Buffer): Base64Message | undefined { decode(input: Buffer): Base64Message | undefined {
try { try {
let message = Base64Message.fromString( const message = Base64Message.fromString(
JSON.stringify( JSON.stringify(SparkplugPayload.toObject(SparkplugPayload.decode(new Uint8Array(input))))
SparkplugPayload.toObject(SparkplugPayload.decode(new Uint8Array(input)))
)
) )
message.decoder = Decoder.SPARKPLUG message.decoder = Decoder.SPARKPLUG
return message return message
} catch { } catch {
// ignore // ignore
} }
} },
} }

View File

@@ -1,4 +1,4 @@
export interface CallbackStore { export interface CallbackStore {
wrappedCallback: any; wrappedCallback: any
callback: any; callback: any
} }

View File

@@ -1,8 +1,8 @@
import { Event } from '../Events'; import { Event } from '../Events'
export interface EventBusInterface { export interface EventBusInterface {
subscribe<MessageType>(event: Event<MessageType>, callback: (msg: MessageType) => void): void; subscribe<MessageType>(event: Event<MessageType>, callback: (msg: MessageType) => void): void
unsubscribeAll<MessageType>(event: Event<MessageType>): void; unsubscribeAll<MessageType>(event: Event<MessageType>): void
emit<MessageType>(event: Event<MessageType>, msg: MessageType): void; emit<MessageType>(event: Event<MessageType>, msg: MessageType): void
unsubscribe<MessageType>(event: Event<MessageType>, callback: any): void; unsubscribe<MessageType>(event: Event<MessageType>, callback: any): void
} }

View File

@@ -1,34 +1,34 @@
import { IpcMain } from 'electron'; import { IpcMain } from 'electron'
import { Event } from '../Events'; import { Event } from '../Events'
import { EventBusInterface } from "./EventBusInterface"; import { EventBusInterface } from './EventBusInterface'
export class IpcMainEventBus implements EventBusInterface { export class IpcMainEventBus implements EventBusInterface {
private ipc: IpcMain; private ipc: IpcMain
private client: any; private client: any
constructor(ipc: IpcMain) { constructor(ipc: IpcMain) {
this.ipc = ipc; this.ipc = ipc
} }
public subscribe<MessageType>(subscribeEvent: Event<MessageType>, callback: (msg: MessageType) => void) { public subscribe<MessageType>(subscribeEvent: Event<MessageType>, callback: (msg: MessageType) => void) {
console.log('subscribing', subscribeEvent.topic); console.log('subscribing', subscribeEvent.topic)
this.ipc.on(subscribeEvent.topic, (event: any, arg: any) => { this.ipc.on(subscribeEvent.topic, (event: any, arg: any) => {
this.client = event.sender; this.client = event.sender
callback(arg); callback(arg)
}); })
} }
public unsubscribeAll<MessageType>(event: Event<MessageType>) { public unsubscribeAll<MessageType>(event: Event<MessageType>) {
console.log('unsubscribeAll', event.topic); console.log('unsubscribeAll', event.topic)
this.ipc.removeAllListeners(event.topic); this.ipc.removeAllListeners(event.topic)
} }
public unsubscribe<MessageType>(event: Event<MessageType>, callback: any) { public unsubscribe<MessageType>(event: Event<MessageType>, callback: any) {
throw new Error('Not implemented'); // Todo: implement throw new Error('Not implemented') // Todo: implement
} }
public emit<MessageType>(event: Event<MessageType>, msg: MessageType) { public emit<MessageType>(event: Event<MessageType>, msg: MessageType) {
if (!this.client.isDestroyed()) { if (!this.client.isDestroyed()) {
this.client.send(event.topic, msg); this.client.send(event.topic, msg)
}
} }
}
} }

View File

@@ -1,5 +1,5 @@
import { CallbackStore } from "./CallbackStore" import { CallbackStore } from './CallbackStore'
import { EventBusInterface } from "./EventBusInterface" import { EventBusInterface } from './EventBusInterface'
import { Event } from '../Events' import { Event } from '../Events'
import { IpcRenderer } from 'electron' import { IpcRenderer } from 'electron'
@@ -15,7 +15,7 @@ export class IpcRendererEventBus implements EventBusInterface {
const wrappedCallback = (_: any, arg: any) => { const wrappedCallback = (_: any, arg: any) => {
callback(arg) callback(arg)
} }
console.log("subscribing", event.topic) console.log('subscribing', event.topic)
this.ipc.on(event.topic, wrappedCallback) this.ipc.on(event.topic, wrappedCallback)
this.callbacks.push({ this.callbacks.push({
callback, callback,

View File

@@ -1,53 +1,62 @@
import { Event } from '../Events'; import { Event } from '../Events'
import { EventBusInterface } from './EventBusInterface' import { EventBusInterface } from './EventBusInterface'
import { v4 } from 'uuid'; import { v4 } from 'uuid'
export type RpcEvent<RequstType, ResponseType> = { export type RpcEvent<RequestType, ResponseType> = {
topic: string; topic: string
}; }
export class Rpc { export class Rpc {
constructor(private participant: EventBusInterface) { } constructor(private participant: EventBusInterface) {}
async call<RpcRequest, RpcResponse>(event: RpcEvent<RpcRequest, RpcResponse>, request: RpcRequest, timeout: number = 0): Promise<RpcResponse> { // tslint:disable-next-line:member-access
return new Promise((resolve, reject) => { async call<RpcRequest, RpcResponse>(
let id = v4(); event: RpcEvent<RpcRequest, RpcResponse>,
request: RpcRequest,
timeout: number = 0
): Promise<RpcResponse> {
return new Promise((resolve, reject) => {
const id = v4()
let responseEvent: Event<any> = { topic: `${event.topic}/response/${id}` }; const responseEvent: Event<any> = { topic: `${event.topic}/response/${id}` }
let requestEvent: Event<any> = { topic: `${event.topic}/request` }; const requestEvent: Event<any> = { topic: `${event.topic}/request` }
let callback = (result: { id: string; payload: RpcResponse; error: unknown }) => { const callback = (result: { id: string; payload: RpcResponse; error: unknown }) => {
this.participant.unsubscribe(responseEvent as any, callback); this.participant.unsubscribe(responseEvent as any, callback)
if (result.error) { if (result.error) {
reject(result.error) reject(result.error)
} else { } else {
resolve(result.payload); resolve(result.payload)
} }
console.log("received", result) console.log('received', result)
}; }
this.participant.subscribe(responseEvent, callback); this.participant.subscribe(responseEvent, callback)
this.participant.emit(requestEvent, { id, payload: request }); this.participant.emit(requestEvent, { id, payload: request })
if (timeout > 0) { if (timeout > 0) {
setTimeout(() => { setTimeout(() => {
reject(new Error(`Did not respond to ${event.topic} within ${timeout}ms`)) reject(new Error(`Did not respond to ${event.topic} within ${timeout}ms`))
this.participant.unsubscribe(responseEvent as any, callback); this.participant.unsubscribe(responseEvent as any, callback)
}, 10000) }, 10000)
} }
}); })
} }
async on<RpcRequest, RpcResponse>(event: RpcEvent<RpcRequest, RpcResponse>, handler: (request: RpcRequest) => Promise<RpcResponse>) { // tslint:disable-next-line:member-access
this.participant.subscribe<RpcRequest>({ topic: `${event.topic}/request` } as RpcEvent<any, any>, async (request) => { async on<RpcRequest, RpcResponse>(
let payload; event: RpcEvent<RpcRequest, RpcResponse>,
let error; handler: (request: RpcRequest) => Promise<RpcResponse>
try { ) {
payload = await handler((request as any).payload); this.participant.subscribe<RpcRequest>({ topic: `${event.topic}/request` }, async request => {
} catch (e) { let payload
error = e let error
} try {
const id = (request as any).id payload = await handler((request as any).payload)
console.log(`${event.topic}/response/${id}`, payload, error) } catch (e) {
this.participant.emit({ topic: `${event.topic}/response/${id}` }, { id, payload, error }); 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 })
})
}
} }

View File

@@ -1,7 +1,7 @@
import { Base64Message } from '../backend/src/Model/Base64Message' import { Base64Message } from '../backend/src/Model/Base64Message'
import { DataSourceState, MqttOptions } from '../backend/src/DataSource' import { DataSourceState, MqttOptions } from '../backend/src/DataSource'
import { UpdateInfo } from 'builder-util-runtime' import { UpdateInfo } from 'builder-util-runtime'
import { RpcEvent } from './EventSystem/Rpc'; import { RpcEvent } from './EventSystem/Rpc'
export type Event<MessageType> = { export type Event<MessageType> = {
topic: string topic: string
@@ -52,5 +52,5 @@ export function makeConnectionMessageEvent(connectionId: string): Event<MqttMess
} }
export const getAppVersion: RpcEvent<void, string> = { export const getAppVersion: RpcEvent<void, string> = {
topic: `getAppVersion` topic: 'getAppVersion',
} }

View File

@@ -1,8 +1,8 @@
import { OpenDialogOptions, OpenDialogReturnValue } from 'electron'; import { OpenDialogOptions, OpenDialogReturnValue } from 'electron'
import { RpcEvent } from './EventSystem/Rpc'; import { RpcEvent } from './EventSystem/Rpc'
export function makeOpenDialogRpc(): RpcEvent<OpenDialogOptions, OpenDialogReturnValue> { export function makeOpenDialogRpc(): RpcEvent<OpenDialogOptions, OpenDialogReturnValue> {
return { return {
topic: `openDialog` topic: 'openDialog',
}; }
} }

View File

@@ -1,4 +1,4 @@
export * from './Events' export * from './Events'
export * from './EventSystem/EventDispatcher' export * from './EventSystem/EventDispatcher'
export * from './EventSystem/EventBus' export * from './EventSystem/EventBus'
export * from './EventSystem/EventBusInterface' export * from './EventSystem/EventBusInterface'

View File

@@ -15,8 +15,9 @@
"dev": "npm-run-all --parallel dev:*", "dev": "npm-run-all --parallel dev:*",
"dev:app": "cd app && npm run dev", "dev:app": "cd app && npm run dev",
"dev:electron": "tsc && electron . --development", "dev:electron": "tsc && electron . --development",
"lint": "npm-run-all --parallel lint:prettier lint:tslint lint:spellcheck", "lint": "npm-run-all --parallel lint:prettier lint:tslint",
"lint:prettier": "prettier --check \"**/*.ts{x,}\"", "lint:prettier": "prettier --check \"**/*.ts{x,}\"",
"lint:prettier:fix": "prettier --write \"**/*.ts{x,}\"",
"lint:tslint": "tslint -p ./", "lint:tslint": "tslint -p ./",
"lint:spellcheck": "cspell -e ./build -e \"node_modules\" \"**/*.ts{x,}\"", "lint:spellcheck": "cspell -e ./build -e \"node_modules\" \"**/*.ts{x,}\"",
"build": "tsc && cd app && yarn run build && cd ..", "build": "tsc && cd app && yarn run build && cd ..",
@@ -93,11 +94,15 @@
"mustache": "4", "mustache": "4",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"nyc": "15", "nyc": "15",
"prettier": "2", "prettier": "^3.2.5",
"redux-thunk": "^2.3.0", "redux-thunk": "^2.3.0",
"source-map-support": "^0.5.9", "source-map-support": "^0.5.9",
"spectron": "19", "spectron": "19",
"ts-node": "^10.5.0", "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", "typescript": "^4.5.5",
"webdriverio": "7.16" "webdriverio": "7.16"
}, },
@@ -118,4 +123,4 @@
"uuid": "^8.3.2", "uuid": "^8.3.2",
"yarn-run-all": "^3.1.1" "yarn-run-all": "^3.1.1"
} }
} }

View File

@@ -21,7 +21,7 @@ registerCrashReporter()
app.commandLine.appendSwitch('--no-sandbox') app.commandLine.appendSwitch('--no-sandbox')
app.whenReady().then(() => { app.whenReady().then(() => {
backendRpc.on(makeOpenDialogRpc(), async (request) => { backendRpc.on(makeOpenDialogRpc(), async request => {
return dialog.showOpenDialog(BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0], request) return dialog.showOpenDialog(BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0], request)
}) })
backendRpc.on(getAppVersion, async () => app.getVersion()) backendRpc.on(getAppVersion, async () => app.getVersion())

View File

@@ -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 const length = count > 0 ? count : (await element.getValue()).length
for (let i = 0; i < length; i += 1) { for (let i = 0; i < length; i += 1) {
await browser.keys(['Backspace']) await browser.keys(['Backspace'])

261
yarn.lock
View File

@@ -14,6 +14,14 @@
dependencies: dependencies:
"@jridgewell/trace-mapping" "^0.3.0" "@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": "@babel/code-frame@^7.16.7":
version "7.16.7" version "7.16.7"
resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" 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" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz"
integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== 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": "@babel/helper-validator-option@^7.16.7":
version "7.16.7" version "7.16.7"
resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz"
@@ -159,6 +172,15 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.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": "@babel/parser@^7.16.7", "@babel/parser@^7.17.3":
version "7.17.3" version "7.17.3"
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz"
@@ -421,6 +443,25 @@
dir-compare "^2.4.0" dir-compare "^2.4.0"
fs-extra "^9.0.1" 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": "@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0" version "1.1.0"
resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" 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" stat-mode "^1.0.0"
temp-file "^3.4.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: cacheable-lookup@^5.0.3:
version "5.0.4" version "5.0.4"
resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" 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" strip-ansi "^3.0.0"
supports-color "^2.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" version "2.4.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1546,6 +1592,11 @@ commander@2.9.0:
dependencies: dependencies:
graceful-readlink ">= 1.0.0" 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: commander@^5.0.0:
version "5.1.0" version "5.1.0"
resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" 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" smart-buffer "^4.0.2"
verror "^1.10.0" 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: dot-prop@^5.0.0, dot-prop@^5.2.0:
version "5.3.0" version "5.3.0"
resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" 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" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 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: event-stream@=3.3.4:
version "3.3.4" version "3.3.4"
resolved "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz" 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" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 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: gensequence@^3.1.1:
version "3.1.1" version "3.1.1"
resolved "https://registry.npmjs.org/gensequence/-/gensequence-3.1.1.tgz" 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" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 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" version "2.0.5"
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@@ -2566,6 +2635,18 @@ glob@7.1.3:
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.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: glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.0" version "7.2.0"
resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz"
@@ -2739,6 +2820,13 @@ hasha@^5.0.0:
is-stream "^2.0.0" is-stream "^2.0.0"
type-fest "^0.8.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: he@1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
@@ -2866,6 +2954,11 @@ internal-slot@^1.0.3:
has "^1.0.3" has "^1.0.3"
side-channel "^1.0.4" 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: is-arrayish@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
@@ -2917,6 +3010,13 @@ is-ci@^3.0.0:
dependencies: dependencies:
ci-info "^3.2.0" 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: is-date-object@^1.0.1:
version "1.0.5" version "1.0.5"
resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" 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" resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz"
integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 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: isarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 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: dependencies:
brace-expansion "^1.1.7" 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: minimatch@^5.0.0:
version "5.0.1" version "5.0.1"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" 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" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 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: mkdirp-classic@^0.5.2:
version "0.5.3" version "0.5.3"
resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz"
@@ -3591,6 +3708,13 @@ mkdirp@0.5.3:
dependencies: dependencies:
minimist "^1.2.5" 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: mkdirp@^0.5.4:
version "0.5.5" version "0.5.5"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" 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" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 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: path-type@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" 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" resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
prettier@2: prettier@^3.2.5:
version "2.0.4" version "3.2.5"
resolved "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
printj@~1.3.1: printj@~1.3.1:
version "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" resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz"
integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== 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: regenerator-runtime@^0.13.4:
version "0.13.9" version "0.13.9"
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz"
@@ -4339,6 +4473,15 @@ resolve@^1.10.0:
dependencies: dependencies:
path-parse "^1.0.6" 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: responselike@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" 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" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 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: semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
version "6.3.0" version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
@@ -4808,6 +4956,11 @@ supports-color@^7.1.0:
dependencies: dependencies:
has-flag "^4.0.0" 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: tar-fs@2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" 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" v8-compile-cache-lib "^3.0.0"
yn "3.1.1" 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: tunnel@^0.0.6:
version "0.0.6" version "0.0.6"
resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz" resolved "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz"