fix certificate selection
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no" />
|
||||
@@ -21,12 +22,15 @@
|
||||
0% {
|
||||
background-color: none;
|
||||
}
|
||||
|
||||
25% {
|
||||
background-color: #595585;
|
||||
}
|
||||
|
||||
50% {
|
||||
background-color: #595585;
|
||||
}
|
||||
|
||||
100% {
|
||||
background-color: none;
|
||||
}
|
||||
@@ -37,12 +41,15 @@
|
||||
background-color: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
25% {
|
||||
background-color: #c0c8c0;
|
||||
}
|
||||
|
||||
50% {
|
||||
background-color: #c0c8c0;
|
||||
}
|
||||
|
||||
100% {
|
||||
background-color: none;
|
||||
color: inherit;
|
||||
@@ -139,6 +146,7 @@
|
||||
.Resizer.disabled {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.Resizer.disabled:hover {
|
||||
border-color: transparent;
|
||||
}
|
||||
@@ -146,19 +154,26 @@
|
||||
.example-enter {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.example-enter-active {
|
||||
opacity: 1;
|
||||
transition: opacity 300ms ease-in;
|
||||
}
|
||||
|
||||
.example-exit {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.example-exit-active {
|
||||
opacity: 0;
|
||||
transition: opacity 300ms ease-in;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
global = globalThis //<- this should be enough
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app" style="font: -webkit-control;"></div>
|
||||
<script>
|
||||
@@ -178,4 +193,5 @@
|
||||
<script src="<%- file %>"></script>
|
||||
<% }); %>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -13,20 +13,19 @@
|
||||
"author": "",
|
||||
"license": "CC-BY-ND-4.0",
|
||||
"dependencies": {
|
||||
"@material-ui/core": "^4",
|
||||
"@material-ui/core": "4.12",
|
||||
"@material-ui/icons": "^4",
|
||||
"@material-ui/lab": "^4.0.0-alpha",
|
||||
"@material-ui/styles": "^4",
|
||||
"@material-ui/styles": "4.11",
|
||||
"@types/react-transition-group": "^4",
|
||||
"ace-builds": "^1.4.11",
|
||||
"axios": "^0.19.0",
|
||||
"axios": "^0.26.0",
|
||||
"compare-versions": "^3.5.0",
|
||||
"copy-text-to-clipboard": "^2.1.0",
|
||||
"d3": "^5.9.7",
|
||||
"d3-shape": "^1.3.5",
|
||||
"diff": "^4.0.1",
|
||||
"dot-prop": "^5.0.0",
|
||||
"electron-telemetry": "git+https://github.com/thomasnordquist/electron-telemetry.git#dist",
|
||||
"file-loader": "6",
|
||||
"get-value": "^3.0.1",
|
||||
"immutable": "^4.0.0-rc.12",
|
||||
@@ -35,7 +34,6 @@
|
||||
"json-to-ast": "^2.1.0",
|
||||
"lodash.debounce": "^4.0.8",
|
||||
"lodash.throttle": "^4.1.1",
|
||||
"moment": "^2.24.0",
|
||||
"moving-average": "^1.0.0",
|
||||
"number-abbreviate": "^2.0.0",
|
||||
"parse-duration": "^0.1.1",
|
||||
@@ -56,6 +54,7 @@
|
||||
"uuid": "7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/runtime": "^7.17.2",
|
||||
"@types/d3": "^5.7.2",
|
||||
"@types/diff": "^4.0.1",
|
||||
"@types/get-value": "^3.0.1",
|
||||
@@ -69,24 +68,25 @@
|
||||
"@types/socket.io-client": "^1.4.32",
|
||||
"@types/uuid": "^7.0.2",
|
||||
"@types/vis": "^4.21.9",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"chai": "^4.2.0",
|
||||
"cross-env": "^7.0.2",
|
||||
"css-loader": "^3.0.0",
|
||||
"hard-source-webpack-plugin": "^0.13.1",
|
||||
"heapdump": "^0.3.12",
|
||||
"html-webpack-plugin": "^4.0.0-beta.5",
|
||||
"mocha": "^7.1.1",
|
||||
"html-webpack-plugin": "^5.5.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mocha": "^9.2.1",
|
||||
"moment": "^2.29.1",
|
||||
"node-loader": "^0.6.0",
|
||||
"source-map-loader": "^0.2.4",
|
||||
"style-loader": "^1",
|
||||
"typescript": "^3.6.3",
|
||||
"webpack": "^4.28.2",
|
||||
"webpack-bundle-analyzer": "^3.0.3",
|
||||
"webpack-cli": "^3.3.6",
|
||||
"webpack-dev-server": "^3.1.14"
|
||||
"ts-loader": "^9.2.6",
|
||||
"typescript": "^4.5.5",
|
||||
"webpack": "^5.69.1",
|
||||
"webpack-bundle-analyzer": "^4.5.0",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-dev-server": "^4.7.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"electron": "^5.0.5"
|
||||
"electron": "^17"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,12 +9,14 @@ import {
|
||||
import { default as persistentStorage, StorageIdentifier } from '../utils/PersistentStorage'
|
||||
import { Dispatch } from 'redux'
|
||||
import { showError } from './Global'
|
||||
import { remote } from 'electron'
|
||||
import * as electron from 'electron'
|
||||
import { promises as fsPromise } from 'fs'
|
||||
import * as path from 'path'
|
||||
import { ActionTypes, Action } from '../reducers/ConnectionManager'
|
||||
import { Subscription } from '../../../backend/src/DataSource/MqttSource'
|
||||
import { connectionsMigrator } from './migrations/Connection'
|
||||
import { EventDispatcher, openDialogResponse, OpenDialogResponse, rendererEvents, requestOpenDialog } from '../../../events'
|
||||
import { v4 } from 'uuid'
|
||||
|
||||
export interface ConnectionDictionary {
|
||||
[s: string]: ConnectionOptions
|
||||
@@ -72,10 +74,28 @@ async function openCertificate(): Promise<CertificateParameters> {
|
||||
certificateSizeDoesNotMatch: 'Certificate size larger/smaller then expected.',
|
||||
}
|
||||
|
||||
const openDialogReturnValue = await remote.dialog.showOpenDialog(remote.getCurrentWindow(), {
|
||||
let requestId = v4();
|
||||
|
||||
const response = new Promise<OpenDialogResponse>((resolve, reject) => {
|
||||
let callback = (result: OpenDialogResponse) => {
|
||||
rendererEvents.unsubscribe(openDialogResponse(), callback)
|
||||
if (result.identifier == requestId) {
|
||||
resolve(result)
|
||||
} else {
|
||||
reject(new Error("Unexpected file select"))
|
||||
}
|
||||
}
|
||||
rendererEvents.subscribe(openDialogResponse(), callback)
|
||||
})
|
||||
|
||||
rendererEvents.emit(requestOpenDialog(), {
|
||||
identifier: requestId,
|
||||
options: {
|
||||
properties: ['openFile'],
|
||||
securityScopedBookmarks: true,
|
||||
}
|
||||
})
|
||||
const openDialogReturnValue = (await response).result;
|
||||
|
||||
const selectedFile = openDialogReturnValue.filePaths && openDialogReturnValue.filePaths[0]
|
||||
if (!selectedFile) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { ActionTypes, ConfirmationRequest } from '../reducers/Global'
|
||||
import { Dispatch } from 'redux'
|
||||
|
||||
export const showError = (error?: string) => ({
|
||||
export const showError = (error?: string | unknown) => ({
|
||||
error,
|
||||
type: ActionTypes.showError,
|
||||
})
|
||||
|
||||
@@ -13,6 +13,8 @@ import { connect } from 'react-redux'
|
||||
import { globalActions, settingsActions } from '../actions'
|
||||
import { Theme, withStyles } from '@material-ui/core/styles'
|
||||
|
||||
(window as any).global = window
|
||||
|
||||
const Settings = React.lazy(() => import('./SettingsDrawer/Settings'))
|
||||
const ContentView = React.lazy(() => import('./Layout/ContentView'))
|
||||
|
||||
@@ -66,6 +68,8 @@ class App extends React.PureComponent<Props, {}> {
|
||||
return null
|
||||
}
|
||||
|
||||
const anyProps: any = {};
|
||||
|
||||
return (
|
||||
<div className={centerContent}>
|
||||
<CssBaseline />
|
||||
@@ -73,7 +77,7 @@ class App extends React.PureComponent<Props, {}> {
|
||||
<ConfirmationDialog confirmationRequests={this.props.confirmationRequests} />
|
||||
{this.renderNotification()}
|
||||
<React.Suspense fallback={<div></div>}>
|
||||
<Settings />
|
||||
<Settings {...anyProps} />
|
||||
</React.Suspense>
|
||||
<div className={centerContent}>
|
||||
<div className={`${settingsVisible ? contentShift : content}`}>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as React from 'react'
|
||||
import { Theme, withStyles } from '@material-ui/core'
|
||||
import cursor from './cursor.png'
|
||||
const cursor = require('./cursor.png')
|
||||
|
||||
interface State {
|
||||
enabled: boolean
|
||||
|
||||
@@ -5,7 +5,7 @@ let heapdump: any
|
||||
|
||||
function writeHeapdump(path?: string) {
|
||||
if (!heapdump) {
|
||||
heapdump = require('heapdump')
|
||||
//heapdump = require('heapdump')
|
||||
}
|
||||
|
||||
heapdump.writeSnapshot(path || `${Date.now()}.heapsnapshot`)
|
||||
|
||||
@@ -2,7 +2,6 @@ import * as React from 'react'
|
||||
import PersistentStorage from '../utils/PersistentStorage'
|
||||
import SentimentDissatisfied from '@material-ui/icons/SentimentDissatisfied'
|
||||
import Warning from '@material-ui/icons/Warning'
|
||||
import { electronRendererTelemetry } from 'electron-telemetry'
|
||||
import { Theme, withStyles } from '@material-ui/core/styles'
|
||||
import { Button, Modal, Paper, Toolbar, Typography } from '@material-ui/core'
|
||||
|
||||
@@ -33,7 +32,7 @@ class ErrorBoundary extends React.PureComponent<Props, State> {
|
||||
}
|
||||
|
||||
public componentDidCatch(error: Error, errorInfo: any) {
|
||||
electronRendererTelemetry.trackError(error)
|
||||
// electronRendererTelemetry.trackError(error)
|
||||
console.log('did catch', error)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,10 @@ import DateFormatter from '../helper/DateFormatter'
|
||||
import { AppState } from '../../reducers'
|
||||
import { bindActionCreators } from 'redux'
|
||||
import { connect } from 'react-redux'
|
||||
import { Input, InputLabel, MenuItem, Select, StyleRulesCallback, Theme } from '@material-ui/core'
|
||||
import { Input, InputLabel, MenuItem, Select, Theme } from '@material-ui/core'
|
||||
import { settingsActions } from '../../actions'
|
||||
import { withStyles } from '@material-ui/styles'
|
||||
const moment = require('moment/min/moment-with-locales')
|
||||
const moment = require('moment')
|
||||
|
||||
interface Props {
|
||||
actions: {
|
||||
|
||||
@@ -122,7 +122,7 @@ const EditorMode = memo(function EditorMode(props: {
|
||||
const str = JSON.stringify(JSON.parse(props.payload), undefined, ' ')
|
||||
updatePayload(str)
|
||||
} catch (error) {
|
||||
props.globalActions.showError(`Format error: ${error.message}`)
|
||||
props.globalActions.showError(`Format error: ${(error as Error)?.message}`)
|
||||
}
|
||||
}
|
||||
}, [props.payload])
|
||||
|
||||
@@ -50,7 +50,7 @@ class UpdateNotifier extends React.PureComponent<Props, State> {
|
||||
super(props)
|
||||
this.state = { newerVersions: [] }
|
||||
|
||||
const ownVersion = electron.remote.app.getVersion()
|
||||
const ownVersion = electron.app.getVersion()
|
||||
this.fetchReleases().then(releases => {
|
||||
const newerVersions = releases
|
||||
.filter(release => this.allowPrereleaseIfOwnVersionIsBeta(release, ownVersion))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { electronRendererTelemetry } from 'electron-telemetry'
|
||||
// import { electronRendererTelemetry } from 'electron-telemetry'
|
||||
|
||||
const telemetry = electronRendererTelemetry
|
||||
electronRendererTelemetry.registerErrorHandler()
|
||||
// const telemetry = electronRendererTelemetry
|
||||
// electronRendererTelemetry.registerErrorHandler()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { electronRendererTelemetry } from 'electron-telemetry'
|
||||
// import { electronRendererTelemetry } from 'electron-telemetry'
|
||||
|
||||
// Used to determine long-time-stability and memory leaks
|
||||
function trackProcessStatistics() {
|
||||
@@ -30,6 +30,6 @@ export function trackEvent(name: string) {
|
||||
}
|
||||
const blacklist = ['CONNECTION_SET_HEALTH']
|
||||
if (blacklist.indexOf(name) === -1) {
|
||||
electronRendererTelemetry.trackEvent(name)
|
||||
// electronRendererTelemetry.trackEvent(name)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,18 +4,29 @@
|
||||
"noImplicitAny": true,
|
||||
"strictNullChecks": true,
|
||||
"strict": true,
|
||||
"lib": ["es2017", "dom"],
|
||||
"lib": [
|
||||
"es2017",
|
||||
"dom"
|
||||
],
|
||||
"moduleResolution": "node",
|
||||
"outDir": "./build/",
|
||||
"sourceMap": true,
|
||||
"module": "esnext",
|
||||
"target": "es2017",
|
||||
"jsx": "react",
|
||||
"types": ["react"],
|
||||
"allowSyntheticDefaultImports": true
|
||||
"types": [
|
||||
"react"
|
||||
],
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"include": ["./src/**/*"],
|
||||
"exclude": ["**/*.d.ts", ".src/**/*.png"],
|
||||
"include": [
|
||||
"./src/**/*"
|
||||
],
|
||||
"exclude": [
|
||||
"**/*.d.ts",
|
||||
".src/**/*.png"
|
||||
],
|
||||
"awesomeTypescriptLoaderOptions": {
|
||||
"useCache": true,
|
||||
"transpileModule": true,
|
||||
|
||||
@@ -43,7 +43,7 @@ export class MqttSource implements DataSource<MqttOptions> {
|
||||
try {
|
||||
url = Url.parse(urlStr)
|
||||
} catch (error) {
|
||||
this.stateMachine.setError(error)
|
||||
this.stateMachine.setError(error as Error)
|
||||
throw error
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"skipLibCheck": true,
|
||||
"noImplicitAny": true,
|
||||
"strictNullChecks": true,
|
||||
"outDir": "./build",
|
||||
"strict": true,
|
||||
"lib": ["es2017", "dom"],
|
||||
"lib": [
|
||||
"es2017",
|
||||
"dom"
|
||||
],
|
||||
"sourceMap": true
|
||||
},
|
||||
"includes": [
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { Base64Message } from '../backend/src/Model/Base64Message'
|
||||
import { DataSourceState, MqttOptions } from '../backend/src/DataSource'
|
||||
import { UpdateInfo } from 'builder-util-runtime'
|
||||
import { OpenDialogOptions, OpenDialogReturnValue } from 'electron'
|
||||
|
||||
export interface Event<MessageType> {
|
||||
export type Event<MessageType> = {
|
||||
topic: string
|
||||
}
|
||||
|
||||
@@ -49,3 +50,26 @@ export function makeConnectionMessageEvent(connectionId: string): Event<MqttMess
|
||||
topic: `conn/${connectionId}`,
|
||||
}
|
||||
}
|
||||
|
||||
export interface OpenDialogRequest {
|
||||
identifier: string
|
||||
options: OpenDialogOptions
|
||||
}
|
||||
|
||||
export function requestOpenDialog(): Event<OpenDialogRequest> {
|
||||
return {
|
||||
topic: `requestOpenDialog`,
|
||||
}
|
||||
}
|
||||
|
||||
export interface OpenDialogResponse {
|
||||
identifier: string
|
||||
result: OpenDialogReturnValue
|
||||
}
|
||||
|
||||
export function openDialogResponse(): Event<OpenDialogResponse> {
|
||||
return {
|
||||
topic: `openDialogResponse`,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
17827
package-lock.json
generated
Normal file
17827
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
29
package.json
29
package.json
@@ -79,12 +79,12 @@
|
||||
"@types/node": "^12.6.8",
|
||||
"@types/semver": "7",
|
||||
"@types/sha1": "^1.1.1",
|
||||
"builder-util-runtime": "^8.2.5",
|
||||
"builder-util-runtime": "^9",
|
||||
"chai": "^4.2.0",
|
||||
"cspell": "^4.0.28",
|
||||
"electron": "8.2.3",
|
||||
"electron-builder": "22.5.1",
|
||||
"electron-notarize": "^0.3.0",
|
||||
"electron": "17",
|
||||
"electron-builder": "22",
|
||||
"electron-notarize": "^1.1.1",
|
||||
"mocha": "7.1",
|
||||
"mustache": "4",
|
||||
"npm-run-all": "^4.1.5",
|
||||
@@ -92,23 +92,17 @@
|
||||
"prettier": "2",
|
||||
"redux-thunk": "^2.3.0",
|
||||
"source-map-support": "^0.5.9",
|
||||
"spectron": "10",
|
||||
"ts-node": "^8.2.0",
|
||||
"tslint": "6",
|
||||
"tslint-config-airbnb": "^5.11.1",
|
||||
"tslint-react": "^4.0.0",
|
||||
"tslint-react-recommended": "^1.0.15",
|
||||
"tslint-strict-null-checks": "^1.0.1",
|
||||
"typescript": "^3.2.2",
|
||||
"webdriverio": "6"
|
||||
"spectron": "19",
|
||||
"ts-node": "^10.5.0",
|
||||
"typescript": "^4.5.5",
|
||||
"webdriverio": "7.16"
|
||||
},
|
||||
"dependencies": {
|
||||
"about-window": "^1.12.1",
|
||||
"axios": "^0.19.0",
|
||||
"dot-prop": "^5.0.0",
|
||||
"electron-log": "4.1.1",
|
||||
"electron-telemetry": "git+https://github.com/thomasnordquist/electron-telemetry.git#dist",
|
||||
"electron-updater": "^4.0.6",
|
||||
"electron-log": "4.4.6",
|
||||
"electron-updater": "^4.6",
|
||||
"fs-extra": "9",
|
||||
"js-base64": "^2.5.1",
|
||||
"json-to-ast": "^2.1.0",
|
||||
@@ -117,6 +111,5 @@
|
||||
"mqtt": "^3.0.0",
|
||||
"sha1": "^1.1.1",
|
||||
"yarn-run-all": "^3.1.1"
|
||||
},
|
||||
"optionalDependencies": {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,12 +53,12 @@ async function uploadAsset() {
|
||||
try {
|
||||
uploadUrl = await createDraft(tag)
|
||||
} catch (error) {
|
||||
console.error('failed to create draft', error.stack)
|
||||
console.error('failed to create draft', (error as Error).stack)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('failed to find tag release', error.stack)
|
||||
console.error('failed to find tag release', (error as Error).stack)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ function redirectOutputFor(child: ChildProcess) {
|
||||
}
|
||||
|
||||
async function waitFor(child: ChildProcess) {
|
||||
return new Promise(resolve => {
|
||||
return new Promise<void>(resolve => {
|
||||
child.once('close', () => resolve())
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { autoUpdater, UpdateInfo } from 'electron-updater'
|
||||
import { BuildInfo } from 'electron-telemetry/build/Model'
|
||||
// import { BuildInfo } from 'electron-telemetry/build/Model'
|
||||
|
||||
export function shouldAutoUpdate(build: BuildInfo) {
|
||||
export function shouldAutoUpdate(build: any) {
|
||||
return (
|
||||
build.package !== 'portable' &&
|
||||
build.package !== 'appx' &&
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
import { BuildInfo } from 'electron-telemetry/build/Model'
|
||||
// import { BuildInfo } from 'electron-telemetry/build/Model'
|
||||
|
||||
let buildOptions: BuildInfo = {
|
||||
let buildOptions: any = {
|
||||
platform: process.platform,
|
||||
package: 'unpacked',
|
||||
} as any
|
||||
|
||||
@@ -1,23 +1,34 @@
|
||||
import * as log from 'electron-log'
|
||||
import * as path from 'path'
|
||||
import ConfigStorage from '../backend/src/ConfigStorage'
|
||||
import { app, BrowserWindow, Menu } from 'electron'
|
||||
import { ipcMain, app, BrowserWindow, Menu, dialog } from 'electron'
|
||||
import { autoUpdater } from 'electron-updater'
|
||||
import { ConnectionManager } from '../backend/src/index'
|
||||
import { electronTelemetryFactory } from 'electron-telemetry'
|
||||
// import { electronTelemetryFactory } from 'electron-telemetry'
|
||||
import { menuTemplate } from './MenuTemplate'
|
||||
import buildOptions from './buildOptions'
|
||||
import { waitForDevServer, isDev, runningUiTestOnCi, loadDevTools } from './development'
|
||||
import { shouldAutoUpdate, handleAutoUpdate } from './autoUpdater'
|
||||
import { registerCrashReporter } from './registerCrashReporter'
|
||||
import { backendEvents, EventDispatcher, OpenDialogRequest, openDialogResponse, OpenDialogResponse, requestOpenDialog } from '../events'
|
||||
|
||||
registerCrashReporter()
|
||||
|
||||
if (!isDev() && !runningUiTestOnCi()) {
|
||||
const electronTelemetry = electronTelemetryFactory('9b0c8ca04a361eb8160d98c5', buildOptions)
|
||||
}
|
||||
// if (!isDev() && !runningUiTestOnCi()) {
|
||||
// const electronTelemetry = electronTelemetryFactory('9b0c8ca04a361eb8160d98c5', buildOptions)
|
||||
// }
|
||||
|
||||
app.commandLine.appendSwitch('--no-sandbox')
|
||||
app.whenReady().then(() => {
|
||||
backendEvents.subscribe(requestOpenDialog(), async (request) => {
|
||||
let result = await dialog.showOpenDialog(BrowserWindow.getFocusedWindow() ?? BrowserWindow.getAllWindows()[0], request.options)
|
||||
|
||||
backendEvents.emit(openDialogResponse(), {
|
||||
identifier: request.identifier,
|
||||
result: result
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
autoUpdater.logger = log
|
||||
log.info('App starting...')
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { clickOn, expandTopic, moveToCenterOfElement, sleep, writeText } from '../util'
|
||||
|
||||
export async function clearOldTopics(browser: Browser) {
|
||||
export async function clearOldTopics(browser: Browser<'async'>) {
|
||||
const topics = ['hello', 'test 123']
|
||||
for (const topic of topics) {
|
||||
await expandTopic(topic, browser)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { clickOn, setTextInInput } from '../util'
|
||||
|
||||
export async function connectTo(host: string, browser: Browser) {
|
||||
export async function connectTo(host: string, browser: Browser<'async'>) {
|
||||
await setTextInInput('Host', host, browser)
|
||||
|
||||
await browser.saveScreenshot('screen1.png')
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser } from 'webdriverio'
|
||||
import { clickOn } from '../util'
|
||||
|
||||
export async function copyTopicToClipboard(browser: Browser) {
|
||||
export async function copyTopicToClipboard(browser: Browser<'async'>) {
|
||||
const copyButton = await browser.$('//span[contains(text(), "Topic")]//button')
|
||||
await clickOn(copyButton, browser, 1)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser } from 'webdriverio'
|
||||
import { clickOn } from '../util'
|
||||
|
||||
export async function copyValueToClipboard(browser: Browser) {
|
||||
export async function copyValueToClipboard(browser: Browser<'async'>) {
|
||||
const copyButton = await browser.$('//span[contains(text(), "Value")]//button')
|
||||
await clickOn(copyButton, browser, 1)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { clickOn } from '../util'
|
||||
|
||||
export async function disconnect(browser: Browser) {
|
||||
export async function disconnect(browser: Browser<'async'>) {
|
||||
const disconnectButton = await browser.$('//button/span[contains(text(),"Disconnect")]')
|
||||
await clickOn(disconnectButton, browser)
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
showText,
|
||||
} from '../util'
|
||||
|
||||
export async function publishTopic(browser: Browser) {
|
||||
export async function publishTopic(browser: Browser<'async'>) {
|
||||
await expandTopic('kitchen/lamp/state', browser)
|
||||
const topicInput = await browser.$('//input[contains(@value,"kitchen/lamp/state")][1]')
|
||||
await clickOn(topicInput, browser)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { clickOn } from '../util'
|
||||
|
||||
export async function reconnect(browser: Browser) {
|
||||
export async function reconnect(browser: Browser<'async'>) {
|
||||
const disconnectButton = await browser.$('//button/span[contains(text(),"Disconnect")]')
|
||||
await clickOn(disconnectButton, browser)
|
||||
const connectButton = await browser.$('//button/span[contains(text(),"Connect")]')
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { clickOn, deleteTextWithBackspaces, showText, sleep, writeText } from '../util'
|
||||
|
||||
export async function searchTree(text: string, browser: Browser) {
|
||||
export async function searchTree(text: string, browser: Browser<'async'>) {
|
||||
const searchField = await browser.$('//input[contains(@placeholder, "Search")]')
|
||||
await clickOn(searchField, browser, 1)
|
||||
await writeText(text, browser, 100)
|
||||
await sleep(1500)
|
||||
}
|
||||
|
||||
export async function clearSearch(browser: Browser) {
|
||||
export async function clearSearch(browser: Browser<'async'>) {
|
||||
const searchField = await browser.$('//input[contains(@placeholder, "Search")]')
|
||||
await clickOn(searchField, browser, 1)
|
||||
await deleteTextWithBackspaces(searchField, browser, 100)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser } from 'webdriverio'
|
||||
import { clickOn, sleep, setInputText } from '../util'
|
||||
|
||||
export async function showAdvancedConnectionSettings(browser: Browser) {
|
||||
export async function showAdvancedConnectionSettings(browser: Browser<'async'>) {
|
||||
const advancedSettingsButton = await browser.$('//button/span[contains(text(),"Advanced")]')
|
||||
const addButton = await browser.$('//button/span[contains(text(),"Add")]')
|
||||
const topicInput = await browser.$('//*[contains(@class, "advanced-connection-settings-topic-input")]//input')
|
||||
@@ -24,7 +24,7 @@ export async function showAdvancedConnectionSettings(browser: Browser) {
|
||||
await clickOn(connectButton, browser)
|
||||
}
|
||||
|
||||
async function deleteFirstSubscribedTopic(browser: Browser) {
|
||||
async function deleteFirstSubscribedTopic(browser: Browser<'async'>) {
|
||||
const deleteButton = await browser.$('.advanced-connection-settings-topic-list button')
|
||||
await clickOn(deleteButton, browser)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { expandTopic, sleep } from '../util'
|
||||
|
||||
export async function showJsonPreview(browser: Browser) {
|
||||
export async function showJsonPreview(browser: Browser<'async'>) {
|
||||
await expandTopic('actuality/showcase', browser)
|
||||
await browser.saveScreenshot('screen3.png')
|
||||
await sleep(1000)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser } from 'webdriverio'
|
||||
import { clickOn, showText, sleep } from '../util'
|
||||
|
||||
export async function showMenu(browser: Browser) {
|
||||
export async function showMenu(browser: Browser<'async'>) {
|
||||
const menuButton = await browser.$('//button[contains(@aria-label, "Menu")]')
|
||||
await clickOn(menuButton, browser)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { moveToCenterOfElement, clickOn, clickOnHistory, expandTopic, sleep, writeText } from '../util'
|
||||
|
||||
export async function showNumericPlot(browser: Browser) {
|
||||
export async function showNumericPlot(browser: Browser<'async'>) {
|
||||
await expandTopic('kitchen/coffee_maker', browser)
|
||||
let heater = await valuePreviewGuttersShowChartIcon('heater', browser)
|
||||
await moveToCenterOfElement(heater, browser)
|
||||
@@ -42,7 +42,7 @@ export async function showNumericPlot(browser: Browser) {
|
||||
await clickOnHistory(browser)
|
||||
}
|
||||
|
||||
async function valuePreviewGuttersShowChartIcon(name: string, browser: Browser) {
|
||||
async function valuePreviewGuttersShowChartIcon(name: string, browser: Browser<'async'>) {
|
||||
for (let retries = 0; retries < 2; retries += 1) {
|
||||
try {
|
||||
return await browser.$(`//*[contains(@data-test-type, "ShowChart")][contains(@data-test, "${name}")]`)
|
||||
@@ -53,23 +53,23 @@ async function valuePreviewGuttersShowChartIcon(name: string, browser: Browser)
|
||||
return browser.$(`//*[contains(@data-test-type, "ShowChart")][contains(@data-test, "${name}")]`)
|
||||
}
|
||||
|
||||
async function chartSettings(name: string, browser: Browser) {
|
||||
async function chartSettings(name: string, browser: Browser<'async'>) {
|
||||
const settings = await browser.$(`//*[contains(@data-test-type, "ChartSettings")][contains(@data-test, "${name}")]`)
|
||||
return clickOn(settings, browser)
|
||||
}
|
||||
|
||||
async function clickAway(name: string, browser: Browser) {
|
||||
async function clickAway(name: string, browser: Browser<'async'>) {
|
||||
const settings = await browser.$(`//*[contains(@data-test-type, "ChartPaper")][contains(@data-test, "${name}")]`)
|
||||
await moveToCenterOfElement(settings, browser)
|
||||
await browser.keys(['Escape'])
|
||||
}
|
||||
|
||||
async function removeChart(name: string, browser: Browser) {
|
||||
async function removeChart(name: string, browser: Browser<'async'>) {
|
||||
const remove = await browser.$(`//*[contains(@data-test-type, "RemoveChart")][contains(@data-test, "${name}")]`)
|
||||
return clickOn(remove, browser)
|
||||
}
|
||||
|
||||
async function clickOnMenuPoint(name: string, browser: Browser) {
|
||||
async function clickOnMenuPoint(name: string, browser: Browser<'async'>) {
|
||||
const item = await browser.$(`//li/span[contains(text(), "${name}")]`)
|
||||
return clickOn(item, browser)
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Browser, Element } from 'webdriverio'
|
||||
import { clickOn, showText, sleep } from '../util'
|
||||
|
||||
// Expects a topic with at least two messages to be selected
|
||||
export async function showOffDiffCapability(browser: Browser) {
|
||||
export async function showOffDiffCapability(browser: Browser<'async'>) {
|
||||
await showText('Compare messages', 2000, browser, 'top')
|
||||
|
||||
await showText('Show raw message', 2000, browser, 'bottom')
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
import { showKeys, showText, sleep } from '../util'
|
||||
|
||||
export async function showZoomLevel(browser: Browser) {
|
||||
export async function showZoomLevel(browser: Browser<'async'>) {
|
||||
await showKeys('Zoom in', 2000, browser, 'top', ['Ctrl', '+'])
|
||||
await sleep(2000)
|
||||
await showKeys('Zoom out', 2000, browser, 'middle', ['Ctrl', '-'])
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { clickOn } from './'
|
||||
import { Browser, Element } from 'webdriverio'
|
||||
|
||||
export async function expandTopic(path: string, browser: Browser) {
|
||||
export async function expandTopic(path: string, browser: Browser<'async'>) {
|
||||
const originalTopics = path.split('/')
|
||||
let topics = path.split('/')
|
||||
while (topics.length > 0 && !(await topicMatches(topics, browser))) {
|
||||
@@ -18,7 +18,7 @@ export async function expandTopic(path: string, browser: Browser) {
|
||||
}
|
||||
}
|
||||
|
||||
async function topicMatches(topics: Array<string>, browser: Browser) {
|
||||
async function topicMatches(topics: Array<string>, browser: Browser<'async'>) {
|
||||
const result = await browser.$(topicSelector(topics))
|
||||
return result.isExisting()
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ export function sleep(ms: number, required = false) {
|
||||
})
|
||||
}
|
||||
|
||||
export async function writeText(text: string, browser: Browser, delay = 0) {
|
||||
export async function writeText(text: string, browser: Browser<'async'>, delay = 0) {
|
||||
if (fast) {
|
||||
return browser.keys(text.split(''))
|
||||
}
|
||||
@@ -29,7 +29,7 @@ export async function writeText(text: string, browser: Browser, delay = 0) {
|
||||
}
|
||||
}
|
||||
|
||||
export async function deleteTextWithBackspaces(element: Element, browser: Browser, 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'])
|
||||
@@ -37,13 +37,13 @@ export async function deleteTextWithBackspaces(element: Element, browser: Browse
|
||||
}
|
||||
}
|
||||
|
||||
export async function setInputText(input: Element, text: string, browser: Browser) {
|
||||
export async function setInputText(input: Element<'async'>, text: string, browser: Browser<'async'>) {
|
||||
await clickOn(input, browser, 1)
|
||||
await deleteTextWithBackspaces(input, browser)
|
||||
await input.setValue(text)
|
||||
}
|
||||
|
||||
export async function setTextInInput(name: string, text: string, browser: Browser) {
|
||||
export async function setTextInInput(name: string, text: string, browser: Browser<'async'>) {
|
||||
const input = await browser.$(`//label[contains(text(), "${name}")]/..//input`)
|
||||
await clickOn(input, browser, 1)
|
||||
await browser.$(`//label[contains(text(), "${name}")]/..//input`)
|
||||
@@ -52,7 +52,7 @@ export async function setTextInInput(name: string, text: string, browser: Browse
|
||||
await input.setValue(text)
|
||||
}
|
||||
|
||||
export async function moveToCenterOfElement(element: Element, browser: Browser) {
|
||||
export async function moveToCenterOfElement(element: Element<'async'>, browser: Browser<'async'>) {
|
||||
const { x, y } = await element.getLocation()
|
||||
const { width, height } = await element.getSize()
|
||||
|
||||
@@ -69,12 +69,12 @@ export async function moveToCenterOfElement(element: Element, browser: Browser)
|
||||
await element.moveTo()
|
||||
}
|
||||
|
||||
export async function clickOnHistory(browser: Browser) {
|
||||
export async function clickOnHistory(browser: Browser<'async'>) {
|
||||
const messageHistory = await browser.$('//span/*[contains(text(), "History")]')
|
||||
await clickOn(messageHistory, browser)
|
||||
}
|
||||
|
||||
export async function clickOn(element: Element, browser: Browser, clicks = 1) {
|
||||
export async function clickOn(element: Element<'async'>, browser: Browser<'async'>, clicks = 1) {
|
||||
await moveToCenterOfElement(element, browser)
|
||||
for (let i = 0; i < clicks; i += 1) {
|
||||
await element.click()
|
||||
@@ -82,7 +82,7 @@ export async function clickOn(element: Element, browser: Browser, clicks = 1) {
|
||||
}
|
||||
}
|
||||
|
||||
export async function createFakeMousePointer(browser: Browser) {
|
||||
export async function createFakeMousePointer(browser: Browser<'async'>) {
|
||||
const js = 'window.demo.enableMouse();'
|
||||
|
||||
await browser.execute(js)
|
||||
@@ -91,7 +91,7 @@ export async function createFakeMousePointer(browser: Browser) {
|
||||
export async function showText(
|
||||
text: string,
|
||||
duration: number = 0,
|
||||
browser: Browser,
|
||||
browser: Browser<'async'>,
|
||||
location: 'top' | 'bottom' | 'middle' = 'bottom',
|
||||
keys = []
|
||||
) {
|
||||
@@ -102,7 +102,7 @@ export async function showText(
|
||||
|
||||
type HeapDump = any
|
||||
|
||||
export async function getHeapDump(browser: Browser): Promise<HeapDump> {
|
||||
export async function getHeapDump(browser: Browser<'async'>): Promise<HeapDump> {
|
||||
const filename = 'heapdump.json'
|
||||
const js = `window.demo.writeHeapdump('${filename}');`
|
||||
await browser.execute(js)
|
||||
@@ -125,7 +125,7 @@ export async function countInstancesOf(heapDump: HeapDump, className: ClassNameM
|
||||
export async function showKeys(
|
||||
text: string,
|
||||
duration: number = 0,
|
||||
browser: Browser,
|
||||
browser: Browser<'async'>,
|
||||
location: 'top' | 'bottom' | 'middle' = 'bottom',
|
||||
keys: Array<string> = []
|
||||
) {
|
||||
@@ -134,7 +134,7 @@ export async function showKeys(
|
||||
await browser.execute(js)
|
||||
}
|
||||
|
||||
export async function hideText(browser: Browser) {
|
||||
export async function hideText(browser: Browser<'async'>) {
|
||||
const js = 'window.demo.hideMessage();'
|
||||
await browser.execute(js)
|
||||
await sleep(600)
|
||||
|
||||
@@ -8,9 +8,15 @@
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"sourceRoot": "src/",
|
||||
"lib": ["es2017", "dom"],
|
||||
"lib": [
|
||||
"es2017",
|
||||
"dom"
|
||||
],
|
||||
"sourceMap": true,
|
||||
"types": ["node"]
|
||||
"types": [
|
||||
"node"
|
||||
],
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"include": [
|
||||
"src/electron.ts",
|
||||
@@ -18,5 +24,8 @@
|
||||
"src/spec/demoVideo.ts",
|
||||
"src/spec/leakTest.ts",
|
||||
"scripts/*.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user