@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.
- package/dist/behaviors-DzYL8kY_.js +499 -0
- package/dist/behaviors.d.ts +6 -2
- package/dist/behaviors.js +19 -227
- package/dist/core/behavior/behavior-context.d.ts +6 -2
- package/dist/core/behavior/create-field-path.d.ts +3 -16
- package/dist/core/nodes/group-node.d.ts +14 -193
- package/dist/core/types/form-context.d.ts +10 -4
- package/dist/core/utils/field-path.d.ts +48 -0
- package/dist/core/utils/index.d.ts +1 -0
- package/dist/core/validation/core/validate-tree.d.ts +10 -4
- package/dist/core/validation/field-path.d.ts +3 -39
- package/dist/core/validation/validation-context.d.ts +23 -0
- package/dist/hooks/types.d.ts +328 -0
- package/dist/hooks/useFormControl.d.ts +13 -37
- package/dist/hooks/useFormControlValue.d.ts +167 -0
- package/dist/hooks/useSignalSubscription.d.ts +17 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +2886 -8
- package/dist/{create-field-path-CdPF3lIK.js → registry-helpers-BRxAr6nG.js} +133 -347
- package/dist/validators-gXoHPdqM.js +418 -0
- package/dist/validators.d.ts +6 -2
- package/dist/validators.js +29 -296
- package/llms.txt +1283 -22
- package/package.json +8 -4
- package/dist/core/behavior/behavior-applicator.d.ts +0 -71
- package/dist/core/behavior/behavior-applicator.js +0 -92
- package/dist/core/behavior/behavior-context.js +0 -38
- package/dist/core/behavior/behavior-registry.js +0 -198
- package/dist/core/behavior/behaviors/compute-from.js +0 -84
- package/dist/core/behavior/behaviors/copy-from.js +0 -64
- package/dist/core/behavior/behaviors/enable-when.js +0 -81
- package/dist/core/behavior/behaviors/index.js +0 -11
- package/dist/core/behavior/behaviors/reset-when.js +0 -63
- package/dist/core/behavior/behaviors/revalidate-when.js +0 -51
- package/dist/core/behavior/behaviors/sync-fields.js +0 -66
- package/dist/core/behavior/behaviors/transform-value.js +0 -110
- package/dist/core/behavior/behaviors/watch-field.js +0 -56
- package/dist/core/behavior/compose-behavior.js +0 -166
- package/dist/core/behavior/create-field-path.js +0 -69
- package/dist/core/behavior/index.js +0 -17
- package/dist/core/behavior/types.js +0 -7
- package/dist/core/context/form-context-impl.js +0 -37
- package/dist/core/factories/index.js +0 -6
- package/dist/core/factories/node-factory.js +0 -281
- package/dist/core/nodes/array-node.js +0 -534
- package/dist/core/nodes/field-node.js +0 -510
- package/dist/core/nodes/form-node.js +0 -343
- package/dist/core/nodes/group-node/field-registry.d.ts +0 -191
- package/dist/core/nodes/group-node/field-registry.js +0 -215
- package/dist/core/nodes/group-node/index.d.ts +0 -11
- package/dist/core/nodes/group-node/index.js +0 -11
- package/dist/core/nodes/group-node/proxy-builder.d.ts +0 -71
- package/dist/core/nodes/group-node/proxy-builder.js +0 -161
- package/dist/core/nodes/group-node/state-manager.d.ts +0 -184
- package/dist/core/nodes/group-node/state-manager.js +0 -265
- package/dist/core/nodes/group-node.js +0 -770
- package/dist/core/types/deep-schema.js +0 -11
- package/dist/core/types/field-path.js +0 -4
- package/dist/core/types/form-context.js +0 -25
- package/dist/core/types/group-node-proxy.js +0 -31
- package/dist/core/types/index.js +0 -4
- package/dist/core/types/validation-schema.js +0 -10
- package/dist/core/utils/create-form.js +0 -24
- package/dist/core/utils/debounce.js +0 -197
- package/dist/core/utils/error-handler.js +0 -226
- package/dist/core/utils/field-path-navigator.js +0 -374
- package/dist/core/utils/index.js +0 -14
- package/dist/core/utils/registry-helpers.js +0 -79
- package/dist/core/utils/registry-stack.js +0 -86
- package/dist/core/utils/resources.js +0 -69
- package/dist/core/utils/subscription-manager.js +0 -214
- package/dist/core/utils/type-guards.js +0 -169
- package/dist/core/validation/core/apply-when.js +0 -41
- package/dist/core/validation/core/apply.js +0 -38
- package/dist/core/validation/core/index.js +0 -8
- package/dist/core/validation/core/validate-async.js +0 -45
- package/dist/core/validation/core/validate-tree.js +0 -37
- package/dist/core/validation/core/validate.js +0 -38
- package/dist/core/validation/field-path.js +0 -147
- package/dist/core/validation/index.js +0 -33
- package/dist/core/validation/validate-form.js +0 -152
- package/dist/core/validation/validation-applicator.js +0 -217
- package/dist/core/validation/validation-context.js +0 -75
- package/dist/core/validation/validation-registry.js +0 -298
- package/dist/core/validation/validators/array-validators.js +0 -86
- package/dist/core/validation/validators/date.js +0 -117
- package/dist/core/validation/validators/email.js +0 -60
- package/dist/core/validation/validators/index.js +0 -14
- package/dist/core/validation/validators/max-length.js +0 -60
- package/dist/core/validation/validators/max.js +0 -60
- package/dist/core/validation/validators/min-length.js +0 -60
- package/dist/core/validation/validators/min.js +0 -60
- package/dist/core/validation/validators/number.js +0 -90
- package/dist/core/validation/validators/pattern.js +0 -62
- package/dist/core/validation/validators/phone.js +0 -58
- package/dist/core/validation/validators/required.js +0 -69
- package/dist/core/validation/validators/url.js +0 -55
- package/dist/hooks/useFormControl.js +0 -298
- 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
|
-
}
|