@reformer/core 1.0.0-beta.3

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 (150) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/dist/behaviors.d.ts +2 -0
  4. package/dist/behaviors.js +230 -0
  5. package/dist/core/behavior/behavior-applicator.d.ts +71 -0
  6. package/dist/core/behavior/behavior-applicator.js +92 -0
  7. package/dist/core/behavior/behavior-context.d.ts +29 -0
  8. package/dist/core/behavior/behavior-context.js +38 -0
  9. package/dist/core/behavior/behavior-registry.d.ts +97 -0
  10. package/dist/core/behavior/behavior-registry.js +198 -0
  11. package/dist/core/behavior/behaviors/compute-from.d.ts +41 -0
  12. package/dist/core/behavior/behaviors/compute-from.js +84 -0
  13. package/dist/core/behavior/behaviors/copy-from.d.ts +31 -0
  14. package/dist/core/behavior/behaviors/copy-from.js +64 -0
  15. package/dist/core/behavior/behaviors/enable-when.d.ts +49 -0
  16. package/dist/core/behavior/behaviors/enable-when.js +81 -0
  17. package/dist/core/behavior/behaviors/index.d.ts +11 -0
  18. package/dist/core/behavior/behaviors/index.js +11 -0
  19. package/dist/core/behavior/behaviors/reset-when.d.ts +51 -0
  20. package/dist/core/behavior/behaviors/reset-when.js +63 -0
  21. package/dist/core/behavior/behaviors/revalidate-when.d.ts +30 -0
  22. package/dist/core/behavior/behaviors/revalidate-when.js +51 -0
  23. package/dist/core/behavior/behaviors/sync-fields.d.ts +28 -0
  24. package/dist/core/behavior/behaviors/sync-fields.js +66 -0
  25. package/dist/core/behavior/behaviors/transform-value.d.ts +120 -0
  26. package/dist/core/behavior/behaviors/transform-value.js +110 -0
  27. package/dist/core/behavior/behaviors/watch-field.d.ts +35 -0
  28. package/dist/core/behavior/behaviors/watch-field.js +56 -0
  29. package/dist/core/behavior/compose-behavior.d.ts +106 -0
  30. package/dist/core/behavior/compose-behavior.js +166 -0
  31. package/dist/core/behavior/create-field-path.d.ts +20 -0
  32. package/dist/core/behavior/create-field-path.js +69 -0
  33. package/dist/core/behavior/index.d.ts +12 -0
  34. package/dist/core/behavior/index.js +17 -0
  35. package/dist/core/behavior/types.d.ts +152 -0
  36. package/dist/core/behavior/types.js +7 -0
  37. package/dist/core/context/form-context-impl.d.ts +29 -0
  38. package/dist/core/context/form-context-impl.js +37 -0
  39. package/dist/core/factories/index.d.ts +6 -0
  40. package/dist/core/factories/index.js +6 -0
  41. package/dist/core/factories/node-factory.d.ts +209 -0
  42. package/dist/core/factories/node-factory.js +281 -0
  43. package/dist/core/nodes/array-node.d.ts +308 -0
  44. package/dist/core/nodes/array-node.js +534 -0
  45. package/dist/core/nodes/field-node.d.ts +269 -0
  46. package/dist/core/nodes/field-node.js +510 -0
  47. package/dist/core/nodes/form-node.d.ts +342 -0
  48. package/dist/core/nodes/form-node.js +343 -0
  49. package/dist/core/nodes/group-node/field-registry.d.ts +191 -0
  50. package/dist/core/nodes/group-node/field-registry.js +215 -0
  51. package/dist/core/nodes/group-node/index.d.ts +11 -0
  52. package/dist/core/nodes/group-node/index.js +11 -0
  53. package/dist/core/nodes/group-node/proxy-builder.d.ts +71 -0
  54. package/dist/core/nodes/group-node/proxy-builder.js +161 -0
  55. package/dist/core/nodes/group-node/state-manager.d.ts +184 -0
  56. package/dist/core/nodes/group-node/state-manager.js +265 -0
  57. package/dist/core/nodes/group-node.d.ts +494 -0
  58. package/dist/core/nodes/group-node.js +770 -0
  59. package/dist/core/types/deep-schema.d.ts +78 -0
  60. package/dist/core/types/deep-schema.js +11 -0
  61. package/dist/core/types/field-path.d.ts +42 -0
  62. package/dist/core/types/field-path.js +4 -0
  63. package/dist/core/types/form-context.d.ts +83 -0
  64. package/dist/core/types/form-context.js +25 -0
  65. package/dist/core/types/group-node-proxy.d.ts +135 -0
  66. package/dist/core/types/group-node-proxy.js +31 -0
  67. package/dist/core/types/index.d.ts +163 -0
  68. package/dist/core/types/index.js +4 -0
  69. package/dist/core/types/validation-schema.d.ts +104 -0
  70. package/dist/core/types/validation-schema.js +10 -0
  71. package/dist/core/utils/create-form.d.ts +61 -0
  72. package/dist/core/utils/create-form.js +24 -0
  73. package/dist/core/utils/debounce.d.ts +160 -0
  74. package/dist/core/utils/debounce.js +197 -0
  75. package/dist/core/utils/error-handler.d.ts +180 -0
  76. package/dist/core/utils/error-handler.js +226 -0
  77. package/dist/core/utils/field-path-navigator.d.ts +240 -0
  78. package/dist/core/utils/field-path-navigator.js +374 -0
  79. package/dist/core/utils/index.d.ts +14 -0
  80. package/dist/core/utils/index.js +14 -0
  81. package/dist/core/utils/registry-helpers.d.ts +50 -0
  82. package/dist/core/utils/registry-helpers.js +79 -0
  83. package/dist/core/utils/registry-stack.d.ts +69 -0
  84. package/dist/core/utils/registry-stack.js +86 -0
  85. package/dist/core/utils/resources.d.ts +41 -0
  86. package/dist/core/utils/resources.js +69 -0
  87. package/dist/core/utils/subscription-manager.d.ts +180 -0
  88. package/dist/core/utils/subscription-manager.js +214 -0
  89. package/dist/core/utils/type-guards.d.ts +116 -0
  90. package/dist/core/utils/type-guards.js +169 -0
  91. package/dist/core/validation/core/apply-when.d.ts +28 -0
  92. package/dist/core/validation/core/apply-when.js +41 -0
  93. package/dist/core/validation/core/apply.d.ts +63 -0
  94. package/dist/core/validation/core/apply.js +38 -0
  95. package/dist/core/validation/core/index.d.ts +8 -0
  96. package/dist/core/validation/core/index.js +8 -0
  97. package/dist/core/validation/core/validate-async.d.ts +42 -0
  98. package/dist/core/validation/core/validate-async.js +45 -0
  99. package/dist/core/validation/core/validate-tree.d.ts +35 -0
  100. package/dist/core/validation/core/validate-tree.js +37 -0
  101. package/dist/core/validation/core/validate.d.ts +32 -0
  102. package/dist/core/validation/core/validate.js +38 -0
  103. package/dist/core/validation/field-path.d.ts +43 -0
  104. package/dist/core/validation/field-path.js +147 -0
  105. package/dist/core/validation/index.d.ts +21 -0
  106. package/dist/core/validation/index.js +33 -0
  107. package/dist/core/validation/validate-form.d.ts +85 -0
  108. package/dist/core/validation/validate-form.js +152 -0
  109. package/dist/core/validation/validation-applicator.d.ts +89 -0
  110. package/dist/core/validation/validation-applicator.js +217 -0
  111. package/dist/core/validation/validation-context.d.ts +47 -0
  112. package/dist/core/validation/validation-context.js +75 -0
  113. package/dist/core/validation/validation-registry.d.ts +156 -0
  114. package/dist/core/validation/validation-registry.js +298 -0
  115. package/dist/core/validation/validators/array-validators.d.ts +63 -0
  116. package/dist/core/validation/validators/array-validators.js +86 -0
  117. package/dist/core/validation/validators/date.d.ts +38 -0
  118. package/dist/core/validation/validators/date.js +117 -0
  119. package/dist/core/validation/validators/email.d.ts +44 -0
  120. package/dist/core/validation/validators/email.js +60 -0
  121. package/dist/core/validation/validators/index.d.ts +14 -0
  122. package/dist/core/validation/validators/index.js +14 -0
  123. package/dist/core/validation/validators/max-length.d.ts +45 -0
  124. package/dist/core/validation/validators/max-length.js +60 -0
  125. package/dist/core/validation/validators/max.d.ts +45 -0
  126. package/dist/core/validation/validators/max.js +60 -0
  127. package/dist/core/validation/validators/min-length.d.ts +45 -0
  128. package/dist/core/validation/validators/min-length.js +60 -0
  129. package/dist/core/validation/validators/min.d.ts +45 -0
  130. package/dist/core/validation/validators/min.js +60 -0
  131. package/dist/core/validation/validators/number.d.ts +38 -0
  132. package/dist/core/validation/validators/number.js +90 -0
  133. package/dist/core/validation/validators/pattern.d.ts +47 -0
  134. package/dist/core/validation/validators/pattern.js +62 -0
  135. package/dist/core/validation/validators/phone.d.ts +34 -0
  136. package/dist/core/validation/validators/phone.js +58 -0
  137. package/dist/core/validation/validators/required.d.ts +48 -0
  138. package/dist/core/validation/validators/required.js +69 -0
  139. package/dist/core/validation/validators/url.d.ts +29 -0
  140. package/dist/core/validation/validators/url.js +55 -0
  141. package/dist/create-field-path-CdPF3lIK.js +704 -0
  142. package/dist/hooks/useFormControl.d.ts +48 -0
  143. package/dist/hooks/useFormControl.js +298 -0
  144. package/dist/index.d.ts +10 -0
  145. package/dist/index.js +8 -0
  146. package/dist/node-factory-D7DOnSSN.js +3200 -0
  147. package/dist/validators.d.ts +2 -0
  148. package/dist/validators.js +298 -0
  149. package/llms.txt +847 -0
  150. package/package.json +86 -0
@@ -0,0 +1,308 @@
1
+ /**
2
+ * ArrayNode - ΡƒΠ·Π΅Π» Ρ„ΠΎΡ€ΠΌΡ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами
3
+ *
4
+ * УправляСт массивом Ρ„ΠΎΡ€ΠΌ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ:
5
+ * - ДинамичСского добавлСния/удалСния элСмСнтов
6
+ * - Π’Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ всСх элСмСнтов
7
+ * - Π Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ состояния Ρ‡Π΅Ρ€Π΅Π· signals
8
+ *
9
+ * @group Nodes
10
+ */
11
+ import type { ReadonlySignal } from '@preact/signals-core';
12
+ import { FormNode, type SetValueOptions } from './form-node';
13
+ import type { FieldStatus, ValidationError, FormFields } from '../types';
14
+ import type { FormSchema } from '../types/deep-schema';
15
+ import type { GroupNodeWithControls } from '../types/group-node-proxy';
16
+ /**
17
+ * ArrayNode - массив Ρ„ΠΎΡ€ΠΌ с Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ состояниСм
18
+ *
19
+ * @group Nodes
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const array = new ArrayNode({
24
+ * title: { value: '', component: Input },
25
+ * price: { value: 0, component: Input },
26
+ * });
27
+ *
28
+ * array.push({ title: 'Item 1', price: 100 });
29
+ * array.at(0)?.title.setValue('Updated');
30
+ * console.log(array.length.value); // 1
31
+ * ```
32
+ */
33
+ export declare class ArrayNode<T extends FormFields> extends FormNode<T[]> {
34
+ private items;
35
+ private itemSchema;
36
+ private initialItems;
37
+ /**
38
+ * ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ подписок для Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ cleanup
39
+ * Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ SubscriptionManager вмСсто массива для управлСния подписками
40
+ */
41
+ private disposers;
42
+ private validationSchemaFn?;
43
+ private behaviorSchemaFn?;
44
+ readonly value: ReadonlySignal<T[]>;
45
+ readonly valid: ReadonlySignal<boolean>;
46
+ readonly invalid: ReadonlySignal<boolean>;
47
+ readonly touched: ReadonlySignal<boolean>;
48
+ readonly dirty: ReadonlySignal<boolean>;
49
+ readonly pending: ReadonlySignal<boolean>;
50
+ readonly errors: ReadonlySignal<ValidationError[]>;
51
+ readonly status: ReadonlySignal<FieldStatus>;
52
+ readonly length: ReadonlySignal<number>;
53
+ constructor(schema: FormSchema<T>, initialItems?: Partial<T>[]);
54
+ /**
55
+ * Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² ΠΊΠΎΠ½Π΅Ρ† массива
56
+ * @param initialValue - ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния для Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта
57
+ */
58
+ push(initialValue?: Partial<T>): void;
59
+ /**
60
+ * Π£Π΄Π°Π»ΠΈΡ‚ΡŒ элСмСнт ΠΏΠΎ индСксу
61
+ * @param index - ИндСкс элСмСнта для удалСния
62
+ */
63
+ removeAt(index: number): void;
64
+ /**
65
+ * Π’ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² массив
66
+ * @param index - ИндСкс для вставки
67
+ * @param initialValue - ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния для Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта
68
+ */
69
+ insert(index: number, initialValue?: Partial<T>): void;
70
+ /**
71
+ * Π£Π΄Π°Π»ΠΈΡ‚ΡŒ всС элСмСнты массива
72
+ */
73
+ clear(): void;
74
+ /**
75
+ * ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ элСмСнт ΠΏΠΎ индСксу
76
+ * @param index - ИндСкс элСмСнта
77
+ * @returns Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ GroupNode ΠΈΠ»ΠΈ undefined Ссли индСкс Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ†
78
+ */
79
+ at(index: number): GroupNodeWithControls<T> | undefined;
80
+ getValue(): T[];
81
+ setValue(values: T[], options?: SetValueOptions): void;
82
+ patchValue(values: (T | undefined)[]): void;
83
+ /**
84
+ * Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ массив ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ значСниям (ΠΈΠ»ΠΈ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ)
85
+ *
86
+ * @param values - ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для сброса
87
+ *
88
+ * @remarks
89
+ * ΠžΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ массив ΠΈ заполняСт Π½ΠΎΠ²Ρ‹ΠΌΠΈ элСмСнтами
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * // ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ массив
94
+ * arrayNode.reset();
95
+ *
96
+ * // Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊ Π½ΠΎΠ²Ρ‹ΠΌ значСниям
97
+ * arrayNode.reset([{ name: 'Item 1' }, { name: 'Item 2' }]);
98
+ * ```
99
+ */
100
+ reset(values?: T[]): void;
101
+ /**
102
+ * Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ массив ΠΊ исходным значСниям (initialItems)
103
+ *
104
+ * @remarks
105
+ * ВосстанавливаСт массив Π² состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈ создании ArrayNode.
106
+ * Π‘ΠΎΠ»Π΅Π΅ явный способ сброса ΠΊ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ значСниям ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с reset()
107
+ *
108
+ * ПолСзно когда:
109
+ * - ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» "Cancel" - Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ массив ΠΊ исходным элСмСнтам
110
+ * - Массив Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Ρ‡Π΅Ρ€Π΅Π· reset(newValues), Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ
111
+ * - Π―Π²Π½ΠΎΠ΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ "ΠΎΡ‚ΠΌΠ΅Π½Π° всСх ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ"
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * const arrayNode = new ArrayNode(
116
+ * { name: { value: '', component: Input } },
117
+ * [{ name: 'Initial 1' }, { name: 'Initial 2' }]
118
+ * );
119
+ *
120
+ * arrayNode.push({ name: 'New Item' });
121
+ * arrayNode.reset([{ name: 'Temp' }]);
122
+ * console.log(arrayNode.length.value); // 1
123
+ *
124
+ * arrayNode.resetToInitial();
125
+ * console.log(arrayNode.length.value); // 2
126
+ * console.log(arrayNode.at(0)?.name.value.value); // 'Initial 1'
127
+ * ```
128
+ */
129
+ resetToInitial(): void;
130
+ validate(): Promise<boolean>;
131
+ setErrors(_errors: ValidationError[]): void;
132
+ clearErrors(): void;
133
+ /**
134
+ * Hook: вызываСтся послС markAsTouched()
135
+ *
136
+ * Для ArrayNode: рСкурсивно ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ всС элСмСнты массива ΠΊΠ°ΠΊ touched
137
+ */
138
+ protected onMarkAsTouched(): void;
139
+ /**
140
+ * Hook: вызываСтся послС markAsUntouched()
141
+ *
142
+ * Для ArrayNode: рСкурсивно ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ всС элСмСнты массива ΠΊΠ°ΠΊ untouched
143
+ */
144
+ protected onMarkAsUntouched(): void;
145
+ /**
146
+ * Hook: вызываСтся послС markAsDirty()
147
+ *
148
+ * Для ArrayNode: рСкурсивно ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ всС элСмСнты массива ΠΊΠ°ΠΊ dirty
149
+ */
150
+ protected onMarkAsDirty(): void;
151
+ /**
152
+ * Hook: вызываСтся послС markAsPristine()
153
+ *
154
+ * Для ArrayNode: рСкурсивно ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ всС элСмСнты массива ΠΊΠ°ΠΊ pristine
155
+ */
156
+ protected onMarkAsPristine(): void;
157
+ /**
158
+ * Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ элСмСнтам массива
159
+ * @param callback - Ѐункция, вызываСмая для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта с Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ GroupNode
160
+ */
161
+ forEach(callback: (item: GroupNodeWithControls<T>, index: number) => void): void;
162
+ /**
163
+ * Маппинг элСмСнтов массива
164
+ * @param callback - Ѐункция прСобразования с Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ GroupNode
165
+ * @returns Новый массив Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²
166
+ */
167
+ map<R>(callback: (item: GroupNodeWithControls<T>, index: number) => R): R[];
168
+ /**
169
+ * Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт массива Π½Π° основС схСмы
170
+ * @param initialValue - ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния
171
+ */
172
+ private createItem;
173
+ /**
174
+ * ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ схСма Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠΉ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΠ»Π΅ΠΉ)
175
+ * @param schema - Π‘Ρ…Π΅ΠΌΠ° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ
176
+ */
177
+ private isGroupSchema;
178
+ /**
179
+ * ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ validation schema ΠΊΠΎ всСм элСмСнтам массива
180
+ *
181
+ * Validation schema Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊ:
182
+ * - ВсСм ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ элСмСнтам
183
+ * - ВсСм Π½ΠΎΠ²Ρ‹ΠΌ элСмСнтам, добавляСмым Ρ‡Π΅Ρ€Π΅Π· push/insert
184
+ *
185
+ * @param schemaFn - Ѐункция Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ для элСмСнта массива
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * import { propertyValidation } from './validation/property-validation';
190
+ *
191
+ * form.properties.applyValidationSchema(propertyValidation);
192
+ * ```
193
+ */
194
+ applyValidationSchema(schemaFn: unknown): void;
195
+ /**
196
+ * ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ behavior schema ΠΊΠΎ всСм элСмСнтам ArrayNode
197
+ *
198
+ * АвтоматичСски примСняСтся ΠΊ Π½ΠΎΠ²Ρ‹ΠΌ элСмСнтам ΠΏΡ€ΠΈ push/insert.
199
+ *
200
+ * @param schemaFn - Behavior schema функция
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * import { addressBehavior } from './behaviors/address-behavior';
205
+ *
206
+ * form.addresses.applyBehaviorSchema(addressBehavior);
207
+ * ```
208
+ */
209
+ applyBehaviorSchema(schemaFn: unknown): void;
210
+ /**
211
+ * Подписка Π½Π° измСнСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ поля Π²ΠΎ всСх элСмСнтах массива
212
+ * Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ значСния поля Π² любом элСмСнтС
213
+ *
214
+ * @param fieldKey - ΠšΠ»ΡŽΡ‡ поля для отслСТивания
215
+ * @param callback - Ѐункция, вызываСмая ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ массив всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ индСкс ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта
216
+ * @returns Ѐункция отписки для cleanup
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * // АвтоматичСский пСрСсчСт ΠΎΠ±Ρ‰Π΅ΠΉ стоимости ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ†Π΅Π½
221
+ * const dispose = form.existingLoans.watchItems(
222
+ * 'remainingAmount',
223
+ * (amounts) => {
224
+ * const totalDebt = amounts.reduce((sum, amount) => sum + (amount || 0), 0);
225
+ * form.totalDebt.setValue(totalDebt);
226
+ * }
227
+ * );
228
+ *
229
+ * // ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ любого remainingAmount β†’ пСрСсчитаСтся totalDebt
230
+ * form.existingLoans.at(0)?.remainingAmount.setValue(500000);
231
+ *
232
+ * // Cleanup
233
+ * useEffect(() => dispose, []);
234
+ * ```
235
+ */
236
+ watchItems<K extends keyof T>(fieldKey: K, callback: (values: Array<T[K] | undefined>) => void | Promise<void>): () => void;
237
+ /**
238
+ * Подписка Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹ массива
239
+ * Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ/ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ элСмСнтов
240
+ *
241
+ * @param callback - Ѐункция, вызываСмая ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π»ΠΈΠ½Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ
242
+ * @returns Ѐункция отписки для cleanup
243
+ *
244
+ * @example
245
+ * ```typescript
246
+ * // ОбновлСниС счСтчика элСмСнтов Π² UI
247
+ * const dispose = form.properties.watchLength((length) => {
248
+ * console.log(`ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² нСдвиТимости: ${length}`);
249
+ * form.propertyCount.setValue(length);
250
+ * });
251
+ *
252
+ * form.properties.push({ title: 'ΠšΠ²Π°Ρ€Ρ‚ΠΈΡ€Π°', value: 5000000 });
253
+ * // Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚: "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² нСдвиТимости: 1"
254
+ *
255
+ * // Cleanup
256
+ * useEffect(() => dispose, []);
257
+ * ```
258
+ */
259
+ watchLength(callback: (length: number) => void | Promise<void>): () => void;
260
+ /**
261
+ * ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ всС рСсурсы ΡƒΠ·Π»Π°
262
+ * РСкурсивно ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ всС subscriptions ΠΈ элСмСнты массива
263
+ *
264
+ * @example
265
+ * ```typescript
266
+ * useEffect(() => {
267
+ * return () => {
268
+ * arrayNode.dispose();
269
+ * };
270
+ * }, []);
271
+ * ```
272
+ */
273
+ dispose(): void;
274
+ /**
275
+ * Hook: вызываСтся послС disable()
276
+ *
277
+ * Для ArrayNode: рСкурсивно ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ всС элСмСнты массива
278
+ *
279
+ * @example
280
+ * ```typescript
281
+ * // ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ вСсь массив ΠΏΠΎΠ»Π΅ΠΉ
282
+ * form.items.disable();
283
+ *
284
+ * // ВсС элСмСнты становятся disabled
285
+ * form.items.forEach(item => {
286
+ * console.log(item.status.value); // 'disabled'
287
+ * });
288
+ * ```
289
+ */
290
+ protected onDisable(): void;
291
+ /**
292
+ * Hook: вызываСтся послС enable()
293
+ *
294
+ * Для ArrayNode: рСкурсивно Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ всС элСмСнты массива
295
+ *
296
+ * @example
297
+ * ```typescript
298
+ * // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ вСсь массив ΠΏΠΎΠ»Π΅ΠΉ
299
+ * form.items.enable();
300
+ *
301
+ * // ВсС элСмСнты становятся enabled
302
+ * form.items.forEach(item => {
303
+ * console.log(item.status.value); // 'valid' ΠΈΠ»ΠΈ 'invalid'
304
+ * });
305
+ * ```
306
+ */
307
+ protected onEnable(): void;
308
+ }