@reformer/core 1.1.0 → 2.0.0-beta.10

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 (221) hide show
  1. package/dist/behaviors/compute-from.d.ts +2 -0
  2. package/dist/behaviors/compute-from.js +31 -0
  3. package/dist/behaviors/copy-from.d.ts +2 -0
  4. package/dist/behaviors/copy-from.js +29 -0
  5. package/dist/behaviors/enable-when.d.ts +2 -0
  6. package/dist/behaviors/enable-when.js +25 -0
  7. package/dist/behaviors/reset-when.d.ts +2 -0
  8. package/dist/behaviors/reset-when.js +24 -0
  9. package/dist/behaviors/revalidate-when.d.ts +2 -0
  10. package/dist/behaviors/revalidate-when.js +18 -0
  11. package/dist/behaviors/sync-fields.d.ts +2 -0
  12. package/dist/behaviors/sync-fields.js +41 -0
  13. package/dist/behaviors/transform-value.d.ts +2 -0
  14. package/dist/behaviors/transform-value.js +45 -0
  15. package/dist/behaviors/watch-field.d.ts +2 -0
  16. package/dist/behaviors/watch-field.js +21 -0
  17. package/dist/behaviors.d.ts +6 -2
  18. package/dist/behaviors.js +27 -228
  19. package/dist/core/behavior/behavior-context.d.ts +32 -14
  20. package/dist/core/behavior/behavior-registry.d.ts +15 -27
  21. package/dist/core/behavior/behaviors/compute-from.d.ts +50 -21
  22. package/dist/core/behavior/behaviors/copy-from.d.ts +39 -14
  23. package/dist/core/behavior/behaviors/enable-when.d.ts +88 -19
  24. package/dist/core/behavior/behaviors/reset-when.d.ts +31 -18
  25. package/dist/core/behavior/behaviors/revalidate-when.d.ts +40 -17
  26. package/dist/core/behavior/behaviors/sync-fields.d.ts +34 -14
  27. package/dist/core/behavior/behaviors/transform-value.d.ts +116 -44
  28. package/dist/core/behavior/behaviors/watch-field.d.ts +66 -21
  29. package/dist/core/behavior/compose-behavior.d.ts +2 -12
  30. package/dist/core/behavior/index.d.ts +0 -1
  31. package/dist/core/behavior/types.d.ts +2 -8
  32. package/dist/core/factories/node-factory.d.ts +6 -29
  33. package/dist/core/nodes/array-node.d.ts +42 -22
  34. package/dist/core/nodes/field-node.d.ts +51 -26
  35. package/dist/core/nodes/form-node.d.ts +18 -20
  36. package/dist/core/nodes/group-node.d.ts +37 -212
  37. package/dist/core/types/deep-schema.d.ts +2 -12
  38. package/dist/core/types/field-path.d.ts +1 -1
  39. package/dist/core/types/form-context.d.ts +36 -30
  40. package/dist/core/types/{group-node-proxy.d.ts → form-proxy.d.ts} +12 -42
  41. package/dist/core/types/index.d.ts +52 -6
  42. package/dist/core/types/validation-schema.d.ts +3 -12
  43. package/dist/core/utils/abstract-registry.d.ts +74 -0
  44. package/dist/core/utils/aggregate-signals.d.ts +71 -0
  45. package/dist/core/utils/create-form.d.ts +3 -20
  46. package/dist/core/utils/error-handler.d.ts +1 -18
  47. package/dist/core/utils/field-path-navigator.d.ts +1 -1
  48. package/dist/core/{validation → utils}/field-path.d.ts +23 -6
  49. package/dist/core/utils/form-observer.d.ts +176 -0
  50. package/dist/core/utils/form-proxy-builder.d.ts +25 -0
  51. package/dist/core/utils/form-submitter.d.ts +121 -0
  52. package/dist/core/utils/index.d.ts +10 -2
  53. package/dist/core/utils/registry-helpers.d.ts +0 -7
  54. package/dist/core/utils/safe-effect.d.ts +73 -0
  55. package/dist/core/utils/status-machine.d.ts +153 -0
  56. package/dist/core/utils/type-guards.d.ts +5 -23
  57. package/dist/core/utils/unique-id.d.ts +53 -0
  58. package/dist/core/validation/core/apply-when.d.ts +3 -9
  59. package/dist/core/validation/core/apply.d.ts +2 -13
  60. package/dist/core/validation/core/validate-async.d.ts +2 -8
  61. package/dist/core/validation/core/validate-tree.d.ts +10 -10
  62. package/dist/core/validation/core/validate.d.ts +1 -7
  63. package/dist/core/validation/index.d.ts +8 -2
  64. package/dist/core/validation/validate-form.d.ts +1 -38
  65. package/dist/core/validation/validation-applicator.d.ts +2 -21
  66. package/dist/core/validation/validation-context.d.ts +67 -28
  67. package/dist/core/validation/validation-registry.d.ts +11 -25
  68. package/dist/core/validation/validators/array-validators.d.ts +2 -12
  69. package/dist/core/validation/validators/date-utils.d.ts +26 -0
  70. package/dist/core/validation/validators/email.d.ts +2 -9
  71. package/dist/core/validation/validators/future-date.d.ts +35 -0
  72. package/dist/core/validation/validators/index.d.ts +7 -1
  73. package/dist/core/validation/validators/is-date.d.ts +36 -0
  74. package/dist/core/validation/validators/max-age.d.ts +36 -0
  75. package/dist/core/validation/validators/max-date.d.ts +36 -0
  76. package/dist/core/validation/validators/max-length.d.ts +3 -10
  77. package/dist/core/validation/validators/max.d.ts +3 -10
  78. package/dist/core/validation/validators/min-age.d.ts +36 -0
  79. package/dist/core/validation/validators/min-date.d.ts +36 -0
  80. package/dist/core/validation/validators/min-length.d.ts +3 -10
  81. package/dist/core/validation/validators/min.d.ts +3 -10
  82. package/dist/core/validation/validators/number.d.ts +2 -9
  83. package/dist/core/validation/validators/past-date.d.ts +35 -0
  84. package/dist/core/validation/validators/pattern.d.ts +2 -9
  85. package/dist/core/validation/validators/phone.d.ts +2 -9
  86. package/dist/core/validation/validators/required.d.ts +2 -9
  87. package/dist/core/validation/validators/url.d.ts +2 -9
  88. package/dist/date-utils-xUWFslTj.js +29 -0
  89. package/dist/field-path-DuKdGcIE.js +66 -0
  90. package/dist/hooks/types.d.ts +328 -0
  91. package/dist/hooks/useArrayLength.d.ts +31 -0
  92. package/dist/hooks/useFormControl.d.ts +15 -39
  93. package/dist/hooks/useFormControlValue.d.ts +167 -0
  94. package/dist/hooks/useHiddenCondition.d.ts +25 -0
  95. package/dist/hooks/useSignalSubscription.d.ts +17 -0
  96. package/dist/index-D25LsbRm.js +73 -0
  97. package/dist/index.d.ts +8 -1
  98. package/dist/index.js +3271 -8
  99. package/dist/registry-helpers-Bv_BJ1s-.js +615 -0
  100. package/dist/safe-effect-Dh8uw81c.js +20 -0
  101. package/dist/validate-C3XiA_zf.js +10 -0
  102. package/dist/validators/email.d.ts +2 -0
  103. package/dist/validators/email.js +13 -0
  104. package/dist/validators/future-date.d.ts +2 -0
  105. package/dist/validators/future-date.js +20 -0
  106. package/dist/validators/is-date.d.ts +2 -0
  107. package/dist/validators/is-date.js +12 -0
  108. package/dist/validators/max-age.d.ts +2 -0
  109. package/dist/validators/max-age.js +20 -0
  110. package/dist/validators/max-date.d.ts +2 -0
  111. package/dist/validators/max-date.js +20 -0
  112. package/dist/validators/max-length.d.ts +2 -0
  113. package/dist/validators/max-length.js +11 -0
  114. package/dist/validators/max.d.ts +2 -0
  115. package/dist/validators/max.js +11 -0
  116. package/dist/validators/min-age.d.ts +2 -0
  117. package/dist/validators/min-age.js +20 -0
  118. package/dist/validators/min-date.d.ts +2 -0
  119. package/dist/validators/min-date.js +20 -0
  120. package/dist/validators/min-length.d.ts +2 -0
  121. package/dist/validators/min-length.js +11 -0
  122. package/dist/validators/min.d.ts +2 -0
  123. package/dist/validators/min.js +11 -0
  124. package/dist/validators/number.d.ts +2 -0
  125. package/dist/validators/number.js +35 -0
  126. package/dist/validators/past-date.d.ts +2 -0
  127. package/dist/validators/past-date.js +20 -0
  128. package/dist/validators/pattern.d.ts +2 -0
  129. package/dist/validators/pattern.js +11 -0
  130. package/dist/validators/phone.d.ts +2 -0
  131. package/dist/validators/phone.js +35 -0
  132. package/dist/validators/required.d.ts +2 -0
  133. package/dist/validators/required.js +15 -0
  134. package/dist/validators/url.d.ts +2 -0
  135. package/dist/validators/url.js +19 -0
  136. package/dist/validators-BGsNOgT1.js +207 -0
  137. package/dist/validators.d.ts +6 -2
  138. package/dist/validators.js +54 -296
  139. package/llms.txt +8887 -59
  140. package/package.json +87 -8
  141. package/dist/core/behavior/behavior-applicator.d.ts +0 -71
  142. package/dist/core/behavior/behavior-applicator.js +0 -92
  143. package/dist/core/behavior/behavior-context.js +0 -38
  144. package/dist/core/behavior/behavior-registry.js +0 -198
  145. package/dist/core/behavior/behaviors/compute-from.js +0 -84
  146. package/dist/core/behavior/behaviors/copy-from.js +0 -64
  147. package/dist/core/behavior/behaviors/enable-when.js +0 -81
  148. package/dist/core/behavior/behaviors/index.js +0 -11
  149. package/dist/core/behavior/behaviors/reset-when.js +0 -63
  150. package/dist/core/behavior/behaviors/revalidate-when.js +0 -51
  151. package/dist/core/behavior/behaviors/sync-fields.js +0 -66
  152. package/dist/core/behavior/behaviors/transform-value.js +0 -110
  153. package/dist/core/behavior/behaviors/watch-field.js +0 -56
  154. package/dist/core/behavior/compose-behavior.js +0 -166
  155. package/dist/core/behavior/create-field-path.d.ts +0 -20
  156. package/dist/core/behavior/create-field-path.js +0 -69
  157. package/dist/core/behavior/index.js +0 -17
  158. package/dist/core/behavior/types.js +0 -7
  159. package/dist/core/context/form-context-impl.d.ts +0 -29
  160. package/dist/core/context/form-context-impl.js +0 -37
  161. package/dist/core/factories/index.js +0 -6
  162. package/dist/core/factories/node-factory.js +0 -281
  163. package/dist/core/nodes/array-node.js +0 -534
  164. package/dist/core/nodes/field-node.js +0 -510
  165. package/dist/core/nodes/form-node.js +0 -343
  166. package/dist/core/nodes/group-node/field-registry.d.ts +0 -191
  167. package/dist/core/nodes/group-node/field-registry.js +0 -215
  168. package/dist/core/nodes/group-node/index.d.ts +0 -11
  169. package/dist/core/nodes/group-node/index.js +0 -11
  170. package/dist/core/nodes/group-node/proxy-builder.d.ts +0 -71
  171. package/dist/core/nodes/group-node/proxy-builder.js +0 -161
  172. package/dist/core/nodes/group-node/state-manager.d.ts +0 -184
  173. package/dist/core/nodes/group-node/state-manager.js +0 -265
  174. package/dist/core/nodes/group-node.js +0 -770
  175. package/dist/core/types/deep-schema.js +0 -11
  176. package/dist/core/types/field-path.js +0 -4
  177. package/dist/core/types/form-context.js +0 -25
  178. package/dist/core/types/group-node-proxy.js +0 -31
  179. package/dist/core/types/index.js +0 -4
  180. package/dist/core/types/validation-schema.js +0 -10
  181. package/dist/core/utils/create-form.js +0 -24
  182. package/dist/core/utils/debounce.d.ts +0 -160
  183. package/dist/core/utils/debounce.js +0 -197
  184. package/dist/core/utils/error-handler.js +0 -226
  185. package/dist/core/utils/field-path-navigator.js +0 -374
  186. package/dist/core/utils/index.js +0 -14
  187. package/dist/core/utils/registry-helpers.js +0 -79
  188. package/dist/core/utils/registry-stack.js +0 -86
  189. package/dist/core/utils/resources.d.ts +0 -41
  190. package/dist/core/utils/resources.js +0 -69
  191. package/dist/core/utils/subscription-manager.js +0 -214
  192. package/dist/core/utils/type-guards.js +0 -169
  193. package/dist/core/validation/core/apply-when.js +0 -41
  194. package/dist/core/validation/core/apply.js +0 -38
  195. package/dist/core/validation/core/index.js +0 -8
  196. package/dist/core/validation/core/validate-async.js +0 -45
  197. package/dist/core/validation/core/validate-tree.js +0 -37
  198. package/dist/core/validation/core/validate.js +0 -38
  199. package/dist/core/validation/field-path.js +0 -147
  200. package/dist/core/validation/index.js +0 -33
  201. package/dist/core/validation/validate-form.js +0 -152
  202. package/dist/core/validation/validation-applicator.js +0 -217
  203. package/dist/core/validation/validation-context.js +0 -75
  204. package/dist/core/validation/validation-registry.js +0 -298
  205. package/dist/core/validation/validators/array-validators.js +0 -86
  206. package/dist/core/validation/validators/date.d.ts +0 -38
  207. package/dist/core/validation/validators/date.js +0 -117
  208. package/dist/core/validation/validators/email.js +0 -60
  209. package/dist/core/validation/validators/index.js +0 -14
  210. package/dist/core/validation/validators/max-length.js +0 -60
  211. package/dist/core/validation/validators/max.js +0 -60
  212. package/dist/core/validation/validators/min-length.js +0 -60
  213. package/dist/core/validation/validators/min.js +0 -60
  214. package/dist/core/validation/validators/number.js +0 -90
  215. package/dist/core/validation/validators/pattern.js +0 -62
  216. package/dist/core/validation/validators/phone.js +0 -58
  217. package/dist/core/validation/validators/required.js +0 -69
  218. package/dist/core/validation/validators/url.js +0 -55
  219. package/dist/create-field-path-CdPF3lIK.js +0 -704
  220. package/dist/hooks/useFormControl.js +0 -298
  221. package/dist/node-factory-D7DOnSSN.js +0 -3200
@@ -1,11 +0,0 @@
1
- /**
2
- * Типы для схемы формы (Deep Schema)
3
- *
4
- * Автоматическое определение типов схемы на основе структуры данных:
5
- * - `[{...}]` → массив форм
6
- * - `{...}` → вложенная группа
7
- * - `{value, component}` → конфигурация поля
8
- *
9
- * @group Types
10
- */
11
- export {};
@@ -1,4 +0,0 @@
1
- // ============================================================================
2
- // FieldPath - proxy для доступа к путям полей
3
- // ============================================================================
4
- export {};
@@ -1,25 +0,0 @@
1
- /**
2
- * Единый контекст для работы с формой
3
- *
4
- * Используется в:
5
- * - Behavior схемах (watchField, copyFrom, transformValue, etc.)
6
- * - Validation схемах (validate, validateAsync, validateTree)
7
- *
8
- * @example
9
- * ```typescript
10
- * // Behavior
11
- * watchField(path.country, (country, ctx) => {
12
- * ctx.form.city.updateComponentProps({ options: cities });
13
- * ctx.setFieldValue('city', null);
14
- * });
15
- *
16
- * // Validation
17
- * validate(path.email, (value, ctx) => {
18
- * if (!value) return { code: 'required', message: 'Required' };
19
- * const confirm = ctx.form.confirmEmail.value.value;
20
- * if (value !== confirm) return { code: 'mismatch', message: 'Emails must match' };
21
- * return null;
22
- * });
23
- * ```
24
- */
25
- export {};
@@ -1,31 +0,0 @@
1
- /**
2
- * Типы для Proxy-доступа к полям GroupNode
3
- *
4
- * Решает проблему типизации, когда GroupNode<T> использует Proxy для прямого доступа к полям.
5
- * TypeScript не может автоматически определить правильные типы для вложенных форм и массивов.
6
- *
7
- * @group Types
8
- *
9
- * @example
10
- * ```typescript
11
- * interface MyForm {
12
- * name: string;
13
- * address: {
14
- * city: string;
15
- * };
16
- * items: Array<{ title: string }>;
17
- * }
18
- *
19
- * const form: GroupNodeWithControls<MyForm> = new GroupNode(schema);
20
- *
21
- * // TypeScript знает, что это FieldNode<string>
22
- * form.name.setValue('John');
23
- *
24
- * // TypeScript знает, что это GroupNode<{city: string}>
25
- * form.address.city.setValue('Moscow');
26
- *
27
- * // TypeScript знает, что это ArrayNode<{title: string}>
28
- * form.items.push({ title: 'New Item' });
29
- * ```
30
- */
31
- export {};
@@ -1,4 +0,0 @@
1
- // ============================================================================
2
- // Form Value Types
3
- // ============================================================================
4
- export {};
@@ -1,10 +0,0 @@
1
- /**
2
- * Типы для validation schema паттерна
3
- *
4
- * Основано на Angular Signal Forms подходе:
5
- * - Валидация определяется отдельно от схемы полей
6
- * - Поддержка условной валидации (applyWhen)
7
- * - Cross-field валидация (validateTree)
8
- * - Асинхронная валидация с контекстом
9
- */
10
- export {};
@@ -1,24 +0,0 @@
1
- /**
2
- * Фабричная функция для создания формы с правильной типизацией
3
- *
4
- * Решает проблему с типизацией конструктора GroupNode, который возвращает
5
- * Proxy (GroupNodeWithControls), но TypeScript не может это вывести автоматически.
6
- *
7
- * @group Utilities
8
- *
9
- * @example
10
- * ```typescript
11
- * // Вместо:
12
- * const form: GroupNodeWithControls<MyForm> = new GroupNode<MyForm>(config);
13
- *
14
- * // Используйте:
15
- * const form = createForm<MyForm>(config);
16
- * ```
17
- */
18
- import { GroupNode } from '../nodes/group-node';
19
- /**
20
- * Реализация фабричной функции
21
- */
22
- export function createForm(schemaOrConfig) {
23
- return new GroupNode(schemaOrConfig);
24
- }
@@ -1,160 +0,0 @@
1
- /**
2
- * Debouncer - утилита для отложенного выполнения функций
3
- *
4
- * Устраняет дублирование debounce логики между field-node.ts и behavior-registry.ts
5
- *
6
- * @internal
7
- *
8
- * @example
9
- * ```typescript
10
- * const debouncer = new Debouncer(300);
11
- *
12
- * // Отложить выполнение на 300мс
13
- * await debouncer.debounce(async () => {
14
- * await validateField();
15
- * });
16
- *
17
- * // Отменить отложенное выполнение
18
- * debouncer.cancel();
19
- *
20
- * // Выполнить немедленно, отменив отложенное
21
- * await debouncer.flush(async () => {
22
- * await validateField();
23
- * });
24
- * ```
25
- */
26
- /**
27
- * Класс для debouncing (отложенного выполнения) функций
28
- *
29
- * @internal
30
- *
31
- * Откладывает выполнение функции на заданное время. Если функция вызывается
32
- * повторно до истечения времени, предыдущий вызов отменяется.
33
- *
34
- * Полезно для:
35
- * - Отложенной валидации при вводе (debounced validation)
36
- * - Отложенного сохранения данных
37
- * - Отложенной обработки событий behaviors
38
- *
39
- * @example
40
- * ```typescript
41
- * // В FieldNode
42
- * class FieldNode {
43
- * private validationDebouncer: Debouncer;
44
- *
45
- * constructor(config) {
46
- * this.validationDebouncer = new Debouncer(config.debounce || 0);
47
- * }
48
- *
49
- * async validate(): Promise<boolean> {
50
- * return this.validationDebouncer.debounce(async () => {
51
- * // Валидация выполнится через debounce мс
52
- * return await this.runValidation();
53
- * });
54
- * }
55
- * }
56
- * ```
57
- */
58
- export declare class Debouncer {
59
- private readonly delay;
60
- /**
61
- * Таймер для отложенного выполнения
62
- * @private
63
- */
64
- private timer?;
65
- /**
66
- * Создать Debouncer с заданной задержкой
67
- *
68
- * @param delay Задержка в миллисекундах (0 = без задержки)
69
- *
70
- * @example
71
- * ```typescript
72
- * const debouncer = new Debouncer(300); // 300мс задержка
73
- * const immediate = new Debouncer(0); // Без задержки
74
- * ```
75
- */
76
- constructor(delay: number);
77
- /**
78
- * Отложить выполнение функции
79
- *
80
- * Если вызывается повторно до истечения delay, предыдущий вызов отменяется
81
- * и таймер перезапускается.
82
- *
83
- * @param fn Функция для выполнения (может быть async)
84
- * @returns Promise, который разрешается результатом функции
85
- *
86
- * @example
87
- * ```typescript
88
- * const debouncer = new Debouncer(300);
89
- *
90
- * // Первый вызов - запланирован через 300мс
91
- * debouncer.debounce(async () => console.log('First'));
92
- *
93
- * // Второй вызов через 100мс - отменяет первый, запланирован через 300мс
94
- * debouncer.debounce(async () => console.log('Second'));
95
- *
96
- * // Через 300мс выведет только: "Second"
97
- * ```
98
- */
99
- debounce<T>(fn: () => T | Promise<T>): Promise<T>;
100
- /**
101
- * Отменить отложенное выполнение
102
- *
103
- * Если есть запланированный вызов, он будет отменен и не выполнится.
104
- * Promise из debounce() никогда не разрешится.
105
- *
106
- * @example
107
- * ```typescript
108
- * const debouncer = new Debouncer(300);
109
- *
110
- * debouncer.debounce(async () => {
111
- * console.log('This will not execute');
112
- * });
113
- *
114
- * debouncer.cancel(); // Отменяем вызов
115
- * ```
116
- */
117
- cancel(): void;
118
- /**
119
- * Выполнить функцию немедленно, отменив любой отложенный вызов
120
- *
121
- * Полезно когда нужно принудительно выполнить действие сейчас,
122
- * игнорируя debounce.
123
- *
124
- * @param fn Функция для немедленного выполнения
125
- * @returns Promise с результатом функции
126
- *
127
- * @example
128
- * ```typescript
129
- * const debouncer = new Debouncer(300);
130
- *
131
- * // Запланировано через 300мс
132
- * debouncer.debounce(async () => console.log('Delayed'));
133
- *
134
- * // Отменяем отложенный и выполняем немедленно
135
- * await debouncer.flush(async () => console.log('Immediate'));
136
- * // Выведет: "Immediate" (сразу)
137
- * // "Delayed" не выполнится (отменен)
138
- * ```
139
- */
140
- flush<T>(fn: () => T | Promise<T>): Promise<T>;
141
- /**
142
- * Проверить, есть ли активный (запланированный) вызов
143
- *
144
- * @returns true если есть запланированный вызов
145
- *
146
- * @example
147
- * ```typescript
148
- * const debouncer = new Debouncer(300);
149
- *
150
- * console.log(debouncer.isPending()); // false
151
- *
152
- * debouncer.debounce(() => console.log('Test'));
153
- * console.log(debouncer.isPending()); // true
154
- *
155
- * // Через 300мс
156
- * console.log(debouncer.isPending()); // false
157
- * ```
158
- */
159
- isPending(): boolean;
160
- }
@@ -1,197 +0,0 @@
1
- /**
2
- * Debouncer - утилита для отложенного выполнения функций
3
- *
4
- * Устраняет дублирование debounce логики между field-node.ts и behavior-registry.ts
5
- *
6
- * @internal
7
- *
8
- * @example
9
- * ```typescript
10
- * const debouncer = new Debouncer(300);
11
- *
12
- * // Отложить выполнение на 300мс
13
- * await debouncer.debounce(async () => {
14
- * await validateField();
15
- * });
16
- *
17
- * // Отменить отложенное выполнение
18
- * debouncer.cancel();
19
- *
20
- * // Выполнить немедленно, отменив отложенное
21
- * await debouncer.flush(async () => {
22
- * await validateField();
23
- * });
24
- * ```
25
- */
26
- /**
27
- * Класс для debouncing (отложенного выполнения) функций
28
- *
29
- * @internal
30
- *
31
- * Откладывает выполнение функции на заданное время. Если функция вызывается
32
- * повторно до истечения времени, предыдущий вызов отменяется.
33
- *
34
- * Полезно для:
35
- * - Отложенной валидации при вводе (debounced validation)
36
- * - Отложенного сохранения данных
37
- * - Отложенной обработки событий behaviors
38
- *
39
- * @example
40
- * ```typescript
41
- * // В FieldNode
42
- * class FieldNode {
43
- * private validationDebouncer: Debouncer;
44
- *
45
- * constructor(config) {
46
- * this.validationDebouncer = new Debouncer(config.debounce || 0);
47
- * }
48
- *
49
- * async validate(): Promise<boolean> {
50
- * return this.validationDebouncer.debounce(async () => {
51
- * // Валидация выполнится через debounce мс
52
- * return await this.runValidation();
53
- * });
54
- * }
55
- * }
56
- * ```
57
- */
58
- export class Debouncer {
59
- delay;
60
- /**
61
- * Таймер для отложенного выполнения
62
- * @private
63
- */
64
- timer;
65
- /**
66
- * Создать Debouncer с заданной задержкой
67
- *
68
- * @param delay Задержка в миллисекундах (0 = без задержки)
69
- *
70
- * @example
71
- * ```typescript
72
- * const debouncer = new Debouncer(300); // 300мс задержка
73
- * const immediate = new Debouncer(0); // Без задержки
74
- * ```
75
- */
76
- constructor(delay) {
77
- this.delay = delay;
78
- }
79
- /**
80
- * Отложить выполнение функции
81
- *
82
- * Если вызывается повторно до истечения delay, предыдущий вызов отменяется
83
- * и таймер перезапускается.
84
- *
85
- * @param fn Функция для выполнения (может быть async)
86
- * @returns Promise, который разрешается результатом функции
87
- *
88
- * @example
89
- * ```typescript
90
- * const debouncer = new Debouncer(300);
91
- *
92
- * // Первый вызов - запланирован через 300мс
93
- * debouncer.debounce(async () => console.log('First'));
94
- *
95
- * // Второй вызов через 100мс - отменяет первый, запланирован через 300мс
96
- * debouncer.debounce(async () => console.log('Second'));
97
- *
98
- * // Через 300мс выведет только: "Second"
99
- * ```
100
- */
101
- async debounce(fn) {
102
- return new Promise((resolve, reject) => {
103
- // Отменяем предыдущий таймер, если есть
104
- if (this.timer) {
105
- clearTimeout(this.timer);
106
- }
107
- // Если delay = 0, выполняем немедленно
108
- if (this.delay === 0) {
109
- Promise.resolve()
110
- .then(() => fn())
111
- .then(resolve)
112
- .catch(reject);
113
- return;
114
- }
115
- // Запускаем новый таймер
116
- this.timer = setTimeout(async () => {
117
- try {
118
- const result = await fn();
119
- resolve(result);
120
- }
121
- catch (error) {
122
- reject(error);
123
- }
124
- }, this.delay);
125
- });
126
- }
127
- /**
128
- * Отменить отложенное выполнение
129
- *
130
- * Если есть запланированный вызов, он будет отменен и не выполнится.
131
- * Promise из debounce() никогда не разрешится.
132
- *
133
- * @example
134
- * ```typescript
135
- * const debouncer = new Debouncer(300);
136
- *
137
- * debouncer.debounce(async () => {
138
- * console.log('This will not execute');
139
- * });
140
- *
141
- * debouncer.cancel(); // Отменяем вызов
142
- * ```
143
- */
144
- cancel() {
145
- if (this.timer) {
146
- clearTimeout(this.timer);
147
- this.timer = undefined;
148
- }
149
- }
150
- /**
151
- * Выполнить функцию немедленно, отменив любой отложенный вызов
152
- *
153
- * Полезно когда нужно принудительно выполнить действие сейчас,
154
- * игнорируя debounce.
155
- *
156
- * @param fn Функция для немедленного выполнения
157
- * @returns Promise с результатом функции
158
- *
159
- * @example
160
- * ```typescript
161
- * const debouncer = new Debouncer(300);
162
- *
163
- * // Запланировано через 300мс
164
- * debouncer.debounce(async () => console.log('Delayed'));
165
- *
166
- * // Отменяем отложенный и выполняем немедленно
167
- * await debouncer.flush(async () => console.log('Immediate'));
168
- * // Выведет: "Immediate" (сразу)
169
- * // "Delayed" не выполнится (отменен)
170
- * ```
171
- */
172
- async flush(fn) {
173
- this.cancel();
174
- return await fn();
175
- }
176
- /**
177
- * Проверить, есть ли активный (запланированный) вызов
178
- *
179
- * @returns true если есть запланированный вызов
180
- *
181
- * @example
182
- * ```typescript
183
- * const debouncer = new Debouncer(300);
184
- *
185
- * console.log(debouncer.isPending()); // false
186
- *
187
- * debouncer.debounce(() => console.log('Test'));
188
- * console.log(debouncer.isPending()); // true
189
- *
190
- * // Через 300мс
191
- * console.log(debouncer.isPending()); // false
192
- * ```
193
- */
194
- isPending() {
195
- return this.timer !== undefined;
196
- }
197
- }