@mirta/globals 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/types/wb-rules.d.ts +146 -37
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mirta/globals",
3
3
  "description": "Complete set of types for wb-rule development in TypeScript",
4
- "version": "0.0.3",
4
+ "version": "0.0.4",
5
5
  "license": "Unlicense",
6
6
  "keywords": [
7
7
  "mirta",
@@ -1,3 +1,23 @@
1
+ /**
2
+ * Используется для нормализации составных типов.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * interface A { value: number }
7
+ * interface B { readonly: boolean }
8
+ *
9
+ * type C = A & B
10
+ * // A & B
11
+ *
12
+ * type D = Expand<A & B>
13
+ * // {
14
+ * // value: number;
15
+ * // readonly: boolean;
16
+ * // }
17
+ * ```
18
+ **/
19
+ declare type Expand<T> = { [K in keyof T]: T[K] } & {}
20
+
1
21
  /** Типы и интерфейсы правил wb-rules */
2
22
  declare namespace WbRules {
3
23
 
@@ -45,9 +65,6 @@ declare namespace WbRules {
45
65
  error(message: string | undefined, ...args: (string | number | boolean)[]): void
46
66
  }
47
67
 
48
- type DevControl = Record<string, unknown>
49
- type Dev = Record<string, DevControl | undefined>
50
-
51
68
  interface Timer {
52
69
  firing: boolean
53
70
 
@@ -59,6 +76,13 @@ declare namespace WbRules {
59
76
  /** Тип значения топика MQTT. */
60
77
  type MqttValue = string | number | boolean
61
78
 
79
+ type DevControl = Record<string, MqttValue>
80
+
81
+ type Dev = Expand<
82
+ Record<`${string}/${string}`, MqttValue>
83
+ & Record<string, DevControl>
84
+ >
85
+
62
86
  interface MqttMessage {
63
87
  topic: string
64
88
  value: MqttValue
@@ -90,22 +114,42 @@ declare namespace WbRules {
90
114
  * @param controlId Поле, по которому произошло событие
91
115
  */
92
116
  then(
93
- newValue?: MqttValue,
117
+ newValue: MqttValue,
94
118
  deviceId?: string,
95
119
  controlId?: string
96
120
  ): void
97
121
  }
98
122
 
99
- enum ControlType {
100
- SWITCH = 'switch',
101
- ALARM = 'alarm',
102
- PUSHBUTTON = 'pushbutton',
103
- RANGE = 'range',
104
- RGB = 'rgb',
105
- TEXT = 'text',
106
- VALUE = 'value'
123
+ // Соответствие типа контрола и его данных
124
+ interface TypeMappings {
125
+ /** A control that displays a value as text. */
126
+ 'text': string
127
+ /** A control for a arbitrary value. */
128
+ 'value': number
129
+ /** A control that toggles it's value when pressed by the user. */
130
+ 'switch': boolean
131
+ /** A stateless push button. */
132
+ 'pushbutton': boolean
133
+ /** A control for color in `'R;G;B'` format */
134
+ 'rgb': string
135
+ /** A range slider that takes integer values between 0 and any other integer that is greater 1. */
136
+ 'range': number
137
+ /** A control that indicates whether an alarm is active. */
138
+ 'alarm': boolean
107
139
  }
108
140
 
141
+ type ControlType = Expand<keyof TypeMappings>
142
+
143
+ // enum ControlType {
144
+ // SWITCH = 'switch',
145
+ // ALARM = 'alarm',
146
+ // PUSHBUTTON = 'pushbutton',
147
+ // RANGE = 'range',
148
+ // RGB = 'rgb',
149
+ // TEXT = 'text',
150
+ // VALUE = 'value'
151
+ // }
152
+
109
153
  /**
110
154
  * Объект настроек передаваемого в контрол значения.
111
155
  */
@@ -122,6 +166,9 @@ declare namespace WbRules {
122
166
  notify?: boolean
123
167
  }
124
168
 
169
+ type Title = string | TitleLocalized
170
+ type TitleLocalized = Record<string, string>
171
+
125
172
  /**
126
173
  * Контрол устройства
127
174
  */
@@ -130,7 +177,7 @@ declare namespace WbRules {
130
177
  * Устанавливает заголовок.
131
178
  * @param title
132
179
  */
133
- setTitle(title: string): void
180
+ setTitle(title: Title): void
134
181
 
135
182
  /**
136
183
  * Устанавливает описание.
@@ -143,7 +190,7 @@ declare namespace WbRules {
143
190
  * @param type Тип значения.
144
191
  * @see ControlType
145
192
  */
146
- setType(controlType: ControlType): void
193
+ setType(type: ControlType): void
147
194
 
148
195
  setUnits(units: string): void
149
196
 
@@ -159,7 +206,11 @@ declare namespace WbRules {
159
206
 
160
207
  getId(): string
161
208
 
162
- getTitle(): string
209
+ /**
210
+ * Возвращает заголовок контрола.
211
+ * @param lang Язык заголовка, "en" по умолчанию.
212
+ */
213
+ getTitle(lang?: string): string
163
214
 
164
215
  getDescription(): string
165
216
 
@@ -180,23 +231,35 @@ declare namespace WbRules {
180
231
  getValue(): string | number | boolean
181
232
  }
182
233
 
183
- /**
184
- * Конфигурация контрола.
185
- */
186
- interface ControlOptions {
234
+ type MaybeValueEnum<TControl>
235
+ = TControl extends 'value'
236
+ ? { enum?: Record<number, TitleLocalized> }
237
+ : never
238
+
239
+ type MaybeTextEnum<TControl>
240
+ = TControl extends 'text'
241
+ ? { enum?: Record<string, TitleLocalized> }
242
+ : never
243
+
244
+ type TypeDef<TControl, TValue> = {
245
+ /** Тип контрола, публикуемый в MQTT-топике. */
246
+ type: TControl
247
+ /** Значение по умолчанию. */
248
+ value?: TValue
249
+ } & (MaybeValueEnum<TControl> | MaybeTextEnum<TControl> | {})
250
+
251
+ type TypeMapper<K extends keyof TypeMappings>
252
+ = K extends infer TControl
253
+ ? TypeDef<TControl, TypeMappings[K]>
254
+ : never
255
+
256
+ type MappedTypes = TypeMapper<keyof TypeMappings>
257
+
258
+ type ControlOptions = Expand<MappedTypes & {
187
259
  /**
188
260
  * имя, публикуемое в MQTT-топике
189
261
  */
190
- title?: string
191
- /**
192
- * тип, публикуемый в MQTT-топике
193
- * @see ControlType
194
- */
195
- type: string
196
- /**
197
- * значение параметра по умолчанию
198
- */
199
- value: string | number | boolean
262
+ title?: Title
200
263
  /**
201
264
  * когда задано истинное значение, при запуске контроллера параметр всегда устанавливается в значение по умолчанию.
202
265
  * Иначе он будет установлен в последнее сохранённое значение.
@@ -225,7 +288,54 @@ declare namespace WbRules {
225
288
  * для параметра типа range может задавать его минимально допустимое значение
226
289
  */
227
290
  min?: number
228
- }
291
+ }>
292
+
293
+ // /**
294
+ // * Конфигурация контрола.
295
+ // */
296
+ // interface ControlOptions<TControlType, TValueType> {
297
+ // /**
298
+ // * имя, публикуемое в MQTT-топике
299
+ // */
300
+ // title?: Title
301
+ // /**
302
+ // * тип, публикуемый в MQTT-топике
303
+ // * @see ControlType
304
+ // */
305
+ // type: TControlType
306
+ // /**
307
+ // * значение параметра по умолчанию
308
+ // */
309
+ // value?: TValueType
310
+ // /**
311
+ // * когда задано истинное значение, при запуске контроллера параметр всегда устанавливается в значение по умолчанию.
312
+ // * Иначе он будет установлен в последнее сохранённое значение.
313
+ // */
314
+ // forceDefault?: boolean
315
+ // /**
316
+ // * когда задано истинное значение, параметр объявляется read-only
317
+ // */
318
+ // readonly?: boolean
319
+ // precision?: number
320
+ // /**
321
+ // * когда задано истинное значение, при описании контрола в коде фактическое создание его в mqtt происходить
322
+ // * не будет до тех пор, пока этому контролу не будет присвоено какое-то значение
323
+ // * (например dev[deviceID][controlID] = "string")
324
+ // */
325
+ // lazyInit?: boolean
326
+ // /**
327
+ // * Порядок следования полей
328
+ // */
329
+ // order?: number
330
+ // /**
331
+ // * для параметра типа range может задавать его максимально допустимое значение
332
+ // */
333
+ // max?: number
334
+ // /**
335
+ // * для параметра типа range может задавать его минимально допустимое значение
336
+ // */
337
+ // min?: number
338
+ // }
229
339
 
230
340
  /**
231
341
  * Интерфейс устройства
@@ -251,7 +361,7 @@ declare namespace WbRules {
251
361
  type ControlOptionsTree = Record<string, ControlOptions>
252
362
 
253
363
  interface DeviceOptions {
254
- title: string
364
+ title: Title
255
365
  cells: ControlOptionsTree
256
366
  }
257
367
 
@@ -295,11 +405,6 @@ declare namespace WbRules {
295
405
  interface StorageOptions {
296
406
  global: boolean
297
407
  }
298
-
299
- type PersistentStorage = new (
300
- name: string,
301
- options: StorageOptions
302
- ) => PersistentStorage
303
408
  }
304
409
 
305
410
  declare namespace NodeJS {
@@ -415,7 +520,7 @@ declare function spawn(
415
520
 
416
521
  declare function runShellCommand(
417
522
  command: string,
418
- options: WbRules.SpawnOptions | WbRules.ExitCallback
523
+ options?: WbRules.SpawnOptions | WbRules.ExitCallback
419
524
  ): void
420
525
 
421
526
  declare function readConfig(
@@ -469,6 +574,10 @@ declare function publish(
469
574
  retain?: boolean
470
575
  ): void
471
576
 
577
+ declare class PersistentStorage {
578
+ constructor(name: string, options: WbRules.StorageOptions)
579
+ }
580
+
472
581
  /**
473
582
  * Класс оповещения
474
583
  * @abstract