This commit is contained in:
Nathan Bierema 2020-10-16 00:41:45 -04:00
parent d8ddaa4056
commit 75b01378e9
13 changed files with 338 additions and 86 deletions

View File

@ -21,16 +21,20 @@
}, },
"scripts": { "scripts": {
"start": "webpack-dev-server --hot --inline --env.development --env.platform=web --progress", "start": "webpack-dev-server --hot --inline --env.development --env.platform=web --progress",
"build": "npm run build:types && npm run build:js && npm run build:web && npm run build:umd && npm run build:umd:min",
"build:types": "tsc --emitDeclarationOnly",
"build:js": "babel src --out-dir lib --extensions \".ts,.tsx\" --source-maps inline",
"build:web": "rimraf ./build/web && webpack -p --env.platform=web --progress", "build:web": "rimraf ./build/web && webpack -p --env.platform=web --progress",
"build:umd": "rimraf ./umd && webpack --progress --config webpack.config.umd.js", "build:umd": "rimraf ./umd && webpack --progress --config webpack.config.umd.js",
"build:umd:min": "webpack --env.production --progress --config webpack.config.umd.js", "build:umd:min": "webpack --env.production --progress --config webpack.config.umd.js",
"build": "rimraf ./lib && babel ./src/app --out-dir lib",
"clean": "rimraf lib", "clean": "rimraf lib",
"test": "jest --no-cache", "test": "jest",
"prepare": "npm run build && npm run build:umd && npm run build:umd:min", "lint": "eslint . --ext .ts,.tsx",
"prepublishOnly": "npm run test && npm run build && npm run build:umd && npm run build:umd:min" "lint:fix": "eslint . --ext .ts,.tsx --fix",
}, "type-check": "tsc --noEmit",
"jest": { "type-check:watch": "npm run type-check -- --watch",
"preversion": "npm run type-check && npm run lint && npm run test",
"prepublishOnly": "npm run clean && npm run build"
}, },
"dependencies": { "dependencies": {
"d3-state-visualizer": "^1.3.4", "d3-state-visualizer": "^1.3.4",
@ -66,6 +70,9 @@
"@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.10.4",
"@babel/preset-env": "^7.11.0", "@babel/preset-env": "^7.11.0",
"@babel/preset-react": "^7.10.4", "@babel/preset-react": "^7.10.4",
"@rjsf/core": "^2.4.0",
"@types/json-schema": "^7.0.6",
"@types/socketcluster-client": "^13.0.3",
"babel-loader": "^8.1.0", "babel-loader": "^8.1.0",
"css-loader": "^4.2.1", "css-loader": "^4.2.1",
"enzyme": "^3.11.0", "enzyme": "^3.11.0",

View File

@ -1,3 +1,5 @@
import { Scheme, Theme } from 'devui';
import { AuthStates, States } from 'socketcluster-client/lib/scclientsocket';
import { import {
CHANGE_SECTION, CHANGE_SECTION,
CHANGE_THEME, CHANGE_THEME,
@ -14,8 +16,24 @@ import {
GET_REPORT_REQUEST, GET_REPORT_REQUEST,
SHOW_NOTIFICATION, SHOW_NOTIFICATION,
CLEAR_NOTIFICATION, CLEAR_NOTIFICATION,
UPDATE_STATE,
UPDATE_REPORTS,
} from '../constants/actionTypes'; } from '../constants/actionTypes';
import { RECONNECT } from '../constants/socketActionTypes'; import {
AUTH_ERROR,
AUTH_REQUEST,
AUTH_SUCCESS,
CONNECT_ERROR,
CONNECT_REQUEST,
CONNECT_SUCCESS,
DEAUTHENTICATE,
DISCONNECTED,
RECONNECT,
SUBSCRIBE_ERROR,
SUBSCRIBE_REQUEST,
SUBSCRIBE_SUCCESS,
UNSUBSCRIBE,
} from '../constants/socketActionTypes';
let monitorReducer; let monitorReducer;
let monitorProps = {}; let monitorProps = {};
@ -29,8 +47,8 @@ export function changeSection(section: string): ChangeSectionAction {
} }
interface ChangeThemeFormData { interface ChangeThemeFormData {
readonly theme: 'default' | 'material'; readonly theme: Theme;
readonly scheme: string; readonly scheme: Scheme;
readonly dark: boolean; readonly dark: boolean;
} }
interface ChangeThemeData { interface ChangeThemeData {
@ -38,8 +56,8 @@ interface ChangeThemeData {
} }
interface ChangeThemeAction { interface ChangeThemeAction {
readonly type: typeof CHANGE_THEME; readonly type: typeof CHANGE_THEME;
readonly theme: 'default' | 'material'; readonly theme: Theme;
readonly scheme: string; readonly scheme: Scheme;
readonly dark: boolean; readonly dark: boolean;
} }
export function changeTheme(data: ChangeThemeData): ChangeThemeAction { export function changeTheme(data: ChangeThemeData): ChangeThemeAction {
@ -138,8 +156,9 @@ export function toggleDispatcher(): ToggleDispatcherAction {
return { type: TOGGLE_DISPATCHER }; return { type: TOGGLE_DISPATCHER };
} }
export type ConnectionType = 'disabled' | 'remotedev' | 'custom';
interface ConnectionOptions { interface ConnectionOptions {
readonly type: 'disabled' | 'remotedev' | 'custom'; readonly type: ConnectionType;
readonly hostname: string; readonly hostname: string;
readonly port: number; readonly port: number;
readonly secure: boolean; readonly secure: boolean;
@ -177,6 +196,72 @@ export function getReport(report) {
return { type: GET_REPORT_REQUEST, report }; return { type: GET_REPORT_REQUEST, report };
} }
interface ConnectRequestAction {
type: typeof CONNECT_REQUEST;
options: ConnectionOptions;
}
interface ConnectSuccessPayload {
id: string;
authState: AuthStates;
socketState: States;
}
interface ConnectSuccessAction {
type: typeof CONNECT_SUCCESS;
payload: ConnectSuccessPayload;
error: Error | undefined;
}
interface ConnectErrorAction {
type: typeof CONNECT_ERROR;
error: Error | undefined;
}
interface AuthRequestAction {
type: typeof AUTH_REQUEST;
}
interface AuthSuccessAction {
type: typeof AUTH_SUCCESS;
baseChannel: string;
}
interface AuthErrorAction {
type: typeof AUTH_ERROR;
error: Error;
}
interface DisconnectedAction {
type: typeof DISCONNECTED;
code: number;
}
interface DeauthenticateAction {
type: typeof DEAUTHENTICATE;
}
interface SubscribeRequestAction {
type: typeof SUBSCRIBE_REQUEST;
channel: string;
subscription: typeof UPDATE_STATE | typeof UPDATE_REPORTS;
}
interface SubscribeSuccessAction {
type: typeof SUBSCRIBE_SUCCESS;
channel: string;
}
interface SubscribeErrorAction {
type: typeof SUBSCRIBE_ERROR;
error: Error;
status: string;
}
interface UnsubscribeAction {
type: typeof UNSUBSCRIBE;
channel: string;
}
export type StoreAction = export type StoreAction =
| ChangeSectionAction | ChangeSectionAction
| ChangeThemeAction | ChangeThemeAction
@ -187,4 +272,16 @@ export type StoreAction =
| ToggleDispatcherAction | ToggleDispatcherAction
| ReconnectAction | ReconnectAction
| ShowNotificationAction | ShowNotificationAction
| ClearNotificationAction; | ClearNotificationAction
| ConnectRequestAction
| ConnectSuccessAction
| ConnectErrorAction
| AuthRequestAction
| AuthSuccessAction
| AuthErrorAction
| DisconnectedAction
| DeauthenticateAction
| SubscribeRequestAction
| SubscribeSuccessAction
| SubscribeErrorAction
| UnsubscribeAction;

View File

@ -1,11 +1,32 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect, ResolveThunks } from 'react-redux'; import { connect, ResolveThunks } from 'react-redux';
import { Container, Form } from 'devui'; import { Container, Form } from 'devui';
import { saveSocketSettings } from '../../actions'; import {
JSONSchema7,
JSONSchema7Definition,
JSONSchema7Type,
JSONSchema7TypeName,
} from 'json-schema';
import { ConnectionType, saveSocketSettings } from '../../actions';
import { StoreState } from '../../reducers'; import { StoreState } from '../../reducers';
import { ConnectionOptions } from '../../reducers/connection';
import { IChangeEvent, ISubmitEvent } from '@rjsf/core';
const defaultSchema = { declare module 'json-schema' {
export interface JSONSchema7 {
enumNames?: JSONSchema7Type[];
}
}
interface Schema {
type: JSONSchema7TypeName;
required?: string[];
properties: {
[key: string]: JSONSchema7Definition;
};
}
const defaultSchema: Schema = {
type: 'object', type: 'object',
required: [], required: [],
properties: { properties: {
@ -41,31 +62,20 @@ type StateProps = ReturnType<typeof mapStateToProps>;
type DispatchProps = ResolveThunks<typeof actionCreators>; type DispatchProps = ResolveThunks<typeof actionCreators>;
type Props = StateProps & DispatchProps; type Props = StateProps & DispatchProps;
class Connection extends Component<Props> { interface FormData extends ConnectionOptions {
constructor(props) { readonly type: ConnectionType;
super(props); }
this.state = this.setFormData(props.type);
}
shouldComponentUpdate(nextProps: Props, nextState) { interface State {
return this.state !== nextState; readonly formData: FormData;
} readonly type: ConnectionType;
readonly schema: Schema;
readonly changed: boolean | undefined;
}
UNSAFE_componentWillReceiveProps(nextProps) { export class Connection extends Component<Props, State> {
if (this.props.options !== nextProps.options) { setFormData = (type: ConnectionType, changed?: boolean) => {
this.setState({ let schema: Schema;
formData: { ...nextProps.options, type: nextProps.type },
});
}
}
handleSave = (data) => {
this.props.saveSettings(data.formData);
this.setState({ changed: false });
};
setFormData = (type, changed) => {
let schema;
if (type !== 'custom') { if (type !== 'custom') {
schema = { schema = {
type: 'object', type: 'object',
@ -85,7 +95,26 @@ class Connection extends Component<Props> {
}; };
}; };
handleChange = (data) => { state: State = this.setFormData(this.props.type);
shouldComponentUpdate(nextProps: Props, nextState: State) {
return this.state !== nextState;
}
UNSAFE_componentWillReceiveProps(nextProps: Props) {
if (this.props.options !== nextProps.options) {
this.setState({
formData: { ...nextProps.options, type: nextProps.type },
});
}
}
handleSave = (data: ISubmitEvent<FormData>) => {
this.props.saveSettings(data.formData);
this.setState({ changed: false });
};
handleChange = (data: IChangeEvent<FormData>) => {
const formData = data.formData; const formData = data.formData;
const type = formData.type; const type = formData.type;
if (type !== this.state.type) { if (type !== this.state.type) {

View File

@ -9,7 +9,7 @@ type StateProps = ReturnType<typeof mapStateToProps>;
type DispatchProps = ResolveThunks<typeof actionCreators>; type DispatchProps = ResolveThunks<typeof actionCreators>;
type Props = StateProps & DispatchProps; type Props = StateProps & DispatchProps;
class Themes extends Component<Props> { export class Themes extends Component<Props> {
render() { render() {
const theme = this.props.theme; const theme = this.props.theme;
const formData = { const formData = {

View File

@ -3,17 +3,19 @@ import { Tabs } from 'devui';
import Connection from './Connection'; import Connection from './Connection';
import Themes from './Themes'; import Themes from './Themes';
class Settings extends Component { interface State {
constructor(props) { selected: string;
super(props); }
this.tabs = [
// eslint-disable-next-line @typescript-eslint/ban-types
class Settings extends Component<{}, State> {
tabs = [
{ name: 'Connection', component: Connection }, { name: 'Connection', component: Connection },
{ name: 'Themes', component: Themes }, { name: 'Themes', component: Themes },
]; ];
this.state = { selected: 'Connection' }; state: State = { selected: 'Connection' };
}
handleSelect = (selected) => { handleSelect = (selected: string) => {
this.setState({ selected }); this.setState({ selected });
}; };

View File

@ -1,5 +1,4 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect, ResolveThunks } from 'react-redux'; import { connect, ResolveThunks } from 'react-redux';
import { Container, Notification } from 'devui'; import { Container, Notification } from 'devui';
import { clearNotification } from '../actions'; import { clearNotification } from '../actions';
@ -41,16 +40,6 @@ class App extends Component<Props> {
} }
} }
App.propTypes = {
section: PropTypes.string.isRequired,
theme: PropTypes.object.isRequired,
notification: PropTypes.shape({
message: PropTypes.string,
type: PropTypes.string,
}),
clearNotification: PropTypes.func,
};
const mapStateToProps = (state: StoreState) => ({ const mapStateToProps = (state: StoreState) => ({
section: state.section, section: state.section,
theme: state.theme, theme: state.theme,

View File

@ -1,5 +1,6 @@
import socketCluster from 'socketcluster-client'; import socketCluster, { SCClientSocket } from 'socketcluster-client';
import { stringify } from 'jsan'; import { stringify } from 'jsan';
import { Dispatch, Middleware, MiddlewareAPI, Store } from 'redux';
import socketOptions from '../constants/socketOptions'; import socketOptions from '../constants/socketOptions';
import * as actions from '../constants/socketActionTypes'; import * as actions from '../constants/socketActionTypes';
import { getActiveInstance } from '../reducers/instances'; import { getActiveInstance } from '../reducers/instances';
@ -12,11 +13,12 @@ import {
GET_REPORT_ERROR, GET_REPORT_ERROR,
GET_REPORT_SUCCESS, GET_REPORT_SUCCESS,
} from '../constants/actionTypes'; } from '../constants/actionTypes';
import { showNotification, importState } from '../actions'; import { showNotification, importState, StoreAction } from '../actions';
import { nonReduxDispatch } from '../utils/monitorActions'; import { nonReduxDispatch } from '../utils/monitorActions';
import { StoreState } from '../reducers';
let socket; let socket: SCClientSocket;
let store; let store: MiddlewareAPI<Dispatch<StoreAction>, StoreState>;
function emit({ message: type, id, instanceId, action, state }) { function emit({ message: type, id, instanceId, action, state }) {
socket.emit(id ? 'sc-' + id : 'respond', { type, action, state, instanceId }); socket.emit(id ? 'sc-' + id : 'respond', { type, action, state, instanceId });
@ -163,7 +165,7 @@ function disconnect() {
} }
function login() { function login() {
socket.emit('login', {}, (error, baseChannel) => { socket.emit('login', {}, (error: Error, baseChannel: string) => {
if (error) { if (error) {
store.dispatch({ type: actions.AUTH_ERROR, error }); store.dispatch({ type: actions.AUTH_ERROR, error });
return; return;
@ -193,13 +195,13 @@ function getReport(reportId) {
}); });
} }
export default function api(inStore) { export default function api(
inStore: MiddlewareAPI<Dispatch<StoreAction>, StoreState>
) {
store = inStore; store = inStore;
return (next) => (action) => { return (next: Dispatch<StoreAction>) => (action: StoreAction) => {
const result = next(action); const result = next(action);
switch ( switch (action.type) {
action.type // eslint-disable-line default-case
) {
case actions.CONNECT_REQUEST: case actions.CONNECT_REQUEST:
connect(); connect();
break; break;

View File

@ -1,14 +1,14 @@
import { RECONNECT } from '../constants/socketActionTypes'; import { RECONNECT } from '../constants/socketActionTypes';
import { StoreAction } from '../actions'; import { ConnectionType, StoreAction } from '../actions';
interface ConnectionOptions { export interface ConnectionOptions {
readonly hostname: string; readonly hostname: string;
readonly port: number; readonly port: number;
readonly secure: boolean; readonly secure: boolean;
} }
export interface ConnectionState { export interface ConnectionState {
readonly options: ConnectionOptions; readonly options: ConnectionOptions;
readonly type: 'disabled' | 'remotedev' | 'custom'; readonly type: ConnectionType;
} }
export default function connection( export default function connection(

View File

@ -1,7 +1,7 @@
import { combineReducers } from 'redux'; import { combineReducers } from 'redux';
import section, { SectionState } from './section'; import section, { SectionState } from './section';
import connection, { ConnectionState } from './connection'; import connection, { ConnectionState } from './connection';
import socket from './socket'; import socket, { SocketState } from './socket';
import monitor from './monitor'; import monitor from './monitor';
import notification, { NotificationState } from './notification'; import notification, { NotificationState } from './notification';
import instances from './instances'; import instances from './instances';
@ -13,6 +13,7 @@ export interface StoreState {
readonly section: SectionState; readonly section: SectionState;
readonly theme: ThemeState; readonly theme: ThemeState;
readonly connection: ConnectionState; readonly connection: ConnectionState;
readonly socket: SocketState;
readonly notification: NotificationState; readonly notification: NotificationState;
} }

View File

@ -10,6 +10,7 @@ import {
import { DISCONNECTED } from '../constants/socketActionTypes'; import { DISCONNECTED } from '../constants/socketActionTypes';
import parseJSON from '../utils/parseJSON'; import parseJSON from '../utils/parseJSON';
import { recompute } from '../utils/updateState'; import { recompute } from '../utils/updateState';
import { StoreAction } from '../actions';
interface InstancesState {} interface InstancesState {}
@ -236,7 +237,7 @@ function init({ type, action, name, libConfig = {} }, connectionId, current) {
}; };
} }
export default function instances(state = initialState, action) { export default function instances(state = initialState, action: StoreAction) {
switch (action.type) { switch (action.type) {
case UPDATE_STATE: { case UPDATE_STATE: {
const { request } = action; const { request } = action;

View File

@ -1,12 +1,20 @@
import { AuthStates, States } from 'socketcluster-client/lib/scclientsocket';
import * as actions from '../constants/socketActionTypes'; import * as actions from '../constants/socketActionTypes';
import { StoreAction } from '../actions'; import { StoreAction } from '../actions';
const initialState = { export interface SocketState {
id: string | null;
channels: string[];
socketState: States;
authState: AuthStates;
error: Error | undefined;
}
const initialState: SocketState = {
id: null, id: null,
channels: [], channels: [],
socketState: actions.CLOSED, socketState: actions.CLOSED,
authState: actions.PENDING, authState: actions.PENDING,
authToken: null,
error: undefined, error: undefined,
}; };
@ -40,7 +48,6 @@ export default function socket(state = initialState, action: StoreAction) {
return { return {
...state, ...state,
authState: actions.AUTHENTICATED, authState: actions.AUTHENTICATED,
authToken: action.authToken,
baseChannel: action.baseChannel, baseChannel: action.baseChannel,
}; };
case actions.AUTH_ERROR: case actions.AUTH_ERROR:
@ -58,13 +65,13 @@ export default function socket(state = initialState, action: StoreAction) {
case actions.SUBSCRIBE_SUCCESS: case actions.SUBSCRIBE_SUCCESS:
return { return {
...state, ...state,
channels: [...state.channels, action.channelName], channels: [...state.channels, action.channel],
}; };
case actions.UNSUBSCRIBE: case actions.UNSUBSCRIBE:
return { return {
...state, ...state,
channels: state.channels.filter( channels: state.channels.filter(
(channel) => channel !== action.channelName (channel) => channel !== action.channel
), ),
}; };
case actions.DISCONNECTED: case actions.DISCONNECTED:

View File

@ -1,14 +1,19 @@
import { Scheme, Theme } from 'devui';
import { CHANGE_THEME } from '../constants/actionTypes'; import { CHANGE_THEME } from '../constants/actionTypes';
import { StoreAction } from '../actions'; import { StoreAction } from '../actions';
export interface ThemeState { export interface ThemeState {
readonly theme: 'default' | 'material'; readonly theme: Theme;
readonly scheme: string; readonly scheme: Scheme;
readonly light: boolean; readonly light: boolean;
} }
export default function theme( export default function theme(
state = { theme: 'default', scheme: 'default', light: true }, state: ThemeState = {
theme: 'default' as const,
scheme: 'default' as const,
light: true,
},
action: StoreAction action: StoreAction
) { ) {
if (action.type === CHANGE_THEME) { if (action.type === CHANGE_THEME) {

114
yarn.lock
View File

@ -3361,6 +3361,11 @@
resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
"@types/async@*":
version "3.2.3"
resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.3.tgz#c56f5e0fc02f8b37196f79239cc857e789b97bb4"
integrity sha512-deXFjLZc1h6SOh3hicVgD+S2EAkhSBGX/vdlD4nTzCjjOFQ+bfNiXocQ21xJjFAUwqaCeyvOQMgrnbg4QEV63A==
"@types/babel__code-frame@^7.0.2": "@types/babel__code-frame@^7.0.2":
version "7.0.2" version "7.0.2"
resolved "https://registry.yarnpkg.com/@types/babel__code-frame/-/babel__code-frame-7.0.2.tgz#e0c0f1648cbc09a9d4e5b4ed2ae9a6f7c8f5aeb0" resolved "https://registry.yarnpkg.com/@types/babel__code-frame/-/babel__code-frame-7.0.2.tgz#e0c0f1648cbc09a9d4e5b4ed2ae9a6f7c8f5aeb0"
@ -3463,6 +3468,11 @@
dependencies: dependencies:
"@types/color-convert" "*" "@types/color-convert" "*"
"@types/component-emitter@*":
version "1.2.10"
resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea"
integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==
"@types/connect-history-api-fallback@*": "@types/connect-history-api-fallback@*":
version "1.3.3" version "1.3.3"
resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz#4772b79b8b53185f0f4c9deab09236baf76ee3b4" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz#4772b79b8b53185f0f4c9deab09236baf76ee3b4"
@ -3545,6 +3555,11 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884"
integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==
"@types/expirymanager@*":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@types/expirymanager/-/expirymanager-0.9.0.tgz#b2ca7610e517924e26b27221603cbe5f92c0e8fc"
integrity sha512-xulG8b5SiBhpRE1Arfx3ji428mfhwQdas6/i+1IJhTLkyFifJ4rF+vve522ds2ZTiBKCUv9WHNuVF/V9PJCa2Q==
"@types/express-serve-static-core@*", "@types/express-serve-static-core@4.17.9": "@types/express-serve-static-core@*", "@types/express-serve-static-core@4.17.9":
version "4.17.9" version "4.17.9"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz#2d7b34dcfd25ec663c25c85d76608f8b249667f1" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz#2d7b34dcfd25ec663c25c85d76608f8b249667f1"
@ -3576,6 +3591,11 @@
resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3" resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3"
integrity sha1-wFTor02d11205jq8dviFFocU1LM= integrity sha1-wFTor02d11205jq8dviFFocU1LM=
"@types/fleximap@*":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@types/fleximap/-/fleximap-0.9.0.tgz#8f084b26bf7284800ee82d960df97324888f555d"
integrity sha512-7VsHgMM7l3jY+MXptDgzvROcEoikVgIxu+8d/qT0WijDl6RXdwAbAQYxu5sBCwUvlf0cEQwiDC4rOvkcm3h+hw==
"@types/fs-capacitor@*": "@types/fs-capacitor@*":
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e" resolved "https://registry.yarnpkg.com/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz#17113e25817f584f58100fb7a08eed288b81956e"
@ -3734,6 +3754,18 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd"
integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==
"@types/json-schema@^7.0.6":
version "7.0.6"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==
"@types/jsonwebtoken@*":
version "8.5.0"
resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#2531d5e300803aa63279b232c014acf780c981c5"
integrity sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==
dependencies:
"@types/node" "*"
"@types/keygrip@*": "@types/keygrip@*":
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
@ -3827,6 +3859,13 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
"@types/ncom@*":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/ncom/-/ncom-1.0.0.tgz#8e33d06fc4914c941ba40ceca042081b947ba699"
integrity sha512-9fmYuP/lvEVfzY+5nZ61ewM/ub9mDINn88BBflTyHX6D7wH5b8oFR3GXrmYjelx79shuogHhHMOtXODDBatVPQ==
dependencies:
"@types/node" "*"
"@types/node-fetch@2.5.7", "@types/node-fetch@^2.5.4": "@types/node-fetch@2.5.7", "@types/node-fetch@^2.5.4":
version "2.5.7" version "2.5.7"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c"
@ -4036,6 +4075,47 @@
dependencies: dependencies:
redux "^4.0.0" redux "^4.0.0"
"@types/sc-auth@*":
version "5.0.0"
resolved "https://registry.yarnpkg.com/@types/sc-auth/-/sc-auth-5.0.0.tgz#b9bca82783419233ed938f59e37ae940bfdb454a"
integrity sha512-V+wuOweEJDrVCMduXmS7zc60O6HGyd5Xm3ClzEXKJfQdrSuhoqvhDjOwbtRZAXCjHll12lBXECb2sht5Glp/6A==
dependencies:
"@types/jsonwebtoken" "*"
"@types/sc-broker-cluster@^6":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/sc-broker-cluster/-/sc-broker-cluster-6.1.3.tgz#b6b0c3cedb635b1ee5098ebd1453e121c6a3d2cc"
integrity sha512-ttxBDnqq+Kcd3lMRQKW471sbv8KBXhJNaKHfFGrRRjWnSpSMa/zhhyAf/ew7/r8S7ZKuR4MFYmKYOwMXv5mm3g==
dependencies:
"@types/async" "*"
"@types/expirymanager" "*"
"@types/fleximap" "*"
"@types/sc-broker" "*"
"@types/sc-channel" "^1"
"@types/socketcluster" "*"
"@types/socketcluster-server" "^14"
"@types/sc-broker@*":
version "8.0.1"
resolved "https://registry.yarnpkg.com/@types/sc-broker/-/sc-broker-8.0.1.tgz#7dcf741386ab08ca9ca39ea6eb9af7fbb77faff2"
integrity sha512-JacbIkcjKs3PIMyw8yuM3rrJf2kw39GMoT83tNyJfvhF0DBLU26OBsO4kxmi82SdnVUubeiSN4/whC4lhOpAYg==
dependencies:
"@types/expirymanager" "*"
"@types/fleximap" "*"
"@types/ncom" "*"
"@types/sc-channel@^1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@types/sc-channel/-/sc-channel-1.2.1.tgz#82e7f50155699b751a7150b679960ca363bfa0b1"
integrity sha512-RYT2V1XlViii3CmPqlZQfv3ADaCzxGPhZfk6MWPfnv3z1dR9wCE/c9lehLtuCz0TYPJYPV48PoocvIdaPAMsUA==
dependencies:
"@types/component-emitter" "*"
"@types/sc-errors@*":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@types/sc-errors/-/sc-errors-1.4.0.tgz#dba1309b695ee8aafc3f574dfedfe4f3c5153419"
integrity sha512-WfBEiw/SVja1ZvJRdt37dOJFxp2llV35n9cPiDCDsFRSvTTYlO4iMFg+NyeEhiWBk1O4bvmyYpAEYzJx1DbHHQ==
"@types/serve-static@*": "@types/serve-static@*":
version "1.13.5" version "1.13.5"
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53"
@ -4054,6 +4134,38 @@
resolved "https://registry.yarnpkg.com/@types/simple-element-resize-detector/-/simple-element-resize-detector-1.3.0.tgz#19b40d71fefa1876ac5d4ba585197ef438946353" resolved "https://registry.yarnpkg.com/@types/simple-element-resize-detector/-/simple-element-resize-detector-1.3.0.tgz#19b40d71fefa1876ac5d4ba585197ef438946353"
integrity sha512-z89ForrCNg+4uwTHjwBCM9LjcsXYC/4O8u3tSi+82v2LCbfiYFpkjH/qQVkDewFBK6FUG7RRV7jw78EGs2maoQ== integrity sha512-z89ForrCNg+4uwTHjwBCM9LjcsXYC/4O8u3tSi+82v2LCbfiYFpkjH/qQVkDewFBK6FUG7RRV7jw78EGs2maoQ==
"@types/socketcluster-client@^13.0.3":
version "13.0.4"
resolved "https://registry.yarnpkg.com/@types/socketcluster-client/-/socketcluster-client-13.0.4.tgz#945593f0a67d09d51b8fb39ea1f750fb6c19aea1"
integrity sha512-kJcm1V+iu09O7+zHY+zkdokNsvu2D965yqs8NhswgWxWU9ctk5f3IcbqMWnNqIe28aEFhvseJrlNM+NCjAEIwQ==
dependencies:
"@types/component-emitter" "*"
"@types/sc-auth" "*"
"@types/sc-channel" "^1"
"@types/sc-errors" "*"
"@types/socketcluster-server" "^14"
"@types/ws" "*"
"@types/socketcluster-server@^14":
version "14.2.5"
resolved "https://registry.yarnpkg.com/@types/socketcluster-server/-/socketcluster-server-14.2.5.tgz#ed323b27e29de8a68dee851096d5fe2d164a8fd1"
integrity sha512-mDdLtv8R43mh6K4w/HmHEkZZMlCKN/B1Cm/seh6NSPBtVxbHhH0hN0KV4em4eY+2+S7FoNi9sFYINDPitOaBwA==
dependencies:
"@types/component-emitter" "*"
"@types/jsonwebtoken" "*"
"@types/sc-auth" "*"
"@types/sc-broker-cluster" "^6"
"@types/ws" "*"
"@types/socketcluster@*":
version "14.0.3"
resolved "https://registry.yarnpkg.com/@types/socketcluster/-/socketcluster-14.0.3.tgz#62a89c3c08c2ee0fca5c265263e3a15fb544dd83"
integrity sha512-E+myXJK1zKtqydI+qWUxthvi4Z76+Ovzz5ijIa/yR8hfOvk1K7VhsbyNrnrk8KWLtJFpostisbPp8eLBAQrnkA==
dependencies:
"@types/sc-auth" "*"
"@types/sc-broker-cluster" "^6"
"@types/socketcluster-server" "^14"
"@types/source-list-map@*": "@types/source-list-map@*":
version "0.1.2" version "0.1.2"
resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
@ -4140,7 +4252,7 @@
"@types/webpack-sources" "*" "@types/webpack-sources" "*"
source-map "^0.6.0" source-map "^0.6.0"
"@types/ws@^7.0.0": "@types/ws@*", "@types/ws@^7.0.0":
version "7.2.7" version "7.2.7"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.7.tgz#362ad1a1d62721bdb725e72c8cccf357078cf5a3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.2.7.tgz#362ad1a1d62721bdb725e72c8cccf357078cf5a3"
integrity sha512-UUFC/xxqFLP17hTva8/lVT0SybLUrfSD9c+iapKb0fEiC8uoDbA+xuZ3pAN603eW+bY8ebSMLm9jXdIPnD0ZgA== integrity sha512-UUFC/xxqFLP17hTva8/lVT0SybLUrfSD9c+iapKb0fEiC8uoDbA+xuZ3pAN603eW+bY8ebSMLm9jXdIPnD0ZgA==