@reformer/core 5.0.0 → 6.0.0
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/README.md +7 -5
- package/dist/behaviors-O9a1Djj9.js +147 -0
- package/dist/behaviors.d.ts +131 -4
- package/dist/behaviors.js +298 -27
- package/dist/core/model/behaviors.d.ts +123 -0
- package/dist/core/model/form-model.d.ts +18 -0
- package/dist/core/model/index.d.ts +12 -0
- package/dist/core/model/types.d.ts +112 -0
- package/dist/core/model/validate-model.d.ts +46 -0
- package/dist/core/nodes/array-node.d.ts +34 -2
- package/dist/core/nodes/group-node.d.ts +19 -71
- package/dist/core/nodes/model-array-node.d.ts +71 -0
- package/dist/core/types/deep-schema.d.ts +16 -2
- package/dist/core/types/form-proxy.d.ts +17 -6
- package/dist/core/types/index.d.ts +5 -23
- package/dist/core/types/validation-schema.d.ts +15 -66
- package/dist/core/utils/create-form.d.ts +24 -0
- package/dist/core/utils/derived-registry.d.ts +5 -0
- package/dist/core/utils/index.d.ts +4 -4
- package/dist/core/utils/signal-node-registry.d.ts +12 -0
- package/dist/core/utils/type-guards.d.ts +2 -3
- package/dist/core/validation/index.d.ts +5 -11
- package/dist/core/validation/validators/email.d.ts +5 -29
- package/dist/core/validation/validators/future-date.d.ts +6 -28
- package/dist/core/validation/validators/index.d.ts +11 -4
- package/dist/core/validation/validators/integer.d.ts +13 -0
- package/dist/core/validation/validators/is-date.d.ts +5 -28
- package/dist/core/validation/validators/is-number.d.ts +14 -0
- package/dist/core/validation/validators/max-age.d.ts +6 -29
- package/dist/core/validation/validators/max-date.d.ts +6 -29
- package/dist/core/validation/validators/max-length.d.ts +5 -30
- package/dist/core/validation/validators/max.d.ts +7 -29
- package/dist/core/validation/validators/min-age.d.ts +6 -29
- package/dist/core/validation/validators/min-date.d.ts +6 -29
- package/dist/core/validation/validators/min-length.d.ts +5 -30
- package/dist/core/validation/validators/min.d.ts +7 -29
- package/dist/core/validation/validators/multiple-of.d.ts +13 -0
- package/dist/core/validation/validators/non-negative.d.ts +13 -0
- package/dist/core/validation/validators/non-zero.d.ts +13 -0
- package/dist/core/validation/validators/past-date.d.ts +5 -28
- package/dist/core/validation/validators/pattern.d.ts +5 -32
- package/dist/core/validation/validators/phone.d.ts +9 -19
- package/dist/core/validation/validators/required.d.ts +10 -31
- package/dist/core/validation/validators/url.d.ts +13 -15
- package/dist/index.d.ts +3 -4
- package/dist/index.js +1299 -875
- package/dist/validators/email.js +7 -9
- package/dist/validators/future-date.js +11 -12
- package/dist/validators/integer.d.ts +2 -0
- package/dist/validators/integer.js +10 -0
- package/dist/validators/is-date.js +6 -7
- package/dist/validators/is-number.d.ts +2 -0
- package/dist/validators/is-number.js +10 -0
- package/dist/validators/max-age.js +11 -12
- package/dist/validators/max-date.js +11 -12
- package/dist/validators/max-length.js +12 -8
- package/dist/validators/max.js +5 -6
- package/dist/validators/min-age.js +10 -11
- package/dist/validators/min-date.js +12 -13
- package/dist/validators/min-length.js +12 -8
- package/dist/validators/min.js +6 -7
- package/dist/validators/multiple-of.d.ts +2 -0
- package/dist/validators/multiple-of.js +10 -0
- package/dist/validators/non-negative.d.ts +2 -0
- package/dist/validators/non-negative.js +10 -0
- package/dist/validators/non-zero.d.ts +2 -0
- package/dist/validators/non-zero.js +10 -0
- package/dist/validators/past-date.js +11 -12
- package/dist/validators/pattern.js +6 -7
- package/dist/validators/phone.js +14 -32
- package/dist/validators/required.js +9 -10
- package/dist/validators/url.js +19 -16
- package/dist/validators.js +67 -54
- package/llms.txt +959 -2584
- package/package.json +19 -35
- package/dist/behaviors/compute-from.d.ts +0 -2
- package/dist/behaviors/compute-from.js +0 -31
- package/dist/behaviors/copy-from.d.ts +0 -2
- package/dist/behaviors/copy-from.js +0 -29
- package/dist/behaviors/enable-when.d.ts +0 -2
- package/dist/behaviors/enable-when.js +0 -25
- package/dist/behaviors/reset-when.d.ts +0 -2
- package/dist/behaviors/reset-when.js +0 -24
- package/dist/behaviors/revalidate-when.d.ts +0 -2
- package/dist/behaviors/revalidate-when.js +0 -18
- package/dist/behaviors/sync-fields.d.ts +0 -2
- package/dist/behaviors/sync-fields.js +0 -41
- package/dist/behaviors/transform-value.d.ts +0 -2
- package/dist/behaviors/transform-value.js +0 -45
- package/dist/behaviors/watch-field.d.ts +0 -2
- package/dist/behaviors/watch-field.js +0 -21
- package/dist/core/behavior/behavior-context.d.ts +0 -47
- package/dist/core/behavior/behavior-registry.d.ts +0 -85
- package/dist/core/behavior/behaviors/compute-from.d.ts +0 -70
- package/dist/core/behavior/behaviors/copy-from.d.ts +0 -56
- package/dist/core/behavior/behaviors/enable-when.d.ts +0 -118
- package/dist/core/behavior/behaviors/index.d.ts +0 -11
- package/dist/core/behavior/behaviors/reset-when.d.ts +0 -64
- package/dist/core/behavior/behaviors/revalidate-when.d.ts +0 -53
- package/dist/core/behavior/behaviors/sync-fields.d.ts +0 -48
- package/dist/core/behavior/behaviors/transform-value.d.ts +0 -192
- package/dist/core/behavior/behaviors/watch-field.d.ts +0 -80
- package/dist/core/behavior/compose-behavior.d.ts +0 -96
- package/dist/core/behavior/index.d.ts +0 -11
- package/dist/core/behavior/types.d.ts +0 -146
- package/dist/core/types/field-path.d.ts +0 -42
- package/dist/core/types/form-context.d.ts +0 -89
- package/dist/core/utils/field-path-navigator.d.ts +0 -240
- package/dist/core/utils/field-path.d.ts +0 -60
- package/dist/core/utils/registry-helpers.d.ts +0 -43
- package/dist/core/validation/core/apply-when.d.ts +0 -22
- package/dist/core/validation/core/apply.d.ts +0 -52
- package/dist/core/validation/core/index.d.ts +0 -8
- package/dist/core/validation/core/validate-async.d.ts +0 -36
- package/dist/core/validation/core/validate-tree.d.ts +0 -35
- package/dist/core/validation/core/validate.d.ts +0 -26
- package/dist/core/validation/validate-form.d.ts +0 -48
- package/dist/core/validation/validation-applicator.d.ts +0 -70
- package/dist/core/validation/validation-context.d.ts +0 -86
- package/dist/core/validation/validation-registry.d.ts +0 -142
- package/dist/core/validation/validators/array-validators.d.ts +0 -53
- package/dist/core/validation/validators/number.d.ts +0 -31
- package/dist/field-path-DuKdGcIE.js +0 -66
- package/dist/hooks/useHiddenCondition.d.ts +0 -25
- package/dist/index-D25LsbRm.js +0 -73
- package/dist/registry-helpers-Bv_BJ1s-.js +0 -615
- package/dist/safe-effect-Dh8uw81c.js +0 -20
- package/dist/validate-C3XiA_zf.js +0 -10
- package/dist/validators/number.d.ts +0 -2
- package/dist/validators/number.js +0 -35
- package/dist/validators-BGsNOgT1.js +0 -207
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { FieldPathNode, FieldPath } from '../../types';
|
|
2
|
-
import { ValidationSchemaFn } from '../../types/validation-schema';
|
|
3
|
-
/**
|
|
4
|
-
* Применить validation схему к корневому path формы
|
|
5
|
-
*
|
|
6
|
-
* Используется для композиции схем на уровне всей формы.
|
|
7
|
-
*
|
|
8
|
-
* @group Validation
|
|
9
|
-
* @category Core Functions
|
|
10
|
-
*
|
|
11
|
-
* @param path - Корневой FieldPath формы (весь объект путей)
|
|
12
|
-
* @param validationSchema - Схема валидации
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const creditApplicationValidation: ValidationSchemaFn<CreditApplicationForm> = (path) => {
|
|
17
|
-
* apply(path, basicInfoValidation);
|
|
18
|
-
* apply(path, contactInfoValidation);
|
|
19
|
-
* };
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export declare function apply<TForm>(path: FieldPath<TForm>, validationSchema: ValidationSchemaFn<TForm>): void;
|
|
23
|
-
/**
|
|
24
|
-
* Применить validation схему к вложенному полю или полям
|
|
25
|
-
*
|
|
26
|
-
* Поддерживает:
|
|
27
|
-
* - Одно поле или массив полей
|
|
28
|
-
* - Одну схему или массив схем
|
|
29
|
-
* - Все комбинации (поле + схема, поле + схемы, поля + схема, поля + схемы)
|
|
30
|
-
*
|
|
31
|
-
* @param fields - Одно поле или массив полей
|
|
32
|
-
* @param validationSchemas - Одна схема или массив схем
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* // Одна схема к одному полю
|
|
37
|
-
* apply(path.registrationAddress, addressValidation);
|
|
38
|
-
*
|
|
39
|
-
* // Одна схема к нескольким полям
|
|
40
|
-
* apply([path.homeAddress, path.workAddress], addressValidation);
|
|
41
|
-
*
|
|
42
|
-
* // Несколько схем к одному полю
|
|
43
|
-
* apply(path.email, [emailValidation, uniqueEmailValidation]);
|
|
44
|
-
*
|
|
45
|
-
* // Несколько схем к нескольким полям
|
|
46
|
-
* apply(
|
|
47
|
-
* [path.email, path.confirmEmail],
|
|
48
|
-
* [emailValidation, matchValidation]
|
|
49
|
-
* );
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export declare function apply<TForm, TField>(fields: FieldPathNode<TForm, TField> | Array<FieldPathNode<TForm, TField> | undefined> | undefined, validationSchemas: ValidationSchemaFn<TField> | Array<ValidationSchemaFn<TField>>): void;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ContextualAsyncValidatorFn, ValidateAsyncOptions } from '../../types/validation-schema';
|
|
2
|
-
import { FieldPathNode } from '../../types';
|
|
3
|
-
/**
|
|
4
|
-
* Зарегистрировать асинхронный валидатор для поля
|
|
5
|
-
*
|
|
6
|
-
* @group Validation
|
|
7
|
-
* @category Core Functions
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* validateAsync(
|
|
12
|
-
* path.inn,
|
|
13
|
-
* async (ctx: ValidationContext<TForm, TField>) => {
|
|
14
|
-
* const inn = ctx.value();
|
|
15
|
-
* if (!inn) return null;
|
|
16
|
-
*
|
|
17
|
-
* const response = await fetch('/api/validate-inn', {
|
|
18
|
-
* method: 'POST',
|
|
19
|
-
* body: JSON.stringify({ inn }),
|
|
20
|
-
* });
|
|
21
|
-
*
|
|
22
|
-
* const data = await response.json();
|
|
23
|
-
* if (!data.valid) {
|
|
24
|
-
* return {
|
|
25
|
-
* code: 'invalidInn',
|
|
26
|
-
* message: 'ИНН не найден в базе данных ФНС',
|
|
27
|
-
* };
|
|
28
|
-
* }
|
|
29
|
-
*
|
|
30
|
-
* return null;
|
|
31
|
-
* },
|
|
32
|
-
* { debounce: 1000 }
|
|
33
|
-
* );
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export declare function validateAsync<TForm, TField>(fieldPath: FieldPathNode<TForm, TField>, validatorFn: ContextualAsyncValidatorFn<TForm, TField>, options?: ValidateAsyncOptions): void;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { TreeValidatorFn, ValidateTreeOptions } from '../../types';
|
|
2
|
-
/**
|
|
3
|
-
* Зарегистрировать cross-field валидатор
|
|
4
|
-
*
|
|
5
|
-
* Используется для валидации, которая зависит от нескольких полей
|
|
6
|
-
*
|
|
7
|
-
* @group Validation
|
|
8
|
-
* @category Core Functions
|
|
9
|
-
*
|
|
10
|
-
* @remarks
|
|
11
|
-
* Параметр `ctx` в callback требует явной типизации для корректного вывода типов:
|
|
12
|
-
* ```typescript
|
|
13
|
-
* validateTree((ctx: { form: MyFormType }) => { ... });
|
|
14
|
-
* ```
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* // Явная типизация ctx для избежания implicit any
|
|
19
|
-
* validateTree(
|
|
20
|
-
* (ctx: { form: MyForm }) => {
|
|
21
|
-
* if (ctx.form.initialPayment && ctx.form.propertyValue) {
|
|
22
|
-
* if (ctx.form.initialPayment > ctx.form.propertyValue) {
|
|
23
|
-
* return {
|
|
24
|
-
* code: 'initialPaymentTooHigh',
|
|
25
|
-
* message: 'Первоначальный взнос не может превышать стоимость',
|
|
26
|
-
* };
|
|
27
|
-
* }
|
|
28
|
-
* }
|
|
29
|
-
* return null;
|
|
30
|
-
* },
|
|
31
|
-
* { targetField: 'initialPayment' }
|
|
32
|
-
* );
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export declare function validateTree<TForm>(validatorFn: TreeValidatorFn<TForm>, options?: ValidateTreeOptions): void;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { ContextualValidatorFn, FieldPathNode, ValidateOptions } from '../../types';
|
|
2
|
-
/**
|
|
3
|
-
* Зарегистрировать кастомный синхронный валидатор для поля
|
|
4
|
-
* Поддерживает опциональные поля
|
|
5
|
-
*
|
|
6
|
-
* @group Validation
|
|
7
|
-
* @category Core Functions
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* validate(path.birthDate, (ctx: ValidationContext<TForm, TField>) => {
|
|
12
|
-
* const birthDate = new Date(ctx.value());
|
|
13
|
-
* const age = calculateAge(birthDate);
|
|
14
|
-
*
|
|
15
|
-
* if (age < 18) {
|
|
16
|
-
* return {
|
|
17
|
-
* code: 'tooYoung',
|
|
18
|
-
* message: 'Заемщику должно быть не менее 18 лет',
|
|
19
|
-
* };
|
|
20
|
-
* }
|
|
21
|
-
*
|
|
22
|
-
* return null;
|
|
23
|
-
* });
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export declare function validate<TForm, TField>(fieldPath: FieldPathNode<TForm, TField> | undefined, validatorFn: ContextualValidatorFn<TForm, TField>, options?: ValidateOptions): void;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { GroupNode } from '../nodes/group-node';
|
|
2
|
-
import { ValidationSchemaFn, FormFields } from '../types';
|
|
3
|
-
/**
|
|
4
|
-
* Валидировать форму в соответствии с указанной схемой
|
|
5
|
-
*
|
|
6
|
-
* Функция создает временный контекст валидации, применяет валидаторы
|
|
7
|
-
* из схемы и очищает контекст без сохранения в реестр.
|
|
8
|
-
*
|
|
9
|
-
* @param form - GroupNode для валидации
|
|
10
|
-
* @param schema - Схема валидации (ValidationSchemaFn)
|
|
11
|
-
* @returns Promise<boolean> - `true` если форма валидна, `false` если есть ошибки
|
|
12
|
-
*
|
|
13
|
-
* @example Multi-step форма: валидация текущего шага
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const goToNextStep = async () => {
|
|
16
|
-
* const isValid = await validateForm(form, step1LoanValidation);
|
|
17
|
-
*
|
|
18
|
-
* if (!isValid) {
|
|
19
|
-
* form.markAsTouched(); // Показать ошибки
|
|
20
|
-
* return false;
|
|
21
|
-
* }
|
|
22
|
-
*
|
|
23
|
-
* setCurrentStep(2);
|
|
24
|
-
* return true;
|
|
25
|
-
* };
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* @example Полная валидация перед submit
|
|
29
|
-
* ```typescript
|
|
30
|
-
* const handleSubmit = async () => {
|
|
31
|
-
* const isValid = await validateForm(form, fullValidationSchema);
|
|
32
|
-
*
|
|
33
|
-
* if (isValid) {
|
|
34
|
-
* await form.submit(onSubmit);
|
|
35
|
-
* }
|
|
36
|
-
* };
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* @example Условная валидация
|
|
40
|
-
* ```typescript
|
|
41
|
-
* const schema = isBusinessAccount
|
|
42
|
-
* ? businessValidation
|
|
43
|
-
* : personalValidation;
|
|
44
|
-
*
|
|
45
|
-
* const isValid = await validateForm(form, schema);
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
export declare function validateForm<T extends FormFields>(form: GroupNode<T>, schema: ValidationSchemaFn<T>): Promise<boolean>;
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { GroupNode } from '../nodes/group-node';
|
|
2
|
-
import { ValidatorRegistration } from '../types';
|
|
3
|
-
/**
|
|
4
|
-
* Класс для применения валидаторов к форме
|
|
5
|
-
*
|
|
6
|
-
* Выполняет:
|
|
7
|
-
* - Группировку валидаторов по полям
|
|
8
|
-
* - Фильтрацию по условиям (condition)
|
|
9
|
-
* - Применение sync/async валидаторов к FieldNode
|
|
10
|
-
* - Применение tree валидаторов (кросс-полевая валидация)
|
|
11
|
-
*
|
|
12
|
-
* @template T Тип формы (объект)
|
|
13
|
-
*/
|
|
14
|
-
export declare class ValidationApplicator<T> {
|
|
15
|
-
private readonly form;
|
|
16
|
-
constructor(form: GroupNode<T>);
|
|
17
|
-
/**
|
|
18
|
-
* Применить валидаторы к полям формы
|
|
19
|
-
*
|
|
20
|
-
* Этапы применения:
|
|
21
|
-
* 1. Разделение валидаторов на field и tree
|
|
22
|
-
* 2. Применение field валидаторов (sync/async)
|
|
23
|
-
* 3. Применение tree валидаторов (кросс-полевая валидация)
|
|
24
|
-
*
|
|
25
|
-
* @param validators Зарегистрированные валидаторы
|
|
26
|
-
*/
|
|
27
|
-
apply(validators: ValidatorRegistration[]): Promise<void>;
|
|
28
|
-
/**
|
|
29
|
-
* Группировка валидаторов по типам
|
|
30
|
-
*
|
|
31
|
-
* Разделяет валидаторы на:
|
|
32
|
-
* - Field validators (sync/async) - группируются по fieldPath
|
|
33
|
-
* - Tree validators - применяются ко всей форме
|
|
34
|
-
*
|
|
35
|
-
* @param validators Все зарегистрированные валидаторы
|
|
36
|
-
* @returns Сгруппированные валидаторы
|
|
37
|
-
*/
|
|
38
|
-
private groupValidators;
|
|
39
|
-
/**
|
|
40
|
-
* Применение field валидаторов к полям
|
|
41
|
-
*
|
|
42
|
-
* Для каждого поля:
|
|
43
|
-
* 1. Найти FieldNode по пути
|
|
44
|
-
* 2. Проверить условия (condition)
|
|
45
|
-
* 3. Выполнить sync/async валидаторы
|
|
46
|
-
* 4. Установить ошибки на поле
|
|
47
|
-
*
|
|
48
|
-
* @param validatorsByField Валидаторы, сгруппированные по полям
|
|
49
|
-
*/
|
|
50
|
-
private applyFieldValidators;
|
|
51
|
-
/**
|
|
52
|
-
* Применение tree валидаторов (кросс-полевая валидация)
|
|
53
|
-
*
|
|
54
|
-
* Tree валидаторы имеют доступ ко всей форме через TreeValidationContext.
|
|
55
|
-
* Ошибки устанавливаются на targetField (если указано).
|
|
56
|
-
*
|
|
57
|
-
* @param treeValidators Список tree валидаторов
|
|
58
|
-
*/
|
|
59
|
-
private applyTreeValidators;
|
|
60
|
-
/**
|
|
61
|
-
* Проверка условия (condition) для валидатора
|
|
62
|
-
*
|
|
63
|
-
* Условие определяет, должен ли валидатор выполняться.
|
|
64
|
-
* Использует getFieldByPath для поддержки вложенных путей.
|
|
65
|
-
*
|
|
66
|
-
* @param condition Условие валидатора
|
|
67
|
-
* @returns true, если условие выполнено
|
|
68
|
-
*/
|
|
69
|
-
private checkCondition;
|
|
70
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { GroupNode } from '../nodes/group-node';
|
|
2
|
-
import { FieldNode } from '../nodes/field-node';
|
|
3
|
-
import { FormProxy } from '../types/form-proxy';
|
|
4
|
-
import { FormContext } from '../types/form-context';
|
|
5
|
-
/**
|
|
6
|
-
* Базовый класс контекста валидации
|
|
7
|
-
* Содержит общую логику для всех типов контекстов
|
|
8
|
-
* @internal
|
|
9
|
-
*/
|
|
10
|
-
declare abstract class BaseValidationContext<TForm> implements FormContext<TForm> {
|
|
11
|
-
protected readonly _form: GroupNode<TForm>;
|
|
12
|
-
/**
|
|
13
|
-
* Форма с типизированным Proxy-доступом к полям
|
|
14
|
-
*/
|
|
15
|
-
readonly form: FormProxy<TForm>;
|
|
16
|
-
constructor(form: GroupNode<TForm>);
|
|
17
|
-
/**
|
|
18
|
-
* Безопасно установить значение поля по строковому пути
|
|
19
|
-
* Автоматически использует emitEvent: false для предотвращения циклов
|
|
20
|
-
*/
|
|
21
|
-
setFieldValue(path: string, value: unknown): void;
|
|
22
|
-
/**
|
|
23
|
-
* Получить поле формы по строковому пути
|
|
24
|
-
*/
|
|
25
|
-
getFieldByPath(path: string): import('../..').FormNode<import('../types').FormValue> | undefined;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Контекст валидации одного поля. Создаётся фреймворком и передаётся в валидаторы
|
|
29
|
-
* (`required`, `validate`, …) — напрямую инстанцировать не нужно.
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```typescript
|
|
33
|
-
* import { validate } from '@reformer/core/validators';
|
|
34
|
-
*
|
|
35
|
-
* validate(path.password, (value, ctx) => {
|
|
36
|
-
* // ctx — экземпляр ValidationContextImpl, доступ к ctx.form для cross-field логики
|
|
37
|
-
* if (value !== ctx.form.confirmPassword.value) {
|
|
38
|
-
* return { code: 'mismatch', message: 'Пароли не совпадают' };
|
|
39
|
-
* }
|
|
40
|
-
* return null;
|
|
41
|
-
* });
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export declare class ValidationContextImpl<TForm, TField> extends BaseValidationContext<TForm> {
|
|
45
|
-
private control;
|
|
46
|
-
constructor(form: GroupNode<TForm>, _fieldKey: keyof TForm, control: FieldNode<TField>);
|
|
47
|
-
/**
|
|
48
|
-
* Получить текущее значение поля (внутренний метод для validation-applicator)
|
|
49
|
-
* @internal
|
|
50
|
-
*/
|
|
51
|
-
value(): TField;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Контекст cross-field валидации. Передаётся в `validateTree`/`validateForm`
|
|
55
|
-
* callback'и — напрямую инстанцировать не нужно.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```typescript
|
|
59
|
-
* import { validateForm } from '@reformer/core';
|
|
60
|
-
*
|
|
61
|
-
* validateForm(form, (ctx) => {
|
|
62
|
-
* // ctx — экземпляр TreeValidationContextImpl
|
|
63
|
-
* if (ctx.form.startDate.value > ctx.form.endDate.value) {
|
|
64
|
-
* return [{ code: 'date-range', message: 'Дата начала позже даты окончания' }];
|
|
65
|
-
* }
|
|
66
|
-
* return [];
|
|
67
|
-
* });
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
export declare class TreeValidationContextImpl<TForm> extends BaseValidationContext<TForm> {
|
|
71
|
-
constructor(form: GroupNode<TForm>);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Контекст валидации для ArrayNode
|
|
75
|
-
* Предоставляет доступ к значению массива
|
|
76
|
-
*/
|
|
77
|
-
export declare class ArrayValidationContextImpl<TForm, TItem> extends BaseValidationContext<TForm> {
|
|
78
|
-
private arrayValue;
|
|
79
|
-
constructor(form: GroupNode<TForm>, _fieldKey: keyof TForm, arrayValue: TItem[]);
|
|
80
|
-
/**
|
|
81
|
-
* Получить текущее значение массива (для валидатора)
|
|
82
|
-
* @internal
|
|
83
|
-
*/
|
|
84
|
-
value(): TItem[];
|
|
85
|
-
}
|
|
86
|
-
export {};
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { GroupNode } from '../nodes/group-node';
|
|
2
|
-
import { FormFields } from '../types';
|
|
3
|
-
import { AbstractRegistry } from '../utils/abstract-registry';
|
|
4
|
-
import { ValidatorRegistration, ContextualValidatorFn, ContextualAsyncValidatorFn, TreeValidatorFn, ConditionFn, ValidateOptions, ValidateAsyncOptions, ValidateTreeOptions } from '../types/validation-schema';
|
|
5
|
-
/**
|
|
6
|
-
* Контекст регистрации валидаторов
|
|
7
|
-
* Управляет condition stack для условных валидаторов
|
|
8
|
-
*/
|
|
9
|
-
declare class RegistrationContext {
|
|
10
|
-
private validators;
|
|
11
|
-
private conditionStack;
|
|
12
|
-
/**
|
|
13
|
-
* Добавить валидатор в контекст
|
|
14
|
-
*/
|
|
15
|
-
addValidator(registration: ValidatorRegistration): void;
|
|
16
|
-
/**
|
|
17
|
-
* Войти в условный блок
|
|
18
|
-
*/
|
|
19
|
-
enterCondition(fieldPath: string, conditionFn: ConditionFn<unknown>): void;
|
|
20
|
-
/**
|
|
21
|
-
* Выйти из условного блока
|
|
22
|
-
*/
|
|
23
|
-
exitCondition(): void;
|
|
24
|
-
/**
|
|
25
|
-
* Получить все зарегистрированные валидаторы
|
|
26
|
-
*/
|
|
27
|
-
getValidators(): ValidatorRegistration[];
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Реестр валидаторов для формы
|
|
31
|
-
*
|
|
32
|
-
* Каждый экземпляр GroupNode создает собственный реестр (композиция).
|
|
33
|
-
* Устраняет race conditions и изолирует формы друг от друга.
|
|
34
|
-
*
|
|
35
|
-
* Наследует AbstractRegistry для унификации:
|
|
36
|
-
* - Управления global stack
|
|
37
|
-
* - Template methods begin/end registration
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```typescript
|
|
41
|
-
* class GroupNode {
|
|
42
|
-
* private readonly validationRegistry = new ValidationRegistry();
|
|
43
|
-
*
|
|
44
|
-
* applyValidationSchema(schemaFn) {
|
|
45
|
-
* this.validationRegistry.beginRegistration(); // Pushes this to global stack
|
|
46
|
-
* schemaFn(createFieldPath(this)); // Uses getCurrent()
|
|
47
|
-
* this.validationRegistry.endRegistration(this); // Pops from global stack
|
|
48
|
-
* }
|
|
49
|
-
* }
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export declare class ValidationRegistry extends AbstractRegistry<ValidatorRegistration> {
|
|
53
|
-
/** Внутренний стек контекстов для управления condition blocks */
|
|
54
|
-
private contextStack;
|
|
55
|
-
/** Финальные валидаторы после завершения регистрации */
|
|
56
|
-
private validators;
|
|
57
|
-
/**
|
|
58
|
-
* Получить текущий активный реестр из global stack
|
|
59
|
-
*
|
|
60
|
-
* @returns Текущий активный реестр или null
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```typescript
|
|
64
|
-
* // В schema-validators.ts
|
|
65
|
-
* export function required(...) {
|
|
66
|
-
* const registry = ValidationRegistry.getCurrent();
|
|
67
|
-
* if (registry) {
|
|
68
|
-
* registry.registerSync(...);
|
|
69
|
-
* }
|
|
70
|
-
* }
|
|
71
|
-
* ```
|
|
72
|
-
*/
|
|
73
|
-
static getCurrent(): ValidationRegistry | null;
|
|
74
|
-
/**
|
|
75
|
-
* Начать регистрацию валидаторов для формы
|
|
76
|
-
*
|
|
77
|
-
* Помещает this в global stack для изоляции форм
|
|
78
|
-
* Создает новый RegistrationContext для condition management
|
|
79
|
-
*/
|
|
80
|
-
beginRegistration(): RegistrationContext;
|
|
81
|
-
/**
|
|
82
|
-
* Завершить регистрацию и применить валидаторы к GroupNode
|
|
83
|
-
*
|
|
84
|
-
* Извлекает this из global stack
|
|
85
|
-
*
|
|
86
|
-
* Сохраняет валидаторы в локальном состоянии (this.validators) вместо глобального WeakMap.
|
|
87
|
-
*/
|
|
88
|
-
endRegistration<T extends FormFields>(form: GroupNode<T>): void;
|
|
89
|
-
/**
|
|
90
|
-
* Отменить регистрацию без применения валидаторов
|
|
91
|
-
* Используется для временной валидации (например, в validateForm)
|
|
92
|
-
*
|
|
93
|
-
* Извлекает this из global stack
|
|
94
|
-
*/
|
|
95
|
-
cancelRegistration(): void;
|
|
96
|
-
/**
|
|
97
|
-
* Получить текущий контекст регистрации
|
|
98
|
-
*/
|
|
99
|
-
getCurrentContext(): RegistrationContext | undefined;
|
|
100
|
-
/**
|
|
101
|
-
* Зарегистрировать синхронный валидатор
|
|
102
|
-
*/
|
|
103
|
-
registerSync<TForm = unknown, TField = unknown>(fieldPath: string, validator: ContextualValidatorFn<TForm, TField>, options?: ValidateOptions): void;
|
|
104
|
-
/**
|
|
105
|
-
* Зарегистрировать асинхронный валидатор
|
|
106
|
-
*/
|
|
107
|
-
registerAsync<TForm = unknown, TField = unknown>(fieldPath: string, validator: ContextualAsyncValidatorFn<TForm, TField>, options?: ValidateAsyncOptions): void;
|
|
108
|
-
/**
|
|
109
|
-
* Зарегистрировать tree валидатор
|
|
110
|
-
*/
|
|
111
|
-
registerTree<TForm = unknown>(validator: TreeValidatorFn<TForm>, options?: ValidateTreeOptions): void;
|
|
112
|
-
/**
|
|
113
|
-
* Войти в условный блок
|
|
114
|
-
*/
|
|
115
|
-
enterCondition(fieldPath: string, conditionFn: ConditionFn<unknown>): void;
|
|
116
|
-
/**
|
|
117
|
-
* Выйти из условного блока
|
|
118
|
-
*/
|
|
119
|
-
exitCondition(): void;
|
|
120
|
-
/**
|
|
121
|
-
* Зарегистрировать validation schema для элементов массива
|
|
122
|
-
*
|
|
123
|
-
* Используется функцией validateItems() для регистрации схемы валидации,
|
|
124
|
-
* которая будет применяться к каждому элементу ArrayNode.
|
|
125
|
-
*
|
|
126
|
-
* @param fieldPath - Путь к ArrayNode полю
|
|
127
|
-
* @param itemSchemaFn - Validation schema для элемента массива
|
|
128
|
-
*/
|
|
129
|
-
registerArrayItemValidation(fieldPath: string, itemSchemaFn: unknown): void;
|
|
130
|
-
/**
|
|
131
|
-
* Получить зарегистрированные валидаторы для этого реестра
|
|
132
|
-
*
|
|
133
|
-
* Возвращает локальный массив валидаторов (без аргумента form).
|
|
134
|
-
*/
|
|
135
|
-
getValidators(): ValidatorRegistration[];
|
|
136
|
-
/**
|
|
137
|
-
* Применить array-items validators к ArrayNode элементам
|
|
138
|
-
* @private
|
|
139
|
-
*/
|
|
140
|
-
private applyArrayItemValidators;
|
|
141
|
-
}
|
|
142
|
-
export {};
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { ValidateOptions, ValidationSchemaFn } from '../../types/validation-schema';
|
|
2
|
-
import { FieldPathNode } from '../../types';
|
|
3
|
-
/**
|
|
4
|
-
* Проверить что массив содержит хотя бы один элемент
|
|
5
|
-
*
|
|
6
|
-
* Это удобный алиас для `minLength(field, 1)`, оптимизированный для массивов.
|
|
7
|
-
*
|
|
8
|
-
* @group Validation
|
|
9
|
-
* @category Validators
|
|
10
|
-
*
|
|
11
|
-
* @param fieldPath - Поле-массив для валидации
|
|
12
|
-
* @param options - Опции валидации (message, params и т.д.)
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* // Простая проверка
|
|
17
|
-
* notEmpty(path.properties, { message: 'Добавьте хотя бы один объект имущества' });
|
|
18
|
-
*
|
|
19
|
-
* // С дополнительными параметрами
|
|
20
|
-
* notEmpty(path.coBorrowers, {
|
|
21
|
-
* message: 'Требуется хотя бы один созаемщик',
|
|
22
|
-
* params: { minItems: 1 }
|
|
23
|
-
* });
|
|
24
|
-
* ```
|
|
25
|
-
*/
|
|
26
|
-
export declare function notEmpty<TForm, TItem>(fieldPath: FieldPathNode<TForm, TItem[] | undefined> | undefined, options?: ValidateOptions): void;
|
|
27
|
-
/**
|
|
28
|
-
* Применить validation schema к каждому элементу массива
|
|
29
|
-
*
|
|
30
|
-
* Регистрирует схему валидации, которая будет автоматически применяться
|
|
31
|
-
* к каждому элементу ArrayNode (как существующим, так и новым).
|
|
32
|
-
*
|
|
33
|
-
* @group Validation
|
|
34
|
-
* @category Validators
|
|
35
|
-
*
|
|
36
|
-
* @param fieldPath - Поле-массив для валидации элементов
|
|
37
|
-
* @param itemSchemaFn - Validation schema для одного элемента
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```typescript
|
|
41
|
-
* import { propertyValidation } from './property-validation';
|
|
42
|
-
*
|
|
43
|
-
* // В additionalValidation
|
|
44
|
-
* applyWhen(path.hasProperty, (value) => value === true, (path) => {
|
|
45
|
-
* // Проверка что массив не пустой
|
|
46
|
-
* notEmpty(path.properties, { message: 'Добавьте хотя бы один объект имущества' });
|
|
47
|
-
*
|
|
48
|
-
* // Валидация каждого элемента
|
|
49
|
-
* validateItems(path.properties, propertyValidation);
|
|
50
|
-
* });
|
|
51
|
-
* ```
|
|
52
|
-
*/
|
|
53
|
-
export declare function validateItems<TForm, TItem>(fieldPath: FieldPathNode<TForm, TItem[] | undefined> | undefined, itemSchemaFn: ValidationSchemaFn<TItem>): void;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { ValidateOptions } from '../../types/validation-schema';
|
|
2
|
-
import { FieldPathNode } from '../../types';
|
|
3
|
-
/**
|
|
4
|
-
* Адаптер для number валидатора
|
|
5
|
-
* Проверяет, что значение является числом и соответствует заданным ограничениям
|
|
6
|
-
*
|
|
7
|
-
* @group Validation
|
|
8
|
-
* @category Validators
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* number(path.age);
|
|
13
|
-
* number(path.price, { min: 0, max: 1000000 });
|
|
14
|
-
* number(path.percentage, { min: 0, max: 100, integer: true });
|
|
15
|
-
* number(path.rating, { min: 0, max: 5, multipleOf: 0.5 });
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
18
|
-
export declare function number<TForm, TField extends number | undefined = number>(fieldPath: FieldPathNode<TForm, TField> | undefined, options?: ValidateOptions & {
|
|
19
|
-
/** Минимальное значение (включительно) */
|
|
20
|
-
min?: number;
|
|
21
|
-
/** Максимальное значение (включительно) */
|
|
22
|
-
max?: number;
|
|
23
|
-
/** Требовать целое число */
|
|
24
|
-
integer?: boolean;
|
|
25
|
-
/** Значение должно быть кратно этому числу */
|
|
26
|
-
multipleOf?: number;
|
|
27
|
-
/** Разрешить отрицательные числа (по умолчанию true) */
|
|
28
|
-
allowNegative?: boolean;
|
|
29
|
-
/** Разрешить ноль (по умолчанию true) */
|
|
30
|
-
allowZero?: boolean;
|
|
31
|
-
}): void;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
function c() {
|
|
2
|
-
return _("");
|
|
3
|
-
}
|
|
4
|
-
function _(t) {
|
|
5
|
-
return new Proxy({}, {
|
|
6
|
-
get(r, i) {
|
|
7
|
-
if (typeof i == "symbol")
|
|
8
|
-
return;
|
|
9
|
-
if (i === "__path" || i === "__fieldPath")
|
|
10
|
-
return t || i;
|
|
11
|
-
if (i === "__key") {
|
|
12
|
-
const n = t.split(".");
|
|
13
|
-
return n[n.length - 1] || i;
|
|
14
|
-
}
|
|
15
|
-
if (i === "then" || i === "catch" || i === "finally" || i === "constructor" || i === "toString" || i === "valueOf" || i === "toJSON")
|
|
16
|
-
return;
|
|
17
|
-
const f = t ? `${t}.${i}` : i, a = {
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
-
__key: i,
|
|
20
|
-
__path: f,
|
|
21
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
-
__formType: void 0,
|
|
23
|
-
__fieldType: void 0
|
|
24
|
-
};
|
|
25
|
-
return new Proxy(a, {
|
|
26
|
-
get(n, e) {
|
|
27
|
-
if (typeof e != "symbol") {
|
|
28
|
-
if (e === "__path" || e === "__fieldPath") return f;
|
|
29
|
-
if (e === "__key") return i;
|
|
30
|
-
if (e !== "__formType" && e !== "__fieldType" && !(e === "then" || e === "catch" || e === "finally" || e === "constructor" || e === "toString" || e === "valueOf" || e === "toJSON"))
|
|
31
|
-
return _(`${f}.${e}`);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function u(t) {
|
|
39
|
-
if (typeof t == "string")
|
|
40
|
-
return t;
|
|
41
|
-
if (t && typeof t == "object") {
|
|
42
|
-
const r = t.__path;
|
|
43
|
-
if (typeof r == "string")
|
|
44
|
-
return r;
|
|
45
|
-
}
|
|
46
|
-
throw new Error("Invalid field path node: " + JSON.stringify(t));
|
|
47
|
-
}
|
|
48
|
-
function y(t) {
|
|
49
|
-
const r = u(t);
|
|
50
|
-
return _(r);
|
|
51
|
-
}
|
|
52
|
-
function l(t) {
|
|
53
|
-
if (t && typeof t == "object" && "__key" in t)
|
|
54
|
-
return t.__key;
|
|
55
|
-
if (typeof t == "string") {
|
|
56
|
-
const r = t.split(".");
|
|
57
|
-
return r[r.length - 1];
|
|
58
|
-
}
|
|
59
|
-
throw new Error("Invalid field path node");
|
|
60
|
-
}
|
|
61
|
-
export {
|
|
62
|
-
l as a,
|
|
63
|
-
c,
|
|
64
|
-
u as e,
|
|
65
|
-
y as t
|
|
66
|
-
};
|