@reformer/core 6.0.0 → 7.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/core/factories/node-factory.d.ts +2 -1
- package/dist/core/model/behaviors.d.ts +13 -1
- package/dist/core/model/validate-model.d.ts +22 -0
- package/dist/core/nodes/field-node.d.ts +3 -3
- package/dist/core/nodes/group-node.d.ts +3 -5
- package/dist/core/nodes/model-array-node.d.ts +38 -0
- package/dist/core/types/validation-schema.d.ts +8 -2
- package/dist/core/utils/create-form.d.ts +83 -18
- package/dist/core/utils/derived-registry.d.ts +41 -2
- package/dist/core/utils/index.d.ts +0 -4
- package/dist/core/utils/signal-node-registry.d.ts +38 -4
- package/dist/core/validation/validators/email.d.ts +14 -4
- package/dist/core/validation/validators/future-date.d.ts +14 -4
- package/dist/core/validation/validators/index.d.ts +2 -1
- package/dist/core/validation/validators/integer.d.ts +13 -4
- package/dist/core/validation/validators/is-date.d.ts +14 -4
- package/dist/core/validation/validators/is-number.d.ts +15 -5
- package/dist/core/validation/validators/max-age.d.ts +16 -4
- package/dist/core/validation/validators/max-date.d.ts +16 -4
- package/dist/core/validation/validators/max-length.d.ts +18 -4
- package/dist/core/validation/validators/max.d.ts +15 -6
- package/dist/core/validation/validators/min-age.d.ts +16 -4
- package/dist/core/validation/validators/min-date.d.ts +16 -4
- package/dist/core/validation/validators/min-length.d.ts +18 -4
- package/dist/core/validation/validators/min.d.ts +15 -6
- package/dist/core/validation/validators/multiple-of.d.ts +15 -4
- package/dist/core/validation/validators/non-negative.d.ts +13 -4
- package/dist/core/validation/validators/non-zero.d.ts +13 -4
- package/dist/core/validation/validators/past-date.d.ts +14 -3
- package/dist/core/validation/validators/pattern.d.ts +24 -4
- package/dist/core/validation/validators/phone.d.ts +28 -4
- package/dist/core/validation/validators/required.d.ts +16 -5
- package/dist/core/validation/validators/url.d.ts +30 -7
- package/dist/hooks/useFormControlValue.d.ts +15 -10
- package/dist/index.js +562 -896
- package/llms.txt +2568 -2855
- package/package.json +1 -1
- package/dist/core/utils/abstract-registry.d.ts +0 -74
- package/dist/core/utils/form-observer.d.ts +0 -176
- package/dist/core/utils/registry-stack.d.ts +0 -69
|
@@ -2,12 +2,26 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора максимальной длины строки или массива.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Работает со строкой или массивом (проверяется `value.length`). Пустые значения
|
|
6
|
+
* (`null`/`undefined`/`''`) и значения без числового `length` пропускаются
|
|
7
|
+
* (используйте {@link required} для обязательности).
|
|
6
8
|
*
|
|
7
|
-
* @
|
|
9
|
+
* @param maxLen - Максимально допустимая длина (включительно)
|
|
10
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
11
|
+
* попадают `maxLength` и `actualLength`.
|
|
12
|
+
* @returns Чистый валидатор {@link Validator} для строки или массива
|
|
13
|
+
*
|
|
14
|
+
* @example Максимальная длина строки
|
|
8
15
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
16
|
+
* import { maxLength } from '@reformer/core/validators';
|
|
17
|
+
*
|
|
18
|
+
* // Внутри FieldConfig схемы формы:
|
|
19
|
+
* name: { value: model.$.name, component: Input, validators: [maxLength(50)] },
|
|
20
|
+
* bio: {
|
|
21
|
+
* value: model.$.bio,
|
|
22
|
+
* component: Textarea,
|
|
23
|
+
* validators: [maxLength(500, { message: 'Максимум 500 символов' })],
|
|
24
|
+
* },
|
|
11
25
|
* ```
|
|
12
26
|
*/
|
|
13
27
|
export declare function maxLength<TForm = unknown, TField = unknown>(maxLen: number, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,15 +2,24 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора максимального числового значения.
|
|
4
4
|
*
|
|
5
|
-
* Пустые значения пропускаются (используйте
|
|
5
|
+
* Пустые значения (`null`/`undefined`) пропускаются (используйте {@link required} для обязательности).
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
7
|
+
* @param maxValue - Максимально допустимое значение (включительно)
|
|
8
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
9
|
+
* попадают `max` и `actual`.
|
|
10
|
+
* @returns Чистый валидатор {@link Validator} для числового поля
|
|
11
|
+
*
|
|
12
|
+
* @example Максимальное значение числового поля
|
|
8
13
|
* ```typescript
|
|
9
|
-
* import {
|
|
10
|
-
* import { max } from '@reformer/core/validators';
|
|
14
|
+
* import { required, max } from '@reformer/core/validators';
|
|
11
15
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
16
|
+
* // Внутри FieldConfig схемы формы:
|
|
17
|
+
* quantity: { value: model.$.quantity, component: Input, validators: [max(100)] },
|
|
18
|
+
* discount: {
|
|
19
|
+
* value: model.$.discount,
|
|
20
|
+
* component: Input,
|
|
21
|
+
* validators: [required(), max(50, { message: 'Не более 50%' })],
|
|
22
|
+
* },
|
|
14
23
|
* ```
|
|
15
24
|
*/
|
|
16
25
|
export declare function max<TForm = unknown, TField extends number | undefined = number>(maxValue: number, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,12 +2,24 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора минимального возраста (по дате рождения).
|
|
4
4
|
*
|
|
5
|
-
* Пустые и невалидные
|
|
5
|
+
* Возраст вычисляется по дате рождения относительно сегодняшнего дня. Пустые и невалидные
|
|
6
|
+
* даты пропускаются (используйте {@link required} и {@link isDate}).
|
|
6
7
|
*
|
|
7
|
-
* @
|
|
8
|
+
* @param minAgeValue - Минимально допустимый возраст (в полных годах)
|
|
9
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
10
|
+
* попадают `minAge` и `currentAge`.
|
|
11
|
+
* @returns Чистый валидатор {@link Validator} для поля даты рождения (`string | Date`)
|
|
12
|
+
*
|
|
13
|
+
* @example Минимальный возраст
|
|
8
14
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
15
|
+
* import { required, minAge } from '@reformer/core/validators';
|
|
16
|
+
*
|
|
17
|
+
* // Внутри FieldConfig схемы формы:
|
|
18
|
+
* birthDate: {
|
|
19
|
+
* value: model.$.birthDate,
|
|
20
|
+
* component: DatePicker,
|
|
21
|
+
* validators: [required(), minAge(18, { message: 'Вам должно быть не менее 18 лет' })],
|
|
22
|
+
* },
|
|
11
23
|
* ```
|
|
12
24
|
*/
|
|
13
25
|
export declare function minAge<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(minAgeValue: number, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,12 +2,24 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора минимальной даты (включительно).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Сравнение по нормализованным датам (время обнуляется). Пустые и невалидные даты
|
|
6
|
+
* пропускаются (используйте {@link required} и {@link isDate}).
|
|
6
7
|
*
|
|
7
|
-
* @
|
|
8
|
+
* @param minDateValue - Минимально допустимая дата (включительно)
|
|
9
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
10
|
+
* попадает `minDate`.
|
|
11
|
+
* @returns Чистый валидатор {@link Validator} для поля даты (`string | Date`)
|
|
12
|
+
*
|
|
13
|
+
* @example Минимальная дата
|
|
8
14
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
15
|
+
* import { required, minDate } from '@reformer/core/validators';
|
|
16
|
+
*
|
|
17
|
+
* // Внутри FieldConfig схемы формы:
|
|
18
|
+
* startDate: {
|
|
19
|
+
* value: model.$.startDate,
|
|
20
|
+
* component: DatePicker,
|
|
21
|
+
* validators: [required(), minDate(new Date(), { message: 'Дата не раньше сегодня' })],
|
|
22
|
+
* },
|
|
11
23
|
* ```
|
|
12
24
|
*/
|
|
13
25
|
export declare function minDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(minDateValue: Date, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,12 +2,26 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора минимальной длины строки или массива.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Работает со строкой или массивом (проверяется `value.length`). Пустые значения
|
|
6
|
+
* (`null`/`undefined`/`''`) и значения без числового `length` пропускаются
|
|
7
|
+
* (используйте {@link required} для обязательности).
|
|
6
8
|
*
|
|
7
|
-
* @
|
|
9
|
+
* @param minLen - Минимально допустимая длина (включительно)
|
|
10
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
11
|
+
* попадают `minLength` и `actualLength`.
|
|
12
|
+
* @returns Чистый валидатор {@link Validator} для строки или массива
|
|
13
|
+
*
|
|
14
|
+
* @example Минимальная длина строки
|
|
8
15
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
16
|
+
* import { required, minLength } from '@reformer/core/validators';
|
|
17
|
+
*
|
|
18
|
+
* // Внутри FieldConfig схемы формы:
|
|
19
|
+
* name: { value: model.$.name, component: Input, validators: [minLength(2)] },
|
|
20
|
+
* password: {
|
|
21
|
+
* value: model.$.password,
|
|
22
|
+
* component: Input,
|
|
23
|
+
* validators: [required(), minLength(8, { message: 'Минимум 8 символов' })],
|
|
24
|
+
* },
|
|
11
25
|
* ```
|
|
12
26
|
*/
|
|
13
27
|
export declare function minLength<TForm = unknown, TField = unknown>(minLen: number, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,15 +2,24 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора минимального числового значения.
|
|
4
4
|
*
|
|
5
|
-
* Пустые значения пропускаются (используйте
|
|
5
|
+
* Пустые значения (`null`/`undefined`) пропускаются (используйте {@link required} для обязательности).
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
7
|
+
* @param minValue - Минимально допустимое значение (включительно)
|
|
8
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
9
|
+
* попадают `min` и `actual`.
|
|
10
|
+
* @returns Чистый валидатор {@link Validator} для числового поля
|
|
11
|
+
*
|
|
12
|
+
* @example Минимальное значение числового поля
|
|
8
13
|
* ```typescript
|
|
9
|
-
* import {
|
|
10
|
-
* import { min } from '@reformer/core/validators';
|
|
14
|
+
* import { required, min } from '@reformer/core/validators';
|
|
11
15
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
16
|
+
* // Внутри FieldConfig схемы формы:
|
|
17
|
+
* age: { value: model.$.age, component: Input, validators: [min(18)] },
|
|
18
|
+
* quantity: {
|
|
19
|
+
* value: model.$.quantity,
|
|
20
|
+
* component: Input,
|
|
21
|
+
* validators: [required(), min(1, { message: 'Минимум 1' })],
|
|
22
|
+
* },
|
|
14
23
|
* ```
|
|
15
24
|
*/
|
|
16
25
|
export declare function min<TForm = unknown, TField extends number | undefined = number>(minValue: number, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,12 +2,23 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора, проверяющего что число кратно заданному.
|
|
4
4
|
*
|
|
5
|
-
* Пустые значения и не-числа пропускаются (используйте
|
|
5
|
+
* Пустые значения и не-числа пропускаются (используйте {@link required} и {@link isNumber}).
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
7
|
+
* @param divisor - Делитель: значение должно быть кратно ему
|
|
8
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
9
|
+
* попадает `multipleOf` (делитель).
|
|
10
|
+
* @returns Чистый валидатор {@link Validator} для числового поля
|
|
11
|
+
*
|
|
12
|
+
* @example Проверка кратности
|
|
8
13
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
14
|
+
* import { multipleOf } from '@reformer/core/validators';
|
|
15
|
+
*
|
|
16
|
+
* // Внутри FieldConfig схемы формы:
|
|
17
|
+
* rating: {
|
|
18
|
+
* value: model.$.rating,
|
|
19
|
+
* component: Input,
|
|
20
|
+
* validators: [multipleOf(0.5, { message: 'Только шаг 0.5' })],
|
|
21
|
+
* },
|
|
11
22
|
* ```
|
|
12
23
|
*/
|
|
13
24
|
export declare function multipleOf<TForm = unknown, TField extends number | undefined = number>(divisor: number, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,12 +2,21 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора, проверяющего что число неотрицательное (`≥ 0`).
|
|
4
4
|
*
|
|
5
|
-
* Пустые значения и не-числа пропускаются (используйте
|
|
5
|
+
* Пустые значения и не-числа пропускаются (используйте {@link required} и {@link isNumber}).
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
7
|
+
* @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
|
|
8
|
+
* @returns Чистый валидатор {@link Validator} для числового поля
|
|
9
|
+
*
|
|
10
|
+
* @example Проверка неотрицательности
|
|
8
11
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
12
|
+
* import { nonNegative } from '@reformer/core/validators';
|
|
13
|
+
*
|
|
14
|
+
* // Внутри FieldConfig схемы формы:
|
|
15
|
+
* balance: {
|
|
16
|
+
* value: model.$.balance,
|
|
17
|
+
* component: Input,
|
|
18
|
+
* validators: [nonNegative({ message: 'Баланс не может быть отрицательным' })],
|
|
19
|
+
* },
|
|
11
20
|
* ```
|
|
12
21
|
*/
|
|
13
22
|
export declare function nonNegative<TForm = unknown, TField extends number | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,12 +2,21 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора, проверяющего что число не равно нулю.
|
|
4
4
|
*
|
|
5
|
-
* Пустые значения и не-числа пропускаются (используйте
|
|
5
|
+
* Пустые значения и не-числа пропускаются (используйте {@link required} и {@link isNumber}).
|
|
6
6
|
*
|
|
7
|
-
* @
|
|
7
|
+
* @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
|
|
8
|
+
* @returns Чистый валидатор {@link Validator} для числового поля
|
|
9
|
+
*
|
|
10
|
+
* @example Проверка «не ноль»
|
|
8
11
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
12
|
+
* import { nonZero } from '@reformer/core/validators';
|
|
13
|
+
*
|
|
14
|
+
* // Внутри FieldConfig схемы формы:
|
|
15
|
+
* divisor: {
|
|
16
|
+
* value: model.$.divisor,
|
|
17
|
+
* component: Input,
|
|
18
|
+
* validators: [nonZero({ message: 'Не может быть нулём' })],
|
|
19
|
+
* },
|
|
11
20
|
* ```
|
|
12
21
|
*/
|
|
13
22
|
export declare function nonZero<TForm = unknown, TField extends number | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,11 +2,22 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора, проверяющего что дата не в будущем.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Дата не должна быть позже сегодняшнего дня (сравнение по нормализованным датам).
|
|
6
|
+
* Пустые и невалидные даты пропускаются (используйте {@link required} и {@link isDate}).
|
|
6
7
|
*
|
|
7
|
-
* @
|
|
8
|
+
* @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
|
|
9
|
+
* @returns Чистый валидатор {@link Validator} для поля даты (`string | Date`)
|
|
10
|
+
*
|
|
11
|
+
* @example Дата не в будущем
|
|
8
12
|
* ```typescript
|
|
9
|
-
*
|
|
13
|
+
* import { required, pastDate } from '@reformer/core/validators';
|
|
14
|
+
*
|
|
15
|
+
* // Внутри FieldConfig схемы формы:
|
|
16
|
+
* birthDate: {
|
|
17
|
+
* value: model.$.birthDate,
|
|
18
|
+
* component: DatePicker,
|
|
19
|
+
* validators: [required(), pastDate({ message: 'Дата рождения не может быть в будущем' })],
|
|
20
|
+
* },
|
|
10
21
|
* ```
|
|
11
22
|
*/
|
|
12
23
|
export declare function pastDate<TForm = unknown, TField extends string | Date | undefined = string | Date>(options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -2,12 +2,32 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
2
2
|
/**
|
|
3
3
|
* Фабрика валидатора регулярного выражения.
|
|
4
4
|
*
|
|
5
|
-
* Пустые значения пропускаются (используйте
|
|
5
|
+
* Пустые значения (`''`/`null`/`undefined`) пропускаются (используйте {@link required}
|
|
6
|
+
* для обязательности).
|
|
6
7
|
*
|
|
7
|
-
* @
|
|
8
|
+
* @param regex - Регулярное выражение для проверки значения
|
|
9
|
+
* @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
|
|
10
|
+
* попадает `pattern` (строка-источник regex).
|
|
11
|
+
* @returns Чистый валидатор {@link Validator} для строкового поля
|
|
12
|
+
*
|
|
13
|
+
* @example Проверка по регулярному выражению
|
|
8
14
|
* ```typescript
|
|
9
|
-
*
|
|
10
|
-
*
|
|
15
|
+
* import { required, pattern } from '@reformer/core/validators';
|
|
16
|
+
*
|
|
17
|
+
* // Внутри FieldConfig схемы формы:
|
|
18
|
+
* name: {
|
|
19
|
+
* value: model.$.name,
|
|
20
|
+
* component: Input,
|
|
21
|
+
* validators: [pattern(/^[a-zA-Zа-яА-Я]+$/, { message: 'Только буквы' })],
|
|
22
|
+
* },
|
|
23
|
+
* phone: {
|
|
24
|
+
* value: model.$.phone,
|
|
25
|
+
* component: InputMask,
|
|
26
|
+
* validators: [
|
|
27
|
+
* required(),
|
|
28
|
+
* pattern(/^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/, { message: 'Формат +7 (999) 123-45-67' }),
|
|
29
|
+
* ],
|
|
30
|
+
* },
|
|
11
31
|
* ```
|
|
12
32
|
*/
|
|
13
33
|
export declare function pattern<TForm = unknown, TField extends string | undefined = string>(regex: RegExp, options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -1,17 +1,41 @@
|
|
|
1
1
|
import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
2
|
+
/**
|
|
3
|
+
* Формат проверки номера телефона для валидатора {@link phone}.
|
|
4
|
+
*
|
|
5
|
+
* - `international` — международный формат E.164 (`+?[1-9]\d{1,14}`);
|
|
6
|
+
* - `ru` — российские номера (`+7`/`7`/`8`, коды `4`/`8`/`9`, с разделителями);
|
|
7
|
+
* - `us` — североамериканские номера (NANP);
|
|
8
|
+
* - `any` — свободный формат: цифры, скобки и разделители (по умолчанию).
|
|
9
|
+
*/
|
|
2
10
|
export type PhoneFormat = 'international' | 'ru' | 'us' | 'any';
|
|
11
|
+
/**
|
|
12
|
+
* Опции валидатора {@link phone}. Расширяют {@link ValidateOptions} (`message`, `params`)
|
|
13
|
+
* выбором формата номера.
|
|
14
|
+
*/
|
|
3
15
|
export interface PhoneValidatorOptions extends ValidateOptions {
|
|
16
|
+
/** Формат проверки {@link PhoneFormat}. По умолчанию `'any'`. */
|
|
4
17
|
format?: PhoneFormat;
|
|
5
18
|
}
|
|
6
19
|
/**
|
|
7
20
|
* Фабрика валидатора номера телефона.
|
|
8
21
|
*
|
|
9
|
-
*
|
|
22
|
+
* Проверяет значение по regex выбранного {@link PhoneFormat}. Пустые значения
|
|
23
|
+
* (`''`/`null`/`undefined`) пропускаются (используйте {@link required} для обязательности).
|
|
24
|
+
*
|
|
25
|
+
* @param options - Опции валидатора {@link PhoneValidatorOptions}. В `params` ошибки
|
|
26
|
+
* автоматически попадает выбранный `format`.
|
|
27
|
+
* @returns Чистый валидатор {@link Validator} для строкового поля
|
|
10
28
|
*
|
|
11
|
-
* @example
|
|
29
|
+
* @example Проверка номера телефона
|
|
12
30
|
* ```typescript
|
|
13
|
-
*
|
|
14
|
-
*
|
|
31
|
+
* import { required, phone } from '@reformer/core/validators';
|
|
32
|
+
*
|
|
33
|
+
* // Внутри FieldConfig схемы формы:
|
|
34
|
+
* phone: {
|
|
35
|
+
* value: model.$.phone,
|
|
36
|
+
* component: Input,
|
|
37
|
+
* validators: [required(), phone({ format: 'ru' })],
|
|
38
|
+
* },
|
|
15
39
|
* ```
|
|
16
40
|
*/
|
|
17
41
|
export declare function phone<TForm = unknown, TField extends string | undefined = string>(options?: PhoneValidatorOptions): Validator<TForm, TField>;
|
|
@@ -7,14 +7,25 @@ import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
|
7
7
|
* Пустыми считаются: `null`, `undefined`, `''` (пустая строка).
|
|
8
8
|
* Для boolean полей требуется значение `true`.
|
|
9
9
|
*
|
|
10
|
-
* @
|
|
10
|
+
* @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
|
|
11
|
+
* @returns Чистый валидатор {@link Validator} для поля схемы
|
|
12
|
+
*
|
|
13
|
+
* @example Обязательные поля в схеме формы
|
|
11
14
|
* ```typescript
|
|
12
|
-
* import { validate } from '@reformer/core';
|
|
13
15
|
* import { required } from '@reformer/core/validators';
|
|
14
16
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
17
|
+
* // Внутри FieldConfig схемы формы:
|
|
18
|
+
* email: { value: model.$.email, component: Input, validators: [required()] },
|
|
19
|
+
* phone: {
|
|
20
|
+
* value: model.$.phone,
|
|
21
|
+
* component: Input,
|
|
22
|
+
* validators: [required({ message: 'Укажите номер телефона' })],
|
|
23
|
+
* },
|
|
24
|
+
* agreeToTerms: {
|
|
25
|
+
* value: model.$.agreeToTerms,
|
|
26
|
+
* component: Checkbox,
|
|
27
|
+
* validators: [required({ message: 'Необходимо принять условия' })],
|
|
28
|
+
* },
|
|
18
29
|
* ```
|
|
19
30
|
*/
|
|
20
31
|
export declare function required<TForm = unknown, TField = unknown>(options?: ValidateOptions): Validator<TForm, TField>;
|
|
@@ -1,20 +1,43 @@
|
|
|
1
1
|
import { Validator, ValidateOptions } from '../../types/validation-schema';
|
|
2
|
+
/**
|
|
3
|
+
* Опции валидатора {@link url}. Расширяют {@link ValidateOptions} (`message`, `params`)
|
|
4
|
+
* настройками проверки протокола.
|
|
5
|
+
*/
|
|
2
6
|
export interface UrlValidatorOptions extends ValidateOptions {
|
|
3
|
-
/** Требовать наличие протокола (http
|
|
7
|
+
/** Требовать наличие протокола (`http://` или `https://`). По умолчанию `false`. */
|
|
4
8
|
requireProtocol?: boolean;
|
|
5
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Список разрешённых протоколов (без `://`), например `['https']`. Если задан,
|
|
11
|
+
* значение с иным протоколом даёт ошибку с кодом `url_protocol`.
|
|
12
|
+
*/
|
|
6
13
|
allowedProtocols?: string[];
|
|
7
14
|
}
|
|
8
15
|
/**
|
|
9
16
|
* Фабрика валидатора URL.
|
|
10
17
|
*
|
|
11
|
-
* Пустые значения пропускаются (используйте
|
|
18
|
+
* Пустые значения (`''`/`null`/`undefined`) пропускаются (используйте {@link required}
|
|
19
|
+
* для обязательности). При `requireProtocol` протокол обязателен; `allowedProtocols`
|
|
20
|
+
* дополнительно ограничивает набор допустимых протоколов.
|
|
12
21
|
*
|
|
13
|
-
* @
|
|
22
|
+
* @param options - Опции валидатора {@link UrlValidatorOptions}
|
|
23
|
+
* @returns Чистый валидатор {@link Validator} для строкового поля
|
|
24
|
+
*
|
|
25
|
+
* @example Проверка URL
|
|
14
26
|
* ```typescript
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
27
|
+
* import { required, url } from '@reformer/core/validators';
|
|
28
|
+
*
|
|
29
|
+
* // Внутри FieldConfig схемы формы:
|
|
30
|
+
* website: {
|
|
31
|
+
* value: model.$.website,
|
|
32
|
+
* component: Input,
|
|
33
|
+
* validators: [required(), url({ message: 'Введите корректный URL' })],
|
|
34
|
+
* },
|
|
35
|
+
* // Требовать протокол и ограничить схему только https:
|
|
36
|
+
* homepage: {
|
|
37
|
+
* value: model.$.homepage,
|
|
38
|
+
* component: Input,
|
|
39
|
+
* validators: [url({ requireProtocol: true, allowedProtocols: ['https'] })],
|
|
40
|
+
* },
|
|
18
41
|
* ```
|
|
19
42
|
*/
|
|
20
43
|
export declare function url<TForm = unknown, TField extends string | undefined = string>(options?: UrlValidatorOptions): Validator<TForm, TField>;
|
|
@@ -84,23 +84,28 @@ import { FormValue } from '../core/types';
|
|
|
84
84
|
* }
|
|
85
85
|
* ```
|
|
86
86
|
*
|
|
87
|
-
* @example Отображение суммы в реальном времени
|
|
87
|
+
* @example Отображение суммы позиции в реальном времени
|
|
88
88
|
* ```tsx
|
|
89
89
|
* interface OrderItem {
|
|
90
|
-
* quantity:
|
|
91
|
-
* price:
|
|
90
|
+
* quantity: number;
|
|
91
|
+
* price: number;
|
|
92
92
|
* }
|
|
93
93
|
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* const
|
|
94
|
+
* // Хук вызывается на уровне компонента-строки (не в цикле — Rules of Hooks).
|
|
95
|
+
* // Доступ к полям элемента — через Proxy: item.quantity, item.price.
|
|
96
|
+
* function OrderRow({ item }: { item: FormProxy<OrderItem> }) {
|
|
97
|
+
* const quantity = useFormControlValue(item.quantity);
|
|
98
|
+
* const price = useFormControlValue(item.price);
|
|
98
99
|
*
|
|
99
|
-
*
|
|
100
|
+
* return <span>Итого: ${(quantity * price).toFixed(2)}</span>;
|
|
101
|
+
* }
|
|
100
102
|
*
|
|
103
|
+
* function OrderList({ items }: { items: ArrayNode<OrderItem> }) {
|
|
101
104
|
* return (
|
|
102
|
-
* <div
|
|
103
|
-
*
|
|
105
|
+
* <div>
|
|
106
|
+
* {items.map((item, index) => (
|
|
107
|
+
* <OrderRow key={index} item={item} />
|
|
108
|
+
* ))}
|
|
104
109
|
* </div>
|
|
105
110
|
* );
|
|
106
111
|
* }
|