From 71dc1c0548090e1c0de51fc85844068e6c0b1e81 Mon Sep 17 00:00:00 2001 From: Alex Kozack Date: Thu, 20 May 2021 14:28:12 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20=D0=A0=D0=B5=D1=84=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D1=82=D0=B8=D0=BF=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BB=D1=8F=20IPC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- packages/main/src/ipc/DialogsHost.ts | 2 +- .../shared/types/ipc/DialogsControllers.ts | 8 ++- packages/shared/types/ipc/Host.ts | 5 ++ .../shared/types/ipc/WindowControllers.ts | 8 ++- packages/shared/types/ipc/index.ts | 8 ++- packages/shared/types/utils.ts | 55 ++++++++++++++++++- 7 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 packages/shared/types/ipc/Host.ts diff --git a/package.json b/package.json index 1d9d0d05..d54fa4bb 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "test": "node tests/app.spec.js", "watch": "node scripts/watch.js", "lint": "eslint . --ext js,ts,vue", - "typecheck": "node scripts/buildEnvTypes.js && concurrently \"npm:typecheck:*\"", + "typecheck": "node scripts/buildEnvTypes.js && concurrently --raw \"npm:typecheck:*\"", "typecheck:main": "tsc --noEmit -p packages/main/tsconfig.json", "typecheck:preload": "tsc --noEmit -p packages/preload/tsconfig.json", "typecheck:renderer": "vue-tsc --noEmit -p packages/renderer/tsconfig.json" diff --git a/packages/main/src/ipc/DialogsHost.ts b/packages/main/src/ipc/DialogsHost.ts index 29e12cd0..c5dc4aa1 100644 --- a/packages/main/src/ipc/DialogsHost.ts +++ b/packages/main/src/ipc/DialogsHost.ts @@ -1,4 +1,4 @@ -import type {DialogsControllers} from '../../../shared/types/ipc/DialogsControllers'; +import type {DialogsControllers} from '/@shared/types/ipc/DialogsControllers'; import {dialog} from 'electron'; class DialogsHost implements DialogsControllers { diff --git a/packages/shared/types/ipc/DialogsControllers.ts b/packages/shared/types/ipc/DialogsControllers.ts index 84a398fe..0c98d667 100644 --- a/packages/shared/types/ipc/DialogsControllers.ts +++ b/packages/shared/types/ipc/DialogsControllers.ts @@ -1,3 +1,9 @@ -export interface DialogsControllers { +import type {HostBase, MethodOnlyHost} from './Host'; + + +interface DialogsControllersBase extends HostBase { showError: (title: string, content: string) => void } + + +export type DialogsControllers = MethodOnlyHost diff --git a/packages/shared/types/ipc/Host.ts b/packages/shared/types/ipc/Host.ts new file mode 100644 index 00000000..0b934399 --- /dev/null +++ b/packages/shared/types/ipc/Host.ts @@ -0,0 +1,5 @@ +import type {ClearIndex, Fn, NonFunctionKeys} from '../utils'; + + +export type HostBase = Record +export type MethodOnlyHost = Omit, NonFunctionKeys>> diff --git a/packages/shared/types/ipc/WindowControllers.ts b/packages/shared/types/ipc/WindowControllers.ts index 5689b87f..3e28421c 100644 --- a/packages/shared/types/ipc/WindowControllers.ts +++ b/packages/shared/types/ipc/WindowControllers.ts @@ -1,7 +1,13 @@ -export interface WindowControllers { +import type {HostBase, MethodOnlyHost} from './Host'; + + +interface WindowControllersBase extends HostBase { minimize: () => void maximize: () => void unmaximize: () => void close: () => void isMaximized: () => boolean } + + +export type WindowControllers = MethodOnlyHost diff --git a/packages/shared/types/ipc/index.ts b/packages/shared/types/ipc/index.ts index d58a2bf1..aeb86545 100644 --- a/packages/shared/types/ipc/index.ts +++ b/packages/shared/types/ipc/index.ts @@ -1,8 +1,14 @@ import type {WindowControllers} from './WindowControllers'; import type {DialogsControllers} from './DialogsControllers'; +import type {HostBase} from './Host'; +import type {ClearIndex} from '../utils'; -export interface IpcNameHostsMap { + + +interface IpcNameHostsMapBase extends Record { 'WindowControllers': WindowControllers 'DialogsControllers': DialogsControllers } + +export type IpcNameHostsMap = ClearIndex diff --git a/packages/shared/types/utils.ts b/packages/shared/types/utils.ts index 34bb9800..3ab4ad1c 100644 --- a/packages/shared/types/utils.ts +++ b/packages/shared/types/utils.ts @@ -1,4 +1,55 @@ export type Promisified = { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly [P in keyof T]: T[P] extends (...a: any[]) => any ? (...a: Parameters) => Promise> : Promise; + readonly [P in keyof T]: T[P] extends Fn ? (...a: Parameters) => Promise> : Promise; } + +/** + * NonUndefined + * @see https://github.com/piotrwitek/utility-types#nonundefineda + * @desc Exclude undefined from set `A` + * @example + * // Expect: "string | null" + * SymmetricDifference; + */ +export type NonUndefined = A extends undefined ? never : A; + + +/** + * FunctionKeys + * @see https://github.com/piotrwitek/utility-types#functionkeyst + * @desc Get union type of keys that are functions in object type `T` + * @example + * type MixedProps = {name: string; setName: (name: string) => void; someKeys?: string; someFn?: (...args: any) => any;}; + * + * // Expect: "setName | someFn" + * type Keys = FunctionKeys; + */ +export declare type FunctionKeys> = { + [K in keyof T]-?: NonUndefined extends Fn ? K : never; +}[keyof T]; + + + +/** + * NonFunctionKeys + * @see https://github.com/piotrwitek/utility-types#nonfunctionkeyst + * @desc Get union type of keys that are non-functions in object type `T` + * @example + * type MixedProps = {name: string; setName: (name: string) => void; someKeys?: string; someFn?: (...args: any) => any;}; + * + * // Expect: "name | someKey" + * type Keys = NonFunctionKeys; + */ +export declare type NonFunctionKeys> = { + [K in keyof T]-?: NonUndefined extends Fn ? never : K; +}[keyof T]; + + + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Fn = (...args: any[]) => any + + + +export type ClearIndex = { + [P in keyof T as string extends P ? never : number extends P ? never : P]: T[P] +};