diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aebe0806..7854173a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,6 +49,7 @@ JS package for communicating with the Tauri backend. Published to npm as [`zebar 1. Add a new provider under [`client-api/src/providers/`](https://github.com/glzr-io/zebar/tree/main/packages/client-api/src/providers). 2. Modify [`create-provider.ts`](https://github.com/glzr-io/zebar/blob/main/packages/client-api/src/providers/create-provider.ts) to add the new provider to the `ProviderConfigMap` and `ProviderMap` types, and to create the provider in the switch statement within `createProvider`. + 3. Export the provider's types from [`client-api/src/providers/index.ts`](https://github.com/glzr-io/zebar/blob/main/packages/client-api/src/providers/index.ts). 2. **Add the backend logic for the provider.** diff --git a/packages/client-api/src/providers/battery/battery-provider-types.ts b/packages/client-api/src/providers/battery/battery-provider-types.ts new file mode 100644 index 00000000..f0ee8b39 --- /dev/null +++ b/packages/client-api/src/providers/battery/battery-provider-types.ts @@ -0,0 +1,27 @@ +import type { Provider } from '../create-base-provider'; + +export interface BatteryProviderConfig { + type: 'battery'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type BatteryProvider = Provider< + BatteryProviderConfig, + BatteryOutput +>; + +export interface BatteryOutput { + chargePercent: number; + cycleCount: number; + healthPercent: number; + powerConsumption: number; + state: 'discharging' | 'charging' | 'full' | 'empty' | 'unknown'; + isCharging: boolean; + timeTillEmpty: number | null; + timeTillFull: number | null; + voltage: number | null; +} diff --git a/packages/client-api/src/providers/battery/create-battery-provider.ts b/packages/client-api/src/providers/battery/create-battery-provider.ts index 73a676b3..3edd8046 100644 --- a/packages/client-api/src/providers/battery/create-battery-provider.ts +++ b/packages/client-api/src/providers/battery/create-battery-provider.ts @@ -1,42 +1,18 @@ import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; - -export interface BatteryProviderConfig { - type: 'battery'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + BatteryOutput, + BatteryProvider, + BatteryProviderConfig, +} from './battery-provider-types'; const batteryProviderConfigSchema = z.object({ type: z.literal('battery'), refreshInterval: z.coerce.number().default(60 * 1000), }); -export type BatteryProvider = Provider< - BatteryProviderConfig, - BatteryOutput ->; - -export interface BatteryOutput { - chargePercent: number; - cycleCount: number; - healthPercent: number; - powerConsumption: number; - state: 'discharging' | 'charging' | 'full' | 'empty' | 'unknown'; - isCharging: boolean; - timeTillEmpty: number | null; - timeTillFull: number | null; - voltage: number | null; -} - export function createBatteryProvider( config: BatteryProviderConfig, ): BatteryProvider { diff --git a/packages/client-api/src/providers/cpu/cpu-provider-types.ts b/packages/client-api/src/providers/cpu/cpu-provider-types.ts new file mode 100644 index 00000000..36219813 --- /dev/null +++ b/packages/client-api/src/providers/cpu/cpu-provider-types.ts @@ -0,0 +1,20 @@ +import type { Provider } from '../create-base-provider'; + +export interface CpuProviderConfig { + type: 'cpu'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type CpuProvider = Provider; + +export interface CpuOutput { + frequency: number; + usage: number; + logicalCoreCount: number; + physicalCoreCount: number; + vendor: string; +} diff --git a/packages/client-api/src/providers/cpu/create-cpu-provider.ts b/packages/client-api/src/providers/cpu/create-cpu-provider.ts index d9377fde..308d5f5f 100644 --- a/packages/client-api/src/providers/cpu/create-cpu-provider.ts +++ b/packages/client-api/src/providers/cpu/create-cpu-provider.ts @@ -1,35 +1,18 @@ import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; - -export interface CpuProviderConfig { - type: 'cpu'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + CpuOutput, + CpuProvider, + CpuProviderConfig, +} from './cpu-provider-types'; const cpuProviderConfigSchema = z.object({ type: z.literal('cpu'), refreshInterval: z.coerce.number().default(5 * 1000), }); -export type CpuProvider = Provider; - -export interface CpuOutput { - frequency: number; - usage: number; - logicalCoreCount: number; - physicalCoreCount: number; - vendor: string; -} - export function createCpuProvider(config: CpuProviderConfig): CpuProvider { const mergedConfig = cpuProviderConfigSchema.parse(config); diff --git a/packages/client-api/src/providers/create-provider.ts b/packages/client-api/src/providers/create-provider.ts index b1ea4304..fccd79f5 100644 --- a/packages/client-api/src/providers/create-provider.ts +++ b/packages/client-api/src/providers/create-provider.ts @@ -1,58 +1,55 @@ -import { - createBatteryProvider, - type BatteryProvider, - type BatteryProviderConfig, -} from './battery/create-battery-provider'; -import { - createCpuProvider, - type CpuProvider, - type CpuProviderConfig, -} from './cpu/create-cpu-provider'; -import { - createDateProvider, - type DateProvider, - type DateProviderConfig, -} from './date/create-date-provider'; -import { - createGlazeWmProvider, - type GlazeWmProvider, - type GlazeWmProviderConfig, -} from './glazewm/create-glazewm-provider'; -import { - createHostProvider, - type HostProvider, - type HostProviderConfig, -} from './host/create-host-provider'; -import { - createIpProvider, - type IpProvider, - type IpProviderConfig, -} from './ip/create-ip-provider'; -import { - createKomorebiProvider, - type KomorebiProvider, - type KomorebiProviderConfig, -} from './komorebi/create-komorebi-provider'; -import { - createMemoryProvider, - type MemoryProvider, - type MemoryProviderConfig, -} from './memory/create-memory-provider'; -import { - createNetworkProvider, - type NetworkProvider, - type NetworkProviderConfig, -} from './network/create-network-provider'; -import { - createWeatherProvider, - type WeatherProvider, - type WeatherProviderConfig, -} from './weather/create-weather-provider'; -import { - createKeyboardProvider, - type KeyboardProvider, - type KeyboardProviderConfig, -} from './keyboard/create-keyboard-provider'; +import { createBatteryProvider } from './battery/create-battery-provider'; +import type { + BatteryProviderConfig, + BatteryProvider, +} from './battery/battery-provider-types'; +import { createCpuProvider } from './cpu/create-cpu-provider'; +import type { + CpuProviderConfig, + CpuProvider, +} from './cpu/cpu-provider-types'; +import { createDateProvider } from './date/create-date-provider'; +import type { + DateProviderConfig, + DateProvider, +} from './date/date-provider-types'; +import { createGlazeWmProvider } from './glazewm/create-glazewm-provider'; +import type { + GlazeWmProviderConfig, + GlazeWmProvider, +} from './glazewm/glazewm-provider-types'; +import { createHostProvider } from './host/create-host-provider'; +import type { + HostProviderConfig, + HostProvider, +} from './host/host-provider-types'; +import { createIpProvider } from './ip/create-ip-provider'; +import type { IpProviderConfig, IpProvider } from './ip/ip-provider-types'; +import { createKeyboardProvider } from './keyboard/create-keyboard-provider'; +import type { + KeyboardProviderConfig, + KeyboardProvider, +} from './keyboard/keyboard-provider-types'; +import { createKomorebiProvider } from './komorebi/create-komorebi-provider'; +import type { + KomorebiProviderConfig, + KomorebiProvider, +} from './komorebi/komorebi-provider-types'; +import { createMemoryProvider } from './memory/create-memory-provider'; +import type { + MemoryProviderConfig, + MemoryProvider, +} from './memory/memory-provider-types'; +import { createNetworkProvider } from './network/create-network-provider'; +import type { + NetworkProviderConfig, + NetworkProvider, +} from './network/network-provider-types'; +import { createWeatherProvider } from './weather/create-weather-provider'; +import type { + WeatherProviderConfig, + WeatherProvider, +} from './weather/weather-provider-types'; export interface ProviderConfigMap { battery: BatteryProviderConfig; diff --git a/packages/client-api/src/providers/date/create-date-provider.ts b/packages/client-api/src/providers/date/create-date-provider.ts index 3c71f799..724ecf5c 100644 --- a/packages/client-api/src/providers/date/create-date-provider.ts +++ b/packages/client-api/src/providers/date/create-date-provider.ts @@ -1,49 +1,11 @@ import { DateTime } from 'luxon'; import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; - -export interface DateProviderConfig { - type: 'date'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; - - /** - * Either a UTC offset (eg. `UTC+8`) or an IANA timezone (eg. - * `America/New_York`). Affects the output of {@link DateOutput.formatted}. - * - * A full list of available IANA timezones can be found [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). - */ - timezone?: string; - - /** - * An ISO-639-1 locale, which is either a 2-letter language code - * (eg. `en`) or a 4-letter language + country code (eg. `en-gb`). - * Affects the output of {@link DateOutput.formatted}. - * - * A full list of ISO-639-1 locales can be found [here](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes#Table). - */ - locale?: string; - - /** - * Formatting of the current date into a custom string format. Affects - * the output of {@link DateOutput.formatted}. - * - * Refer to [table of tokens](https://moment.github.io/luxon/#/formatting?id=table-of-tokens) - * for available date/time tokens. - * - * @example - * "yyyy LLL dd" -> "2023 Feb 13" - * "HH 'hours and' mm 'minutes'" -> "20 hours and 55 minutes" - */ - formatting?: string; -} +import { createBaseProvider } from '../create-base-provider'; +import type { + DateProvider, + DateProviderConfig, +} from './date-provider-types'; const dateProviderConfigSchema = z.object({ type: z.literal('date'), @@ -53,33 +15,6 @@ const dateProviderConfigSchema = z.object({ formatting: z.string().default('EEE d MMM t'), }); -export type DateProvider = Provider; - -export interface DateOutput { - /** - * Current date/time as a formatted string. - */ - formatted: string; - - /** - * Current date/time as a JavaScript `Date` object. Uses `new Date()` under - * the hood. - **/ - new: Date; - - /** - * Current date/time as milliseconds since epoch. Uses `Date.now()` under the - * hood. - **/ - now: number; - - /** - * Current date/time as an ISO-8601 string (eg. - * `2017-04-22T20:47:05.335-04:00`). Uses `date.toISOString()` under the hood. - **/ - iso: string; -} - export function createDateProvider( config: DateProviderConfig, ): DateProvider { diff --git a/packages/client-api/src/providers/date/date-provider-types.ts b/packages/client-api/src/providers/date/date-provider-types.ts new file mode 100644 index 00000000..6270a650 --- /dev/null +++ b/packages/client-api/src/providers/date/date-provider-types.ts @@ -0,0 +1,67 @@ +import type { Provider } from '../create-base-provider'; + +export interface DateProviderConfig { + type: 'date'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; + + /** + * Either a UTC offset (eg. `UTC+8`) or an IANA timezone (eg. + * `America/New_York`). Affects the output of {@link DateOutput.formatted}. + * + * A full list of available IANA timezones can be found [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List). + */ + timezone?: string; + + /** + * An ISO-639-1 locale, which is either a 2-letter language code + * (eg. `en`) or a 4-letter language + country code (eg. `en-gb`). + * Affects the output of {@link DateOutput.formatted}. + * + * A full list of ISO-639-1 locales can be found [here](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes#Table). + */ + locale?: string; + + /** + * Formatting of the current date into a custom string format. Affects + * the output of {@link DateOutput.formatted}. + * + * Refer to [table of tokens](https://moment.github.io/luxon/#/formatting?id=table-of-tokens) + * for available date/time tokens. + * + * @example + * "yyyy LLL dd" -> "2023 Feb 13" + * "HH 'hours and' mm 'minutes'" -> "20 hours and 55 minutes" + */ + formatting?: string; +} + +export type DateProvider = Provider; + +export interface DateOutput { + /** + * Current date/time as a formatted string. + */ + formatted: string; + + /** + * Current date/time as a JavaScript `Date` object. Uses `new Date()` under + * the hood. + **/ + new: Date; + + /** + * Current date/time as milliseconds since epoch. Uses `Date.now()` under the + * hood. + **/ + now: number; + + /** + * Current date/time as an ISO-8601 string (eg. + * `2017-04-22T20:47:05.335-04:00`). Uses `date.toISOString()` under the hood. + **/ + iso: string; +} diff --git a/packages/client-api/src/providers/glazewm/create-glazewm-provider.ts b/packages/client-api/src/providers/glazewm/create-glazewm-provider.ts index 28495974..8a8a02ec 100644 --- a/packages/client-api/src/providers/glazewm/create-glazewm-provider.ts +++ b/packages/client-api/src/providers/glazewm/create-glazewm-provider.ts @@ -1,17 +1,12 @@ import { - TilingDirection, WmClient, WmEventType, - type BindingModeConfig, type BindingModesChangedEvent, - type Container, type FocusChangedEvent, type FocusedContainerMovedEvent, - type Monitor, type RunCommandResponse, type TilingDirectionChangedEvent, type UnlistenFn, - type Workspace, type WorkspaceActivatedEvent, type WorkspaceDeactivatedEvent, type WorkspaceUpdatedEvent, @@ -20,89 +15,16 @@ import { z } from 'zod'; import { getMonitors } from '~/desktop'; import { getCoordinateDistance } from '~/utils'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; - -export interface GlazeWmProviderConfig { - type: 'glazewm'; -} +import { createBaseProvider } from '../create-base-provider'; +import type { + GlazeWmProvider, + GlazeWmProviderConfig, +} from './glazewm-provider-types'; const glazeWmProviderConfigSchema = z.object({ type: z.literal('glazewm'), }); -export type GlazeWmProvider = Provider< - GlazeWmProviderConfig, - GlazeWmOutput ->; - -export interface GlazeWmOutput { - /** - * Workspace displayed on the current monitor. - */ - displayedWorkspace: Workspace; - - /** - * Workspace that currently has focus (on any monitor). - */ - focusedWorkspace: Workspace; - - /** - * Workspaces on the current monitor. - */ - currentWorkspaces: Workspace[]; - - /** - * Workspaces across all monitors. - */ - allWorkspaces: Workspace[]; - - /** - * All monitors. - */ - allMonitors: Monitor[]; - - /** - * Monitor that currently has focus. - */ - focusedMonitor: Monitor; - - /** - * Monitor that is nearest to this Zebar widget. - */ - currentMonitor: Monitor; - - /** - * Container that currently has focus (on any monitor). - */ - focusedContainer: Container; - - /** - * Tiling direction of the focused container. - */ - tilingDirection: TilingDirection; - - /** - * Active binding modes; - */ - bindingModes: BindingModeConfig[]; - - /** - * Invokes a WM command (e.g. `"focus --workspace 1"`). - * - * @param command WM command to run (e.g. `"focus --workspace 1"`). - * @param subjectContainerId (optional) ID of container to use as subject. - * If not provided, this defaults to the currently focused container. - * @throws If command fails. - */ - runCommand( - command: string, - subjectContainerId?: string, - ): Promise; -} - export function createGlazeWmProvider( config: GlazeWmProviderConfig, ): GlazeWmProvider { diff --git a/packages/client-api/src/providers/glazewm/glazewm-provider-types.ts b/packages/client-api/src/providers/glazewm/glazewm-provider-types.ts new file mode 100644 index 00000000..0cf0f8f6 --- /dev/null +++ b/packages/client-api/src/providers/glazewm/glazewm-provider-types.ts @@ -0,0 +1,84 @@ +import { + TilingDirection, + type BindingModeConfig, + type Container, + type Monitor, + type RunCommandResponse, + type Workspace, +} from 'glazewm'; + +import type { Provider } from '../create-base-provider'; + +export interface GlazeWmProviderConfig { + type: 'glazewm'; +} + +export type GlazeWmProvider = Provider< + GlazeWmProviderConfig, + GlazeWmOutput +>; + +export interface GlazeWmOutput { + /** + * Workspace displayed on the current monitor. + */ + displayedWorkspace: Workspace; + + /** + * Workspace that currently has focus (on any monitor). + */ + focusedWorkspace: Workspace; + + /** + * Workspaces on the current monitor. + */ + currentWorkspaces: Workspace[]; + + /** + * Workspaces across all monitors. + */ + allWorkspaces: Workspace[]; + + /** + * All monitors. + */ + allMonitors: Monitor[]; + + /** + * Monitor that currently has focus. + */ + focusedMonitor: Monitor; + + /** + * Monitor that is nearest to this Zebar widget. + */ + currentMonitor: Monitor; + + /** + * Container that currently has focus (on any monitor). + */ + focusedContainer: Container; + + /** + * Tiling direction of the focused container. + */ + tilingDirection: TilingDirection; + + /** + * Active binding modes; + */ + bindingModes: BindingModeConfig[]; + + /** + * Invokes a WM command (e.g. `"focus --workspace 1"`). + * + * @param command WM command to run (e.g. `"focus --workspace 1"`). + * @param subjectContainerId (optional) ID of container to use as subject. + * If not provided, this defaults to the currently focused container. + * @throws If command fails. + */ + runCommand( + command: string, + subjectContainerId?: string, + ): Promise; +} diff --git a/packages/client-api/src/providers/host/create-host-provider.ts b/packages/client-api/src/providers/host/create-host-provider.ts index 82a5689b..be91a015 100644 --- a/packages/client-api/src/providers/host/create-host-provider.ts +++ b/packages/client-api/src/providers/host/create-host-provider.ts @@ -1,36 +1,18 @@ import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; - -export interface HostProviderConfig { - type: 'host'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + HostOutput, + HostProvider, + HostProviderConfig, +} from './host-provider-types'; const hostProviderConfigSchema = z.object({ type: z.literal('host'), refreshInterval: z.coerce.number().default(60 * 1000), }); -export type HostProvider = Provider; - -export interface HostOutput { - hostname: string | null; - osName: string | null; - osVersion: string | null; - friendlyOsVersion: string | null; - bootTime: number; - uptime: number; -} - export function createHostProvider( config: HostProviderConfig, ): HostProvider { diff --git a/packages/client-api/src/providers/host/host-provider-types.ts b/packages/client-api/src/providers/host/host-provider-types.ts new file mode 100644 index 00000000..82235c03 --- /dev/null +++ b/packages/client-api/src/providers/host/host-provider-types.ts @@ -0,0 +1,21 @@ +import type { Provider } from '../create-base-provider'; + +export interface HostProviderConfig { + type: 'host'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type HostProvider = Provider; + +export interface HostOutput { + hostname: string | null; + osName: string | null; + osVersion: string | null; + friendlyOsVersion: string | null; + bootTime: number; + uptime: number; +} diff --git a/packages/client-api/src/providers/index.ts b/packages/client-api/src/providers/index.ts index 008fb252..1fe7adbb 100644 --- a/packages/client-api/src/providers/index.ts +++ b/packages/client-api/src/providers/index.ts @@ -1,2 +1,13 @@ +export * from './battery/battery-provider-types'; +export * from './cpu/cpu-provider-types'; +export * from './date/date-provider-types'; +export * from './glazewm/glazewm-provider-types'; +export * from './host/host-provider-types'; +export * from './ip/ip-provider-types'; +export * from './keyboard/keyboard-provider-types'; +export * from './komorebi/komorebi-provider-types'; +export * from './memory/memory-provider-types'; +export * from './network/network-provider-types'; +export * from './weather/weather-provider-types'; export * from './create-provider'; export * from './create-provider-group'; diff --git a/packages/client-api/src/providers/ip/create-ip-provider.ts b/packages/client-api/src/providers/ip/create-ip-provider.ts index 35cb76b4..971a1d52 100644 --- a/packages/client-api/src/providers/ip/create-ip-provider.ts +++ b/packages/client-api/src/providers/ip/create-ip-provider.ts @@ -1,35 +1,18 @@ import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; - -export interface IpProviderConfig { - type: 'ip'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + IpOutput, + IpProvider, + IpProviderConfig, +} from './ip-provider-types'; const ipProviderConfigSchema = z.object({ type: z.literal('ip'), refreshInterval: z.coerce.number().default(60 * 60 * 1000), }); -export type IpProvider = Provider; - -export interface IpOutput { - address: string; - approxCity: string; - approxCountry: string; - approxLatitude: number; - approxLongitude: number; -} - export function createIpProvider(config: IpProviderConfig): IpProvider { const mergedConfig = ipProviderConfigSchema.parse(config); diff --git a/packages/client-api/src/providers/ip/ip-provider-types.ts b/packages/client-api/src/providers/ip/ip-provider-types.ts new file mode 100644 index 00000000..abee5ea3 --- /dev/null +++ b/packages/client-api/src/providers/ip/ip-provider-types.ts @@ -0,0 +1,20 @@ +import type { Provider } from '../create-base-provider'; + +export interface IpProviderConfig { + type: 'ip'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type IpProvider = Provider; + +export interface IpOutput { + address: string; + approxCity: string; + approxCountry: string; + approxLatitude: number; + approxLongitude: number; +} diff --git a/packages/client-api/src/providers/keyboard/create-keyboard-provider.ts b/packages/client-api/src/providers/keyboard/create-keyboard-provider.ts index 8ee2b13e..8fa16053 100644 --- a/packages/client-api/src/providers/keyboard/create-keyboard-provider.ts +++ b/packages/client-api/src/providers/keyboard/create-keyboard-provider.ts @@ -1,34 +1,18 @@ import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; - -export interface KeyboardProviderConfig { - type: 'keyboard'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + KeyboardOutput, + KeyboardProvider, + KeyboardProviderConfig, +} from './keyboard-provider-types'; const keyboardProviderConfigSchema = z.object({ type: z.literal('keyboard'), refreshInterval: z.coerce.number().default(1000), }); -export type KeyboardProvider = Provider< - KeyboardProviderConfig, - KeyboardOutput ->; - -export interface KeyboardOutput { - layout: string; -} - export function createKeyboardProvider( config: KeyboardProviderConfig, ): KeyboardProvider { diff --git a/packages/client-api/src/providers/keyboard/keyboard-provider-types.ts b/packages/client-api/src/providers/keyboard/keyboard-provider-types.ts new file mode 100644 index 00000000..e0d31dbd --- /dev/null +++ b/packages/client-api/src/providers/keyboard/keyboard-provider-types.ts @@ -0,0 +1,19 @@ +import type { Provider } from '../create-base-provider'; + +export interface KeyboardProviderConfig { + type: 'keyboard'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type KeyboardProvider = Provider< + KeyboardProviderConfig, + KeyboardOutput +>; + +export interface KeyboardOutput { + layout: string; +} diff --git a/packages/client-api/src/providers/komorebi/create-komorebi-provider.ts b/packages/client-api/src/providers/komorebi/create-komorebi-provider.ts index 36bd8b8c..16021b10 100644 --- a/packages/client-api/src/providers/komorebi/create-komorebi-provider.ts +++ b/packages/client-api/src/providers/komorebi/create-komorebi-provider.ts @@ -2,125 +2,17 @@ import { z } from 'zod'; import { getMonitors, onProviderEmit } from '~/desktop'; import { getCoordinateDistance } from '~/utils'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; - -export interface KomorebiProviderConfig { - type: 'komorebi'; -} +import { createBaseProvider } from '../create-base-provider'; +import type { + KomorebiProvider, + KomorebiProviderConfig, + KomorebiResponse, +} from './komorebi-provider-types'; const komorebiProviderConfigSchema = z.object({ type: z.literal('komorebi'), }); -export type KomorebiProvider = Provider< - KomorebiProviderConfig, - KomorebiOutput ->; - -export interface KomorebiOutput { - /** - * Workspace displayed on the current monitor. - */ - displayedWorkspace: KomorebiWorkspace; - - /** - * Workspace that currently has focus (on any monitor). - */ - focusedWorkspace: KomorebiWorkspace; - - /** - * Workspaces on the current monitor. - */ - currentWorkspaces: KomorebiWorkspace[]; - - /** - * Workspaces across all monitors. - */ - allWorkspaces: KomorebiWorkspace[]; - - /** - * All monitors. - */ - allMonitors: KomorebiMonitor[]; - - /** - * Monitor that currently has focus. - */ - focusedMonitor: KomorebiMonitor; - - /** - * Monitor that is nearest to this Zebar widget. - */ - currentMonitor: KomorebiMonitor; -} - -interface KomorebiResponse { - allMonitors: KomorebiMonitor[]; - focusedMonitorIndex: number; -} - -export interface KomorebiMonitor { - id: number; - deviceId: string; - focusedWorkspaceIndex: number; - name: string; - size: KomorebiRect; - workAreaOffset: number | null; - workAreaSize: KomorebiRect; - workspaces: KomorebiWorkspace[]; -} - -export interface KomorebiWorkspace { - containerPadding: number | null; - floatingWindows: KomorebiWindow[]; - focusedContainerIndex: number; - latestLayout: KomorebiRect[]; - layout: KomorebiLayout; - layoutFlip: KomorebiLayoutFlip | null; - maximizedWindow: KomorebiWindow | null; - monocleContainer: KomorebiContainer | null; - name: string | null; - tilingContainers: KomorebiContainer[]; - workspacePadding: number | null; -} - -export interface KomorebiContainer { - id: string; - windows: KomorebiWindow[]; -} - -export interface KomorebiWindow { - class: string | null; - exe: string | null; - hwnd: number; - title: string | null; -} - -export interface KomorebiRect { - left: number; - top: number; - right: number; - bottom: number; -} - -export type KomorebiLayout = - | 'bsp' - | 'vertical_stack' - | 'horizontal_stack' - | 'ultrawide_vertical_stack' - | 'rows' - | 'grid' - | 'right_main_vertical_stack' - | 'custom'; - -export type KomorebiLayoutFlip = - | 'horizontal' - | 'vertical' - | 'horizontal_and_vertical'; - export function createKomorebiProvider( config: KomorebiProviderConfig, ): KomorebiProvider { diff --git a/packages/client-api/src/providers/komorebi/komorebi-provider-types.ts b/packages/client-api/src/providers/komorebi/komorebi-provider-types.ts new file mode 100644 index 00000000..f354bfbb --- /dev/null +++ b/packages/client-api/src/providers/komorebi/komorebi-provider-types.ts @@ -0,0 +1,111 @@ +import type { Provider } from '../create-base-provider'; + +export interface KomorebiProviderConfig { + type: 'komorebi'; +} + +export type KomorebiProvider = Provider< + KomorebiProviderConfig, + KomorebiOutput +>; + +export interface KomorebiOutput { + /** + * Workspace displayed on the current monitor. + */ + displayedWorkspace: KomorebiWorkspace; + + /** + * Workspace that currently has focus (on any monitor). + */ + focusedWorkspace: KomorebiWorkspace; + + /** + * Workspaces on the current monitor. + */ + currentWorkspaces: KomorebiWorkspace[]; + + /** + * Workspaces across all monitors. + */ + allWorkspaces: KomorebiWorkspace[]; + + /** + * All monitors. + */ + allMonitors: KomorebiMonitor[]; + + /** + * Monitor that currently has focus. + */ + focusedMonitor: KomorebiMonitor; + + /** + * Monitor that is nearest to this Zebar widget. + */ + currentMonitor: KomorebiMonitor; +} + +export interface KomorebiResponse { + allMonitors: KomorebiMonitor[]; + focusedMonitorIndex: number; +} + +export interface KomorebiMonitor { + id: number; + deviceId: string; + focusedWorkspaceIndex: number; + name: string; + size: KomorebiRect; + workAreaOffset: number | null; + workAreaSize: KomorebiRect; + workspaces: KomorebiWorkspace[]; +} + +export interface KomorebiWorkspace { + containerPadding: number | null; + floatingWindows: KomorebiWindow[]; + focusedContainerIndex: number; + latestLayout: KomorebiRect[]; + layout: KomorebiLayout; + layoutFlip: KomorebiLayoutFlip | null; + maximizedWindow: KomorebiWindow | null; + monocleContainer: KomorebiContainer | null; + name: string | null; + tilingContainers: KomorebiContainer[]; + workspacePadding: number | null; +} + +export interface KomorebiContainer { + id: string; + windows: KomorebiWindow[]; +} + +export interface KomorebiWindow { + class: string | null; + exe: string | null; + hwnd: number; + title: string | null; +} + +export interface KomorebiRect { + left: number; + top: number; + right: number; + bottom: number; +} + +export type KomorebiLayout = + | 'bsp' + | 'vertical_stack' + | 'horizontal_stack' + | 'ultrawide_vertical_stack' + | 'rows' + | 'grid' + | 'right_main_vertical_stack' + | 'custom'; + +export type KomorebiLayoutFlip = + | 'horizontal' + | 'vertical' + | 'horizontal_and_vertical'; diff --git a/packages/client-api/src/providers/memory/create-memory-provider.ts b/packages/client-api/src/providers/memory/create-memory-provider.ts index f365e40f..6eeab179 100644 --- a/packages/client-api/src/providers/memory/create-memory-provider.ts +++ b/packages/client-api/src/providers/memory/create-memory-provider.ts @@ -1,37 +1,18 @@ import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; - -export interface MemoryProviderConfig { - type: 'memory'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + MemoryOutput, + MemoryProvider, + MemoryProviderConfig, +} from './memory-provider-types'; const memoryProviderConfigSchema = z.object({ type: z.literal('memory'), refreshInterval: z.coerce.number().default(5 * 1000), }); -export type MemoryProvider = Provider; - -export interface MemoryOutput { - usage: number; - freeMemory: number; - usedMemory: number; - totalMemory: number; - freeSwap: number; - usedSwap: number; - totalSwap: number; -} - export function createMemoryProvider( config: MemoryProviderConfig, ): MemoryProvider { diff --git a/packages/client-api/src/providers/memory/memory-provider-types.ts b/packages/client-api/src/providers/memory/memory-provider-types.ts new file mode 100644 index 00000000..b2336ea6 --- /dev/null +++ b/packages/client-api/src/providers/memory/memory-provider-types.ts @@ -0,0 +1,22 @@ +import type { Provider } from '../create-base-provider'; + +export interface MemoryProviderConfig { + type: 'memory'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type MemoryProvider = Provider; + +export interface MemoryOutput { + usage: number; + freeMemory: number; + usedMemory: number; + totalMemory: number; + freeSwap: number; + usedSwap: number; + totalSwap: number; +} diff --git a/packages/client-api/src/providers/network/create-network-provider.ts b/packages/client-api/src/providers/network/create-network-provider.ts index b240dcdc..697b849f 100644 --- a/packages/client-api/src/providers/network/create-network-provider.ts +++ b/packages/client-api/src/providers/network/create-network-provider.ts @@ -1,93 +1,18 @@ import { z } from 'zod'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; - -export interface NetworkProviderConfig { - type: 'network'; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + NetworkOutput, + NetworkProvider, + NetworkProviderConfig, +} from './network-provider-types'; const networkProviderConfigSchema = z.object({ type: z.literal('network'), refreshInterval: z.coerce.number().default(5 * 1000), }); -export type NetworkProvider = Provider< - NetworkProviderConfig, - NetworkOutput ->; - -export interface NetworkOutput { - defaultInterface: NetworkInterface | null; - defaultGateway: NetworkGateway | null; - interfaces: NetworkInterface[]; - traffic: NetworkTraffic | null; -} - -export interface NetworkInterface { - name: string; - friendlyName: string | null; - description: string | null; - type: InterfaceType; - ipv4Addresses: string[]; - ipv6Addresses: string[]; - macAddress: string | null; - transmitSeed: number | null; - receiveSpeed: number | null; - dnsServers: string[]; - isDefault: boolean; -} - -export interface NetworkGateway { - macAddress: string; - ipv4Addresses: string[]; - ipv6Addresses: string[]; - ssid: string | null; - signalStrength: number | null; -} - -export enum InterfaceType { - UNKNOWN = 'unknown', - ETHERNET = 'ethernet', - TOKEN_RING = 'token_ring', - FDDI = 'fddi', - PPP = 'ppp', - LOOPBACK = 'loopback', - SLIP = 'slip', - ATM = 'atm', - GENERIC_MODEM = 'generic_modem', - ISDN = 'isdn', - WIFI = 'wifi', - DSL = 'dsl', - TUNNEL = 'tunnel', - HIGH_PERFORMANCE_SERIAL_BUS = 'high_performance_serial_bus', - MOBILE_BROADBAND = 'mobile_broadband', - BRIDGE = 'bridge', -} - -export interface NetworkTraffic { - received: NetworkTrafficMeasure; - totalReceived: NetworkTrafficMeasure; - transmitted: NetworkTrafficMeasure; - totalTransmitted: NetworkTrafficMeasure; -} - -export interface NetworkTrafficMeasure { - bytes: number; - siValue: number; - siUnit: string; - iecValue: number; - iecUnit: string; -} - export function createNetworkProvider( config: NetworkProviderConfig, ): NetworkProvider { diff --git a/packages/client-api/src/providers/network/network-provider-types.ts b/packages/client-api/src/providers/network/network-provider-types.ts new file mode 100644 index 00000000..443e0034 --- /dev/null +++ b/packages/client-api/src/providers/network/network-provider-types.ts @@ -0,0 +1,78 @@ +import type { Provider } from '../create-base-provider'; + +export interface NetworkProviderConfig { + type: 'network'; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type NetworkProvider = Provider< + NetworkProviderConfig, + NetworkOutput +>; + +export interface NetworkOutput { + defaultInterface: NetworkInterface | null; + defaultGateway: NetworkGateway | null; + interfaces: NetworkInterface[]; + traffic: NetworkTraffic | null; +} + +export interface NetworkInterface { + name: string; + friendlyName: string | null; + description: string | null; + type: InterfaceType; + ipv4Addresses: string[]; + ipv6Addresses: string[]; + macAddress: string | null; + transmitSeed: number | null; + receiveSpeed: number | null; + dnsServers: string[]; + isDefault: boolean; +} + +export interface NetworkGateway { + macAddress: string; + ipv4Addresses: string[]; + ipv6Addresses: string[]; + ssid: string | null; + signalStrength: number | null; +} + +export enum InterfaceType { + UNKNOWN = 'unknown', + ETHERNET = 'ethernet', + TOKEN_RING = 'token_ring', + FDDI = 'fddi', + PPP = 'ppp', + LOOPBACK = 'loopback', + SLIP = 'slip', + ATM = 'atm', + GENERIC_MODEM = 'generic_modem', + ISDN = 'isdn', + WIFI = 'wifi', + DSL = 'dsl', + TUNNEL = 'tunnel', + HIGH_PERFORMANCE_SERIAL_BUS = 'high_performance_serial_bus', + MOBILE_BROADBAND = 'mobile_broadband', + BRIDGE = 'bridge', +} + +export interface NetworkTraffic { + received: NetworkTrafficMeasure; + totalReceived: NetworkTrafficMeasure; + transmitted: NetworkTrafficMeasure; + totalTransmitted: NetworkTrafficMeasure; +} + +export interface NetworkTrafficMeasure { + bytes: number; + siValue: number; + siUnit: string; + iecValue: number; + iecUnit: string; +} diff --git a/packages/client-api/src/providers/weather/create-weather-provider.ts b/packages/client-api/src/providers/weather/create-weather-provider.ts index 53a81f38..6b9a00ee 100644 --- a/packages/client-api/src/providers/weather/create-weather-provider.ts +++ b/packages/client-api/src/providers/weather/create-weather-provider.ts @@ -1,34 +1,12 @@ import { z } from 'zod'; -import type { IpProvider } from '../ip/create-ip-provider'; -import { WeatherStatus } from './weather-status.enum'; -import { - createBaseProvider, - type Provider, -} from '../create-base-provider'; +import { createBaseProvider } from '../create-base-provider'; import { onProviderEmit } from '~/desktop'; -import { createProvider } from '../create-provider'; - -export interface WeatherProviderConfig { - type: 'weather'; - - /** - * Latitude to retrieve weather for. If not provided, latitude is instead - * estimated based on public IP. - */ - latitude?: number; - - /** - * Longitude to retrieve weather for. If not provided, longitude is instead - * estimated based on public IP. - */ - longitude?: number; - - /** - * How often this provider refreshes in milliseconds. - */ - refreshInterval?: number; -} +import type { + WeatherOutput, + WeatherProvider, + WeatherProviderConfig, +} from './weather-provider-types'; const weatherProviderConfigSchema = z.object({ type: z.literal('weather'), @@ -37,19 +15,6 @@ const weatherProviderConfigSchema = z.object({ refreshInterval: z.coerce.number().default(60 * 60 * 1000), }); -export type WeatherProvider = Provider< - WeatherProviderConfig, - WeatherOutput ->; - -export interface WeatherOutput { - isDaytime: boolean; - status: WeatherStatus; - celsiusTemp: number; - fahrenheitTemp: number; - windSpeed: number; -} - export function createWeatherProvider( config: WeatherProviderConfig, ): WeatherProvider { diff --git a/packages/client-api/src/providers/weather/weather-provider-types.ts b/packages/client-api/src/providers/weather/weather-provider-types.ts new file mode 100644 index 00000000..d58bfe36 --- /dev/null +++ b/packages/client-api/src/providers/weather/weather-provider-types.ts @@ -0,0 +1,50 @@ +import type { Provider } from '../create-base-provider'; + +export interface WeatherProviderConfig { + type: 'weather'; + + /** + * Latitude to retrieve weather for. If not provided, latitude is instead + * estimated based on public IP. + */ + latitude?: number; + + /** + * Longitude to retrieve weather for. If not provided, longitude is instead + * estimated based on public IP. + */ + longitude?: number; + + /** + * How often this provider refreshes in milliseconds. + */ + refreshInterval?: number; +} + +export type WeatherProvider = Provider< + WeatherProviderConfig, + WeatherOutput +>; + +export interface WeatherOutput { + isDaytime: boolean; + status: WeatherStatus; + celsiusTemp: number; + fahrenheitTemp: number; + windSpeed: number; +} + +export enum WeatherStatus { + CLEAR_DAY = 'clear_day', + CLEAR_NIGHT = 'clear_night', + CLOUDY_DAY = 'cloudy_day', + CLOUDY_NIGHT = 'cloudy_night', + LIGHT_RAIN_DAY = 'light_rain_day', + LIGHT_RAIN_NIGHT = 'light_rain_night', + HEAVY_RAIN_DAY = 'heavy_rain_day', + HEAVY_RAIN_NIGHT = 'heavy_rain_night', + SNOW_DAY = 'snow_day', + SNOW_NIGHT = 'snow_night', + THUNDER_DAY = 'thunder_day', + THUNDER_NIGHT = 'thunder_night', +} diff --git a/packages/client-api/src/providers/weather/weather-status.enum.ts b/packages/client-api/src/providers/weather/weather-status.enum.ts deleted file mode 100644 index 4164ca2d..00000000 --- a/packages/client-api/src/providers/weather/weather-status.enum.ts +++ /dev/null @@ -1,14 +0,0 @@ -export enum WeatherStatus { - CLEAR_DAY = 'clear_day', - CLEAR_NIGHT = 'clear_night', - CLOUDY_DAY = 'cloudy_day', - CLOUDY_NIGHT = 'cloudy_night', - LIGHT_RAIN_DAY = 'light_rain_day', - LIGHT_RAIN_NIGHT = 'light_rain_night', - HEAVY_RAIN_DAY = 'heavy_rain_day', - HEAVY_RAIN_NIGHT = 'heavy_rain_night', - SNOW_DAY = 'snow_day', - SNOW_NIGHT = 'snow_night', - THUNDER_DAY = 'thunder_day', - THUNDER_NIGHT = 'thunder_night', -}