@reformer/core 2.0.0-beta.6 → 2.0.0-beta.7
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-2HSqHPb4.js → behaviors-DyPzh2-X.js} +1 -1
- package/dist/behaviors.js +2 -2
- package/dist/core/nodes/array-node.d.ts +28 -4
- package/dist/core/types/form-proxy.d.ts +2 -2
- package/dist/core/utils/create-form.d.ts +8 -6
- package/dist/core/utils/index.d.ts +1 -0
- package/dist/core/utils/unique-id.d.ts +26 -0
- package/dist/core/validation/validation-context.d.ts +27 -35
- package/dist/core/validation/validation-registry.d.ts +0 -5
- package/dist/index.js +489 -446
- package/dist/{registry-helpers-BRxAr6nG.js → registry-helpers--8-OogF8.js} +12 -25
- package/dist/{validators-gXoHPdqM.js → validators-CWdzevnC.js} +116 -137
- package/dist/validators.js +2 -2
- package/package.json +1 -1
package/dist/behaviors.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as s, b as r, g as t, c as o, m as l, i as h, f as n, e as i, k as m, j as p, s as c, t as d, l as f, n as F, h as y } from "./behaviors-
|
|
2
|
-
import { d as v, B, c as b } from "./registry-helpers-
|
|
1
|
+
import { a as s, b as r, g as t, c as o, m as l, i as h, f as n, e as i, k as m, j as p, s as c, t as d, l as f, n as F, h as y } from "./behaviors-DyPzh2-X.js";
|
|
2
|
+
import { d as v, B, c as b } from "./registry-helpers--8-OogF8.js";
|
|
3
3
|
export {
|
|
4
4
|
v as BehaviorContextImpl,
|
|
5
5
|
B as BehaviorRegistry,
|
|
@@ -39,6 +39,8 @@ export declare class ArrayNode<T extends FormFields> extends FormNode<T[]> {
|
|
|
39
39
|
* Использует SubscriptionManager вместо массива для управления подписками
|
|
40
40
|
*/
|
|
41
41
|
private disposers;
|
|
42
|
+
/** Array-level validation errors (e.g., "минимум 1 элемент") */
|
|
43
|
+
private readonly _arrayErrors;
|
|
42
44
|
private validationSchemaFn?;
|
|
43
45
|
private behaviorSchemaFn?;
|
|
44
46
|
readonly value: ReadonlySignal<T[]>;
|
|
@@ -74,7 +76,7 @@ export declare class ArrayNode<T extends FormFields> extends FormNode<T[]> {
|
|
|
74
76
|
/**
|
|
75
77
|
* Получить элемент по индексу
|
|
76
78
|
* @param index - Индекс элемента
|
|
77
|
-
* @returns Типизированный GroupNode или undefined если индекс вне границ
|
|
79
|
+
* @returns Типизированный GroupNode proxy или undefined если индекс вне границ
|
|
78
80
|
*/
|
|
79
81
|
at(index: number): FormProxy<T> | undefined;
|
|
80
82
|
getValue(): T[];
|
|
@@ -128,7 +130,29 @@ export declare class ArrayNode<T extends FormFields> extends FormNode<T[]> {
|
|
|
128
130
|
*/
|
|
129
131
|
resetToInitial(): void;
|
|
130
132
|
validate(): Promise<boolean>;
|
|
131
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Установить array-level validation errors
|
|
135
|
+
*
|
|
136
|
+
* @param errors - Массив ошибок валидации уровня массива
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* arrayNode.setErrors([{
|
|
141
|
+
* code: 'minItems',
|
|
142
|
+
* message: 'Минимум 1 элемент обязателен',
|
|
143
|
+
* }]);
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
setErrors(errors: ValidationError[]): void;
|
|
147
|
+
/**
|
|
148
|
+
* Очистить все errors (array-level + item-level)
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* arrayNode.clearErrors();
|
|
153
|
+
* console.log(arrayNode.errors.value); // []
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
132
156
|
clearErrors(): void;
|
|
133
157
|
/**
|
|
134
158
|
* Hook: вызывается после markAsTouched()
|
|
@@ -156,12 +180,12 @@ export declare class ArrayNode<T extends FormFields> extends FormNode<T[]> {
|
|
|
156
180
|
protected onMarkAsPristine(): void;
|
|
157
181
|
/**
|
|
158
182
|
* Итерировать по элементам массива
|
|
159
|
-
* @param callback - Функция, вызываемая для каждого элемента с типизированным GroupNode
|
|
183
|
+
* @param callback - Функция, вызываемая для каждого элемента с типизированным GroupNode proxy
|
|
160
184
|
*/
|
|
161
185
|
forEach(callback: (item: FormProxy<T>, index: number) => void): void;
|
|
162
186
|
/**
|
|
163
187
|
* Маппинг элементов массива
|
|
164
|
-
* @param callback - Функция преобразования с типизированным GroupNode
|
|
188
|
+
* @param callback - Функция преобразования с типизированным GroupNode proxy
|
|
165
189
|
* @returns Новый массив результатов
|
|
166
190
|
*/
|
|
167
191
|
map<R>(callback: (item: FormProxy<T>, index: number) => R): R[];
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* items: Array<{ title: string }>;
|
|
17
17
|
* }
|
|
18
18
|
*
|
|
19
|
-
* const form
|
|
19
|
+
* const form = createForm<MyForm>(schema);
|
|
20
20
|
*
|
|
21
21
|
* // TypeScript знает, что это FieldNode<string>
|
|
22
22
|
* form.name.setValue('John');
|
|
@@ -72,7 +72,7 @@ export type FormControlsProxy<T> = {
|
|
|
72
72
|
* };
|
|
73
73
|
* }
|
|
74
74
|
*
|
|
75
|
-
* const form
|
|
75
|
+
* const form = createForm<UserForm>(schema);
|
|
76
76
|
*
|
|
77
77
|
* // Доступ к методам GroupNode
|
|
78
78
|
* await form.validate();
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Фабричная функция для создания формы с правильной типизацией
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Это рекомендуемый способ создания форм в ReFormer v2.0+.
|
|
5
|
+
* Создаёт GroupNode и возвращает его Proxy для типобезопасного доступа к полям.
|
|
6
6
|
*
|
|
7
7
|
* @group Utilities
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
10
|
* ```typescript
|
|
11
|
-
* //
|
|
12
|
-
* const form: FormProxy<MyForm> = new GroupNode<MyForm>(config);
|
|
13
|
-
*
|
|
14
|
-
* // Используйте:
|
|
11
|
+
* // Рекомендуемый способ:
|
|
15
12
|
* const form = createForm<MyForm>(config);
|
|
13
|
+
* form.email.setValue('test@mail.com'); // Типобезопасный доступ к полям
|
|
14
|
+
*
|
|
15
|
+
* // Если нужен именно GroupNode instance:
|
|
16
|
+
* const groupNode = new GroupNode<MyForm>(config);
|
|
17
|
+
* const proxy = groupNode.getProxy(); // Явно получаем Proxy
|
|
16
18
|
* ```
|
|
17
19
|
*/
|
|
18
20
|
import type { FormProxy, GroupNodeConfig, FormSchema } from '../types';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Генератор уникальных идентификаторов
|
|
3
|
+
*
|
|
4
|
+
* Использует атомный счётчик для генерации гарантированно уникальных ключей.
|
|
5
|
+
* Решает проблему возможного дублирования ключей при использовании
|
|
6
|
+
* Date.now() + Math.random() в быстрых последовательных вызовах.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const key1 = uniqueId('watch'); // "watch-1"
|
|
11
|
+
* const key2 = uniqueId('watch'); // "watch-2"
|
|
12
|
+
* const key3 = uniqueId('effect'); // "effect-3"
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Генерирует уникальный идентификатор с указанным префиксом
|
|
17
|
+
*
|
|
18
|
+
* @param prefix - Префикс для идентификатора
|
|
19
|
+
* @returns Уникальный идентификатор в формате `${prefix}-${counter}`
|
|
20
|
+
*/
|
|
21
|
+
export declare function uniqueId(prefix: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Сбросить счётчик (только для тестов)
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export declare function resetUniqueIdCounter(): void;
|
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Реализация контекста валидации
|
|
3
|
+
*
|
|
4
|
+
* Использует паттерн наследования для устранения дублирования кода
|
|
5
|
+
* между различными типами контекстов валидации.
|
|
3
6
|
*/
|
|
4
7
|
import type { GroupNode } from '../nodes/group-node';
|
|
5
8
|
import type { FieldNode } from '../nodes/field-node';
|
|
6
9
|
import type { FormProxy } from '../types/form-proxy';
|
|
7
10
|
import type { FormContext } from '../types/form-context';
|
|
8
11
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
12
|
+
* Базовый класс контекста валидации
|
|
13
|
+
* Содержит общую логику для всех типов контекстов
|
|
14
|
+
* @internal
|
|
11
15
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
private control;
|
|
16
|
+
declare abstract class BaseValidationContext<TForm> implements FormContext<TForm> {
|
|
17
|
+
protected readonly _form: GroupNode<TForm>;
|
|
15
18
|
/**
|
|
16
19
|
* Форма с типизированным Proxy-доступом к полям
|
|
17
20
|
*/
|
|
18
21
|
readonly form: FormProxy<TForm>;
|
|
19
|
-
constructor(form: GroupNode<TForm
|
|
20
|
-
/**
|
|
21
|
-
* Получить текущее значение поля (внутренний метод для validation-applicator)
|
|
22
|
-
* @internal
|
|
23
|
-
*/
|
|
24
|
-
value(): TField;
|
|
22
|
+
constructor(form: GroupNode<TForm>);
|
|
25
23
|
/**
|
|
26
24
|
* Безопасно установить значение поля по строковому пути
|
|
27
25
|
* Автоматически использует emitEvent: false для предотвращения циклов
|
|
@@ -29,42 +27,36 @@ export declare class ValidationContextImpl<TForm, TField> implements FormContext
|
|
|
29
27
|
setFieldValue(path: string, value: unknown): void;
|
|
30
28
|
}
|
|
31
29
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
30
|
+
* Контекст валидации для отдельного поля
|
|
31
|
+
* Предоставляет доступ к значению конкретного поля
|
|
34
32
|
*/
|
|
35
|
-
export declare class
|
|
36
|
-
private
|
|
33
|
+
export declare class ValidationContextImpl<TForm, TField> extends BaseValidationContext<TForm> {
|
|
34
|
+
private control;
|
|
35
|
+
constructor(form: GroupNode<TForm>, _fieldKey: keyof TForm, control: FieldNode<TField>);
|
|
37
36
|
/**
|
|
38
|
-
*
|
|
37
|
+
* Получить текущее значение поля (внутренний метод для validation-applicator)
|
|
38
|
+
* @internal
|
|
39
39
|
*/
|
|
40
|
-
|
|
40
|
+
value(): TField;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Контекст для cross-field валидации
|
|
44
|
+
* Не предоставляет доступ к конкретному полю, только к форме целиком
|
|
45
|
+
*/
|
|
46
|
+
export declare class TreeValidationContextImpl<TForm> extends BaseValidationContext<TForm> {
|
|
41
47
|
constructor(form: GroupNode<TForm>);
|
|
42
|
-
/**
|
|
43
|
-
* Безопасно установить значение поля по строковому пути
|
|
44
|
-
* Автоматически использует emitEvent: false для предотвращения циклов
|
|
45
|
-
*/
|
|
46
|
-
setFieldValue(path: string, value: unknown): void;
|
|
47
48
|
}
|
|
48
49
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
50
|
+
* Контекст валидации для ArrayNode
|
|
51
|
+
* Предоставляет доступ к значению массива
|
|
51
52
|
*/
|
|
52
|
-
export declare class ArrayValidationContextImpl<TForm, TItem>
|
|
53
|
-
private _form;
|
|
53
|
+
export declare class ArrayValidationContextImpl<TForm, TItem> extends BaseValidationContext<TForm> {
|
|
54
54
|
private arrayValue;
|
|
55
|
-
/**
|
|
56
|
-
* Форма с типизированным Proxy-доступом к полям
|
|
57
|
-
*/
|
|
58
|
-
readonly form: FormProxy<TForm>;
|
|
59
55
|
constructor(form: GroupNode<TForm>, _fieldKey: keyof TForm, arrayValue: TItem[]);
|
|
60
56
|
/**
|
|
61
57
|
* Получить текущее значение массива (для валидатора)
|
|
62
58
|
* @internal
|
|
63
59
|
*/
|
|
64
60
|
value(): TItem[];
|
|
65
|
-
/**
|
|
66
|
-
* Безопасно установить значение поля по строковому пути
|
|
67
|
-
* Автоматически использует emitEvent: false для предотвращения циклов
|
|
68
|
-
*/
|
|
69
|
-
setFieldValue(path: string, value: unknown): void;
|
|
70
61
|
}
|
|
62
|
+
export {};
|
|
@@ -142,11 +142,6 @@ export declare class ValidationRegistry {
|
|
|
142
142
|
* Возвращает локальный массив валидаторов (без аргумента form).
|
|
143
143
|
*/
|
|
144
144
|
getValidators(): ValidatorRegistration[];
|
|
145
|
-
/**
|
|
146
|
-
* Применить зарегистрированные валидаторы к GroupNode
|
|
147
|
-
* @private
|
|
148
|
-
*/
|
|
149
|
-
private applyValidators;
|
|
150
145
|
/**
|
|
151
146
|
* Применить array-items validators к ArrayNode элементам
|
|
152
147
|
* @private
|