@mirta/globals 0.3.5 → 0.4.1

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.
package/eslint/index.d.ts CHANGED
@@ -7,6 +7,9 @@ declare interface GlobalsMirta {
7
7
  readonly 'cron': false
8
8
  readonly 'timers': false
9
9
  readonly 'defineRule': false
10
+ readonly 'disableRule': false
11
+ readonly 'enableRule': false
12
+ readonly 'runRule': false
10
13
  readonly 'defineAlias': false
11
14
  readonly 'defineVirtualDevice': false
12
15
  readonly 'getDevice': false
package/eslint/index.js CHANGED
@@ -7,6 +7,9 @@ export default {
7
7
  'cron': 'readonly',
8
8
  'timers': 'readonly',
9
9
  'defineRule': 'readonly',
10
+ 'disableRule': 'readonly',
11
+ 'enableRule': 'readonly',
12
+ 'runRule': 'readonly',
10
13
  'defineAlias': 'readonly',
11
14
  'defineVirtualDevice': 'readonly',
12
15
  'getDevice': 'readonly',
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.3.5",
4
+ "version": "0.4.1",
5
5
  "license": "Unlicense",
6
6
  "keywords": [
7
7
  "mirta",
@@ -14,6 +14,7 @@
14
14
  "LICENSE",
15
15
  "README.md"
16
16
  ],
17
+ "types": "./types/index.d.ts",
17
18
  "exports": {
18
19
  ".": {
19
20
  "types": "./types/index.d.ts"
package/types/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference path="./utils.d.ts" />
1
2
  /// <reference path="./wb-rules.d.ts" />
2
3
 
3
4
  /** Признак сборки в режиме разработки. */
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Используется для нормализации составных типов.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * interface A { value: number }
7
+ * interface B { isReadonly: boolean }
8
+ *
9
+ * type C = A & B
10
+ * // A & B
11
+ *
12
+ * type D = Expand<A & B>
13
+ * // {
14
+ * // value: number;
15
+ * // isReadonly: boolean;
16
+ * // }
17
+ * ```
18
+ * @since 0.0.4
19
+ *
20
+ **/
21
+ declare type Expand<T> = { [K in keyof T]: T[K] } & {}
22
+
23
+ /**
24
+ * Разрешает частичное заполнение полей объекта, но требует наличия хотя бы одного поля.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * interface SafeRange {
29
+ * minValue: number
30
+ * maxValue: number
31
+ * }
32
+ *
33
+ * // Корректное объявление
34
+ * const a: AtLeastOne<SafeRange> = {
35
+ * minValue: 0
36
+ * }
37
+ *
38
+ * // Ошибка - требуется хотя бы одно из обязательных полей
39
+ * const b: AtLeastOne<SafeRange> = { }
40
+ * ```
41
+ * @since 0.3.3
42
+ *
43
+ **/
44
+ declare type AtLeastOne<T, U = { [K in keyof T]: Pick<T, K> }> = Partial<T> & U[keyof U]
45
+
46
+ /**
47
+ * Утилита для создания "брендированных типов" (branded types).
48
+ *
49
+ * Позволяет создавать типобезопасные псевдонимы простых типов, предотвращая их взаимозаменяемость.
50
+ * Полезно для разграничения значений, имеющих одинаковый базовый тип, но разное назначение.
51
+ *
52
+ * На уровне JavaScript это не оказывает влияния (исчезает при компиляции),
53
+ * однако при работе с TypeScript обеспечивает строгую проверку типов.
54
+ *
55
+ * @template TValue - Базовый тип (например, string, number)
56
+ * @template TBrand - Уникальная метка, определяющая семантику типа
57
+ *
58
+ * @example
59
+ * type UserID = Branded<string, 'UserID'>
60
+ * type OrderID = Branded<string, 'OrderID'>
61
+ *
62
+ * const userId: UserID = 'user-123' as UserID
63
+ * const orderId: OrderID = userId // Ошибка: типы 'UserID' и 'OrderID' несовместимы
64
+ *
65
+ * @since 0.4.0
66
+ *
67
+ **/
68
+ declare type Branded<TValue, TBrand extends string | symbol>
69
+ = TValue & { readonly __brand: TBrand }
@@ -1,50 +1,6 @@
1
+ /// <reference path="./utils.d.ts" />
1
2
  /// <reference path="./wb-rules/alarms.d.ts" />
2
3
 
3
- /**
4
- * Используется для нормализации составных типов.
5
- *
6
- * @example
7
- * ```ts
8
- * interface A { value: number }
9
- * interface B { isReadonly: boolean }
10
- *
11
- * type C = A & B
12
- * // A & B
13
- *
14
- * type D = Expand<A & B>
15
- * // {
16
- * // value: number;
17
- * // isReadonly: boolean;
18
- * // }
19
- * ```
20
- * @since 0.0.4
21
- *
22
- **/
23
- declare type Expand<T> = { [K in keyof T]: T[K] } & {}
24
-
25
- /**
26
- * Разрешает частичное заполнение полей объекта, но требует наличия хотя бы одного поля.
27
- *
28
- * @example
29
- * ```ts
30
- * interface SafeRange {
31
- * minValue: number
32
- * maxValue: number
33
- * }
34
- *
35
- * // Корректное объявление
36
- * const a: AtLeastOne<SafeRange> = {
37
- * minValue: 0
38
- * }
39
- *
40
- * // Ошибка - требуется хотя бы одно из обязательных полей
41
- * const b: AtLeastOne<SafeRange> = { }
42
- * ```
43
- * @since 0.3.3
44
- *
45
- **/
46
- declare type AtLeastOne<T, U = { [K in keyof T]: Pick<T, K> }> = Partial<T> & U[keyof U]
47
-
48
4
  /** Типы и интерфейсы правил wb-rules */
49
5
  declare namespace WbRules {
50
6
 
@@ -216,6 +172,31 @@ declare namespace WbRules {
216
172
  ): void
217
173
  }
218
174
 
175
+ /**
176
+ * Дескриптор, возвращаемый функцией {@link defineRule}.
177
+ *
178
+ * Используется для управления правилом: отключение,
179
+ * включение, принудительный запуск.
180
+ *
181
+ * @example
182
+ * ```ts
183
+ * const cabinetLightRule = defineRule('cabinet_light', {
184
+ * whenChanged: 'motion/sensor',
185
+ * then: (newValue) => dev['light/power'] = newValue
186
+ * })
187
+ *
188
+ * // Отключить правило
189
+ * disableRule(cabinetLightRule)
190
+ *
191
+ * // Включить снова
192
+ * enableRule(cabinetLightRule)
193
+ * ```
194
+ *
195
+ * @since 0.4.0
196
+ *
197
+ **/
198
+ type RuleHandle = Branded<number, 'WbRules.RuleHandle'>
199
+
219
200
  /**
220
201
  * Соответствие типа контрола его типу значения.
221
202
  * @since 0.0.4
@@ -716,14 +697,63 @@ declare function cron(spec: string): WbRules.CronEntry
716
697
  * @param options Конфигурация правила.
717
698
  *
718
699
  **/
719
- declare function defineRule(name: string, options: WbRules.RuleOptions): void
700
+ declare function defineRule(name: string, options: WbRules.RuleOptions): WbRules.RuleHandle
720
701
 
721
702
  /**
722
703
  * Создаёт анонимное правило обработки.
723
704
  * @param options Конфигурация правила.
724
705
  *
725
706
  **/
726
- declare function defineRule(options: WbRules.RuleOptions): void
707
+ declare function defineRule(options: WbRules.RuleOptions): WbRules.RuleHandle
708
+
709
+ /**
710
+ * Отключает правило. Оно перестаёт реагировать на события.
711
+ * Сохраняется в памяти — можно включить снова.
712
+ *
713
+ * @param rule - Дескриптор правила, возвращённый {@link defineRule}.
714
+ *
715
+ * @example
716
+ * ```ts
717
+ * const cabinetLightRule = defineRule({ ... })
718
+ * disableRule(cabinetLightRule)
719
+ * ```
720
+ * @since 0.4.0
721
+ *
722
+ **/
723
+ declare function disableRule(rule: WbRules.RuleHandle): void
724
+
725
+ /**
726
+ * Включает ранее отключённое правило.
727
+ *
728
+ * @param rule - Дескриптор правила, возвращённый {@link defineRule}.
729
+ *
730
+ * @example
731
+ * ```ts
732
+ * enableRule(cabinetLightRule)
733
+ * ```
734
+ * @since 0.4.0
735
+ *
736
+ **/
737
+ declare function enableRule(rule: WbRules.RuleHandle): void
738
+
739
+ /**
740
+ * Запускает правило по его дескриптору.
741
+ *
742
+ * @warning
743
+ * Контекст вызова будет пустым:
744
+ * - `newValue = undefined`
745
+ * - `deviceId = undefined`
746
+ * - `controlId = undefined`
747
+ *
748
+ * Не используйте `runRule` для правил, зависящих от этих значений.
749
+ * Вместо этого выносите общую логику в отдельную функцию и вызывайте её напрямую.
750
+ *
751
+ * @param rule - Дескриптор правила, возвращённый {@link defineRule}.
752
+ *
753
+ * @since 0.4.0
754
+ *
755
+ **/
756
+ declare function runRule(rule: WbRules.RuleHandle): void
727
757
 
728
758
  /**
729
759
  * Создаёт виртуальное устройство.