@reformer/core 1.1.0 → 2.0.0-beta.2

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 (99) hide show
  1. package/dist/behaviors-DzYL8kY_.js +499 -0
  2. package/dist/behaviors.d.ts +6 -2
  3. package/dist/behaviors.js +19 -227
  4. package/dist/core/behavior/behavior-context.d.ts +6 -2
  5. package/dist/core/behavior/create-field-path.d.ts +3 -16
  6. package/dist/core/nodes/group-node.d.ts +14 -193
  7. package/dist/core/types/form-context.d.ts +10 -4
  8. package/dist/core/utils/field-path.d.ts +48 -0
  9. package/dist/core/utils/index.d.ts +1 -0
  10. package/dist/core/validation/core/validate-tree.d.ts +10 -4
  11. package/dist/core/validation/field-path.d.ts +3 -39
  12. package/dist/core/validation/validation-context.d.ts +23 -0
  13. package/dist/hooks/types.d.ts +328 -0
  14. package/dist/hooks/useFormControl.d.ts +13 -37
  15. package/dist/hooks/useFormControlValue.d.ts +167 -0
  16. package/dist/hooks/useSignalSubscription.d.ts +17 -0
  17. package/dist/index.d.ts +6 -1
  18. package/dist/index.js +2886 -8
  19. package/dist/{create-field-path-CdPF3lIK.js → registry-helpers-BRxAr6nG.js} +133 -347
  20. package/dist/validators-gXoHPdqM.js +418 -0
  21. package/dist/validators.d.ts +6 -2
  22. package/dist/validators.js +29 -296
  23. package/llms.txt +1283 -22
  24. package/package.json +8 -4
  25. package/dist/core/behavior/behavior-applicator.d.ts +0 -71
  26. package/dist/core/behavior/behavior-applicator.js +0 -92
  27. package/dist/core/behavior/behavior-context.js +0 -38
  28. package/dist/core/behavior/behavior-registry.js +0 -198
  29. package/dist/core/behavior/behaviors/compute-from.js +0 -84
  30. package/dist/core/behavior/behaviors/copy-from.js +0 -64
  31. package/dist/core/behavior/behaviors/enable-when.js +0 -81
  32. package/dist/core/behavior/behaviors/index.js +0 -11
  33. package/dist/core/behavior/behaviors/reset-when.js +0 -63
  34. package/dist/core/behavior/behaviors/revalidate-when.js +0 -51
  35. package/dist/core/behavior/behaviors/sync-fields.js +0 -66
  36. package/dist/core/behavior/behaviors/transform-value.js +0 -110
  37. package/dist/core/behavior/behaviors/watch-field.js +0 -56
  38. package/dist/core/behavior/compose-behavior.js +0 -166
  39. package/dist/core/behavior/create-field-path.js +0 -69
  40. package/dist/core/behavior/index.js +0 -17
  41. package/dist/core/behavior/types.js +0 -7
  42. package/dist/core/context/form-context-impl.js +0 -37
  43. package/dist/core/factories/index.js +0 -6
  44. package/dist/core/factories/node-factory.js +0 -281
  45. package/dist/core/nodes/array-node.js +0 -534
  46. package/dist/core/nodes/field-node.js +0 -510
  47. package/dist/core/nodes/form-node.js +0 -343
  48. package/dist/core/nodes/group-node/field-registry.d.ts +0 -191
  49. package/dist/core/nodes/group-node/field-registry.js +0 -215
  50. package/dist/core/nodes/group-node/index.d.ts +0 -11
  51. package/dist/core/nodes/group-node/index.js +0 -11
  52. package/dist/core/nodes/group-node/proxy-builder.d.ts +0 -71
  53. package/dist/core/nodes/group-node/proxy-builder.js +0 -161
  54. package/dist/core/nodes/group-node/state-manager.d.ts +0 -184
  55. package/dist/core/nodes/group-node/state-manager.js +0 -265
  56. package/dist/core/nodes/group-node.js +0 -770
  57. package/dist/core/types/deep-schema.js +0 -11
  58. package/dist/core/types/field-path.js +0 -4
  59. package/dist/core/types/form-context.js +0 -25
  60. package/dist/core/types/group-node-proxy.js +0 -31
  61. package/dist/core/types/index.js +0 -4
  62. package/dist/core/types/validation-schema.js +0 -10
  63. package/dist/core/utils/create-form.js +0 -24
  64. package/dist/core/utils/debounce.js +0 -197
  65. package/dist/core/utils/error-handler.js +0 -226
  66. package/dist/core/utils/field-path-navigator.js +0 -374
  67. package/dist/core/utils/index.js +0 -14
  68. package/dist/core/utils/registry-helpers.js +0 -79
  69. package/dist/core/utils/registry-stack.js +0 -86
  70. package/dist/core/utils/resources.js +0 -69
  71. package/dist/core/utils/subscription-manager.js +0 -214
  72. package/dist/core/utils/type-guards.js +0 -169
  73. package/dist/core/validation/core/apply-when.js +0 -41
  74. package/dist/core/validation/core/apply.js +0 -38
  75. package/dist/core/validation/core/index.js +0 -8
  76. package/dist/core/validation/core/validate-async.js +0 -45
  77. package/dist/core/validation/core/validate-tree.js +0 -37
  78. package/dist/core/validation/core/validate.js +0 -38
  79. package/dist/core/validation/field-path.js +0 -147
  80. package/dist/core/validation/index.js +0 -33
  81. package/dist/core/validation/validate-form.js +0 -152
  82. package/dist/core/validation/validation-applicator.js +0 -217
  83. package/dist/core/validation/validation-context.js +0 -75
  84. package/dist/core/validation/validation-registry.js +0 -298
  85. package/dist/core/validation/validators/array-validators.js +0 -86
  86. package/dist/core/validation/validators/date.js +0 -117
  87. package/dist/core/validation/validators/email.js +0 -60
  88. package/dist/core/validation/validators/index.js +0 -14
  89. package/dist/core/validation/validators/max-length.js +0 -60
  90. package/dist/core/validation/validators/max.js +0 -60
  91. package/dist/core/validation/validators/min-length.js +0 -60
  92. package/dist/core/validation/validators/min.js +0 -60
  93. package/dist/core/validation/validators/number.js +0 -90
  94. package/dist/core/validation/validators/pattern.js +0 -62
  95. package/dist/core/validation/validators/phone.js +0 -58
  96. package/dist/core/validation/validators/required.js +0 -69
  97. package/dist/core/validation/validators/url.js +0 -55
  98. package/dist/hooks/useFormControl.js +0 -298
  99. package/dist/node-factory-D7DOnSSN.js +0 -3200
@@ -1,265 +0,0 @@
1
- /**
2
- * StateManager - управление состоянием GroupNode
3
- *
4
- * Инкапсулирует всю логику создания и управления сигналами состояния:
5
- * - Приватные сигналы (submitting, disabled, formErrors)
6
- * - Публичные computed signals (value, valid, invalid, touched, dirty, pending, errors, status, submitting)
7
- *
8
- * Извлечено из GroupNode для соблюдения SRP (Single Responsibility Principle).
9
- * Отвечает только за логику управления состоянием формы.
10
- *
11
- * @template T Тип формы (объект)
12
- *
13
- * @example
14
- * ```typescript
15
- * class GroupNode {
16
- * private stateManager: StateManager<T>;
17
- *
18
- * constructor(schema: FormSchema<T>) {
19
- * this.fieldRegistry = new FieldRegistry<T>();
20
- * // ... создание полей ...
21
- * this.stateManager = new StateManager(this.fieldRegistry);
22
- *
23
- * // Доступ к computed signals
24
- * this.value = this.stateManager.value;
25
- * this.valid = this.stateManager.valid;
26
- * }
27
- * }
28
- * ```
29
- */
30
- import { signal, computed } from '@preact/signals-core';
31
- /**
32
- * Менеджер состояния для GroupNode
33
- *
34
- * Создает и управляет всеми сигналами состояния формы:
35
- * - value - значение формы как объект
36
- * - valid/invalid - валидность формы
37
- * - touched/dirty - пользовательское взаимодействие
38
- * - pending - асинхронная валидация в процессе
39
- * - errors - все ошибки валидации (form-level + field-level)
40
- * - status - общий статус формы
41
- * - submitting - флаг отправки формы
42
- *
43
- * @template T Тип формы (объект)
44
- */
45
- export class StateManager {
46
- fieldRegistry;
47
- // ============================================================================
48
- // Приватные сигналы (мутабельные)
49
- // ============================================================================
50
- /**
51
- * Флаг отправки формы
52
- * Устанавливается в true во время отправки формы на сервер
53
- */
54
- _submitting;
55
- /**
56
- * Флаг disabled состояния
57
- * Если true, форма считается disabled
58
- */
59
- _disabled;
60
- /**
61
- * Form-level validation errors (не связанные с конкретным полем)
62
- * Используется для server-side errors или кросс-полевой валидации
63
- */
64
- _formErrors;
65
- // ============================================================================
66
- // Публичные computed signals (read-only)
67
- // ============================================================================
68
- /**
69
- * Значение формы как объект
70
- *
71
- * Computed signal, который автоматически пересчитывается при изменении любого поля.
72
- * Использует мемоизацию - если зависимости не изменились, вернет закешированный объект.
73
- *
74
- * @example
75
- * ```typescript
76
- * const form = new GroupNode({ email: { value: 'test@mail.com' } });
77
- * console.log(form.value.value); // { email: 'test@mail.com' }
78
- * ```
79
- */
80
- value;
81
- /**
82
- * Форма валидна?
83
- *
84
- * Computed signal. Форма валидна, если:
85
- * - Нет form-level errors
86
- * - Все поля валидны
87
- */
88
- valid;
89
- /**
90
- * Форма невалидна?
91
- *
92
- * Computed signal. Инверсия valid.
93
- */
94
- invalid;
95
- /**
96
- * Хотя бы одно поле touched?
97
- *
98
- * Computed signal. Возвращает true, если хотя бы одно поле было touched.
99
- */
100
- touched;
101
- /**
102
- * Хотя бы одно поле dirty?
103
- *
104
- * Computed signal. Возвращает true, если хотя бы одно поле изменилось.
105
- */
106
- dirty;
107
- /**
108
- * Асинхронная валидация в процессе?
109
- *
110
- * Computed signal. Возвращает true, если хотя бы одно поле находится в pending состоянии.
111
- */
112
- pending;
113
- /**
114
- * Все ошибки валидации
115
- *
116
- * Computed signal. Возвращает массив всех ошибок:
117
- * - Form-level errors
118
- * - Field-level errors (из всех вложенных полей)
119
- */
120
- errors;
121
- /**
122
- * Общий статус формы
123
- *
124
- * Computed signal. Возможные значения:
125
- * - 'disabled' - форма disabled
126
- * - 'pending' - асинхронная валидация в процессе
127
- * - 'invalid' - форма невалидна
128
- * - 'valid' - форма валидна
129
- */
130
- status;
131
- /**
132
- * Форма в процессе отправки?
133
- *
134
- * Computed signal (обертка над _submitting для read-only доступа).
135
- */
136
- submitting;
137
- // ============================================================================
138
- // Конструктор
139
- // ============================================================================
140
- /**
141
- * Создать менеджер состояния
142
- *
143
- * @param fieldRegistry - реестр полей формы
144
- */
145
- constructor(fieldRegistry) {
146
- this.fieldRegistry = fieldRegistry;
147
- // Инициализация приватных сигналов
148
- this._submitting = signal(false);
149
- this._disabled = signal(false);
150
- this._formErrors = signal([]);
151
- // Создание computed signals
152
- // Computed signal для значения формы
153
- // Автоматически кеширует результат (мемоизация)
154
- // Первый вызов: O(n) где n = количество полей
155
- // Повторные вызовы (если зависимости не изменились): O(1) (возврат кешированного объекта)
156
- this.value = computed(() => {
157
- const result = {};
158
- this.fieldRegistry.forEach((field, key) => {
159
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
160
- result[key] = field.value.value;
161
- });
162
- return result;
163
- });
164
- // Computed signal для валидности формы
165
- this.valid = computed(() => {
166
- // Проверяем отсутствие form-level errors
167
- const hasFormErrors = this._formErrors.value.length > 0;
168
- if (hasFormErrors)
169
- return false;
170
- // Проверяем все поля
171
- return Array.from(this.fieldRegistry.values()).every((field) => field.valid.value);
172
- });
173
- // Computed signal для невалидности (инверсия valid)
174
- this.invalid = computed(() => !this.valid.value);
175
- // Computed signal для pending состояния
176
- this.pending = computed(() => Array.from(this.fieldRegistry.values()).some((field) => field.pending.value));
177
- // Computed signal для touched состояния
178
- this.touched = computed(() => Array.from(this.fieldRegistry.values()).some((field) => field.touched.value));
179
- // Computed signal для dirty состояния
180
- this.dirty = computed(() => Array.from(this.fieldRegistry.values()).some((field) => field.dirty.value));
181
- // Computed signal для ошибок (form-level + field-level)
182
- this.errors = computed(() => {
183
- const allErrors = [];
184
- // Добавляем form-level errors
185
- allErrors.push(...this._formErrors.value);
186
- // Добавляем field-level errors
187
- this.fieldRegistry.forEach((field) => {
188
- allErrors.push(...field.errors.value);
189
- });
190
- return allErrors;
191
- });
192
- // Computed signal для статуса формы
193
- this.status = computed(() => {
194
- if (this._disabled.value)
195
- return 'disabled';
196
- if (this.pending.value)
197
- return 'pending';
198
- if (this.invalid.value)
199
- return 'invalid';
200
- return 'valid';
201
- });
202
- // Computed signal для submitting (read-only обертка)
203
- this.submitting = computed(() => this._submitting.value);
204
- }
205
- // ============================================================================
206
- // Публичные методы для управления состоянием
207
- // ============================================================================
208
- /**
209
- * Установить form-level ошибки
210
- *
211
- * @param errors - массив ошибок валидации
212
- *
213
- * @example
214
- * ```typescript
215
- * // Server-side ошибки
216
- * stateManager.setFormErrors([
217
- * { code: 'server_error', message: 'Пользователь с таким email уже существует' }
218
- * ]);
219
- * ```
220
- */
221
- setFormErrors(errors) {
222
- this._formErrors.value = errors;
223
- }
224
- /**
225
- * Очистить form-level ошибки
226
- */
227
- clearFormErrors() {
228
- this._formErrors.value = [];
229
- }
230
- /**
231
- * Получить form-level ошибки
232
- */
233
- getFormErrors() {
234
- return this._formErrors.value;
235
- }
236
- /**
237
- * Установить флаг submitting
238
- *
239
- * @param value - true если форма отправляется, false если нет
240
- *
241
- * @example
242
- * ```typescript
243
- * stateManager.setSubmitting(true);
244
- * await api.submitForm(form.getValue());
245
- * stateManager.setSubmitting(false);
246
- * ```
247
- */
248
- setSubmitting(value) {
249
- this._submitting.value = value;
250
- }
251
- /**
252
- * Установить флаг disabled
253
- *
254
- * @param value - true если форма disabled, false если нет
255
- */
256
- setDisabled(value) {
257
- this._disabled.value = value;
258
- }
259
- /**
260
- * Получить флаг disabled
261
- */
262
- isDisabled() {
263
- return this._disabled.value;
264
- }
265
- }